From b2d4a55167e47bd7d42686670ae2555540b3de3e Mon Sep 17 00:00:00 2001
From: duheng <2784771470@qq.com>
Date: 星期五, 21 六月 2024 12:15:26 +0800
Subject: [PATCH] 增加扩展方法,增加编辑和删除功能

---
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ControlExtend.cs               |   32 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/ObjectType.cs         |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-文件帮助类/DataTabelToList.cs           |   48 
 HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModelMap.cs                          |   15 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/GridViewExtend.cs              |  573 ++++++++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ListBoxControlExtend.cs        |   13 
 HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModel.cs                             |   11 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/TilePeekItemsExtensions.cs     |   84 +
 HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModelMap.cs                         |  225 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageFunctionItem.cs   |    0 
 HStation.Service.Xhs.Core/05-service/02-projectItem/XhsProjectItem_Instance.cs         |    2 
 HStation.BLL.Xhs.Core/04-bll/02-projectItem/XhsProjectItem.cs                          |  172 ++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/DocumentPage.resx     |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/BandGridViewExtend.cs          |   23 
 HStation.Dto.Xhs.Core/01-project/AddXhsProjectInput.cs                                 |    5 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/GridContorlExtend.cs           |   57 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.cs                    |   24 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageDataSync.cs       |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/ProjectViewModel.cs                  |    6 
 HStation.Dto.Xhs.Core/01-project/UpdateXhsProjectInput.cs                              |   37 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.Designer.cs       |   23 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/SearchLookUpEditExtend.cs      |   29 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/DateEditExtend.cs              |   81 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/FormExtend.cs                  |   48 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj            |   30 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/MainForm.resx         |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageTitle.cs          |    0 
 HStation.Dto.Xhs.Core/01-project/XhsProjectDto.cs                                      |    6 
 HStation.Service.Xhs.Core/02-model/XhsProject.cs                                       |   10 
 HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModel.cs                             |   15 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/SurfaceGuid.cs        |    0 
 HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModelMap.cs                          |   11 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/TreeListExtend.cs              |  310 ++++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/LookUpEditExtend.cs            |   27 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/RibbonControlExtend.cs         |   21 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/XtraFormExtend.cs              |   14 
 HStation.BLL.Xhs.Core/04-bll/03-projectItemModel/XhsProjectItemModel.cs                |  172 ++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/MainForm.cs           |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/DocumentPage.cs       |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-文件帮助类/ExcelSaveFilePathHelper.cs   |   33 
 HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModel.cs                            |  279 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.cs                |   44 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/MessageBoxShow.cs              |   50 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/XtraChartHelper.cs             |   96 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ClassUpdateVailDataHelper.cs   |  102 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageMenu.cs           |    0 
 HStation.BLL.Xhs.Core/04-bll/03-projectItemModelMap/XhsProjectItemModelMap.cs          |  132 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.designer.cs           |  150 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj.user       |    7 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/DevHelper.cs                   |   42 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ExtensionsDev.cs               |  252 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/TokenEditExtend.cs             |   28 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/ePageDataOperation.cs |    0 
 HStation.Service.Xhs.Core/01-entity/XhsProject.cs                                      |    6 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ControlNavigatorExtend.cs      |   37 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/LayoutControlExtensions.cs     |   21 
 /dev/null                                                                              |  192 --
 HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItem.cs                                  |   15 
 HStation.BLL.Xhs.Core/03-localclient/XhsProjectItem.cs                                 |  279 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/TileControlExtensions.cs       |   60 
 HStation.BLL.Xhs.Core/01-interface/IXhsProjectItem.cs                                  |   11 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.designer.cs            |  111 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/TextEditExtend.cs              |   21 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ImageExtend.cs                 |   37 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-提示弹窗/MessageBoxHelper.cs           |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.cs                     |    4 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-扩展类/ButtonEditExtend.cs            |   65 
 67 files changed, 3,888 insertions(+), 310 deletions(-)

diff --git a/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItem.cs b/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItem.cs
new file mode 100644
index 0000000..0f787e3
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItem.cs
@@ -0,0 +1,11 @@
+锘縰sing Yw.CAL;
+
+namespace HStation.CAL
+{
+    /// <summary>
+    /// 鎶ヨ绛夌骇
+    /// </summary>
+    public interface IXhsProjectItem : IBaseCAL<AddXhsProjectItemInput, UpdateXhsProjectItemInput, XhsProjectItemDto>, IUpdateParas, IUpdateFlags, IUpdateTagName, IUpdateSorter, IUpdateUseStatus
+    {
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModel.cs b/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModel.cs
new file mode 100644
index 0000000..835341a
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModel.cs
@@ -0,0 +1,11 @@
+锘縰sing Yw.CAL;
+
+namespace HStation.CAL
+{
+    /// <summary>
+    /// 鎶ヨ绛夌骇
+    /// </summary>
+    public interface IXhsProjectItemModel : IBaseCAL<AddXhsProjectItemModelInput, UpdateXhsProjectItemModelInput, XhsProjectItemModelDto>, IUpdateParas, IUpdateFlags, IUpdateTagName, IUpdateSorter, IUpdateUseStatus
+    {
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModelMap.cs b/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModelMap.cs
new file mode 100644
index 0000000..1c9fe8c
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/01-interface/IXhsProjectItemModelMap.cs
@@ -0,0 +1,11 @@
+锘縰sing Yw.CAL;
+
+namespace HStation.CAL
+{
+    /// <summary>
+    /// 鎶ヨ绛夌骇
+    /// </summary>
+    public interface IXhsProjectItemModelMap : IBaseCAL<AddXhsProjectItemModelMapInput, UpdateXhsProjectItemModelMapInput, XhsProjectItemModelMapDto>, IUpdateUseStatus
+    {
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItem.cs b/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItem.cs
new file mode 100644
index 0000000..87243e3
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItem.cs
@@ -0,0 +1,15 @@
+锘縰sing Yw.CAL.HttpClient;
+
+namespace HStation.CAL.HttpClient
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public class XhsProjectItem : BaseCAL_Paras_Flags_TagName_Sorter_UseStatus<AddXhsProjectItemInput, UpdateXhsProjectItemInput, XhsProjectItemDto>, IXhsProjectItem
+    {
+        protected override string Prefix
+        {
+            get { return $"{HStation.BLL.Xhs.ConfigHelper.HttpUrl}/Xhs/Project/Item"; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModel.cs b/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModel.cs
new file mode 100644
index 0000000..3c50d80
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModel.cs
@@ -0,0 +1,15 @@
+锘縰sing Yw.CAL.HttpClient;
+
+namespace HStation.CAL.HttpClient
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public class XhsProjectItemModel : BaseCAL_Paras_Flags_TagName_Sorter_UseStatus<AddXhsProjectItemModelInput, UpdateXhsProjectItemModelInput, XhsProjectItemModelDto>, IXhsProjectItemModel
+    {
+        protected override string Prefix
+        {
+            get { return $"{HStation.BLL.Xhs.ConfigHelper.HttpUrl}/Xhs/Project/Item/Model"; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModelMap.cs b/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModelMap.cs
new file mode 100644
index 0000000..cc353b3
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/02-httpclient/XhsProjectItemModelMap.cs
@@ -0,0 +1,15 @@
+锘縰sing Yw.CAL.HttpClient;
+
+namespace HStation.CAL.HttpClient
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public class XhsProjectItemModelMap : BaseCAL_Paras_Flags_TagName_Sorter_UseStatus<AddXhsProjectItemModelMapInput, UpdateXhsProjectItemModelMapInput, XhsProjectItemModelMapDto>, IXhsProjectItemModelMap
+    {
+        protected override string Prefix
+        {
+            get { return $"{HStation.BLL.Xhs.ConfigHelper.HttpUrl}/Xhs/Project/Model/Map"; }
+        }
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItem.cs b/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItem.cs
new file mode 100644
index 0000000..c21e78f
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItem.cs
@@ -0,0 +1,279 @@
+锘縰sing HStation.Xhs;
+
+namespace HStation.CAL.LocalClient
+{
+    /// <summary>
+    /// 鎶ヨ绛夌骇
+    /// </summary>
+    public class XhsProjectItem : IXhsProjectItem
+    {
+        private readonly HStation.Service.XhsProjectItem _service = new();
+
+        #region Query
+
+        /// <summary>
+        /// 鑾峰彇鎵�鏈�
+        /// </summary>
+        public async Task<List<XhsProjectItemDto>> GetAll()
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = _service.GetAll();
+                var vm_list = list?.Select(x => new XhsProjectItemDto(x)).ToList();
+                return vm_list;
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 ID 鑾峰彇
+        /// </summary>
+        public async Task<XhsProjectItemDto> GetByID(long ID)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = _service.GetByID(ID);
+                return model == null ? null : new XhsProjectItemDto(model);
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 Ids 鑾峰彇
+        /// </summary>
+        public async Task<List<XhsProjectItemDto>> GetByIds(List<long> Ids)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = _service.GetByIds(Ids);
+                var vm_list = list?.Select(x => new XhsProjectItemDto(x)).ToList();
+                return vm_list;
+            });
+        }
+
+        #endregion Query
+
+        #region Insert
+
+        /// <summary>
+        /// 鎻掑叆涓�鏉�
+        /// </summary>
+        public async Task<long> Insert(AddXhsProjectItemInput input)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = input.Adapt<AddXhsProjectItemInput, Model.XhsProjectItem>();
+                model.SortCode = _service.GetMaxSortCode() + 1;
+                var id = _service.Insert(model);
+                return id;
+            });
+        }
+
+        /// <summary>
+        /// 鎵归噺鎻掑叆
+        /// </summary>
+        public async Task<bool> Inserts(List<AddXhsProjectItemInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = inputList.Select(x => x.Adapt<AddXhsProjectItemInput, Model.XhsProjectItem>()).ToList();
+                list.ForEach(x =>
+                {
+                    x.SortCode = _service.GetMaxSortCode() + 1 + list.IndexOf(x);
+                });
+                var bol = _service.Inserts(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�
+        /// </summary>
+        public async Task<bool> BulkInserts(List<AddXhsProjectItemInput> list)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        #endregion Insert
+
+        #region Update
+
+        /// <summary>
+        /// 鏇存柊涓�鏉�
+        /// </summary>
+        public async Task<bool> Update(UpdateXhsProjectItemInput input)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = _service.GetByID(input.ID);
+                if (model == null)
+                {
+                    throw YOops.Oh(eResultCode.Alert, InternalErrorCodes.D001, $"ID:{input.ID} 鏁版嵁涓嶅瓨鍦�");
+                }
+
+                var rhs = new Model.XhsProjectItem(model);
+                input.Adapt(rhs);
+                var bol = _service.Update(rhs);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鎵归噺鏇存柊
+        /// </summary>
+        public async Task<bool> Updates(List<UpdateXhsProjectItemInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                if (inputList == null || inputList.Count < 1)
+                {
+                    return false;
+                }
+                var list = inputList.Select(x => x.Adapt<UpdateXhsProjectItemInput, Model.XhsProjectItem>()).ToList();
+                var bol = _service.Updates(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔洿鏂�
+        /// </summary>
+        public async Task<bool> BulkUpdates(List<UpdateXhsProjectItemInput> list)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊缂栫爜
+        /// </summary>
+        public async Task<bool> UpdateCode(long ID, string Code)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊鎺掑簭鐮�
+        /// </summary>
+        public async Task<bool> UpdateSortCode(long ID, int SortCode)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateSortCode(ID, SortCode);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊鎺掑簭
+        /// </summary>
+        public async Task<bool> UpdateSorter(List<UpdateSortCodeInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = inputList.Select(x => x.Adapt<Yw.Model.Sorter>()).ToList();
+                var bol = _service.UpdateSorter(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 Paras
+        /// </summary>
+        public async Task<bool> UpdateParas(long ID, Dictionary<string, string> Paras)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateParas(ID, Paras);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 Flags
+        /// </summary>
+        public async Task<bool> UpdateFlags(long ID, List<string> Flags)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateFlags(ID, Flags);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 TagName
+        /// </summary>
+        public async Task<bool> UpdateTagName(long ID, string TagName)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateTagName(ID, TagName);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 UseStatus
+        /// </summary>
+        public async Task<bool> UpdateUseStatus(long ID, int UseStatus)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateUseStatus(ID, (Yw.Model.eUseStatus)UseStatus);
+                return bol;
+            });
+        }
+
+        #endregion Update
+
+        #region Delete
+
+        /// <summary>
+        /// 閫氳繃 ID 鍒犻櫎
+        /// </summary>
+        public async Task<bool> DeleteByID(long ID)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.DeleteByID(ID, out string msg);
+                if (!bol)
+                {
+                    throw YOops.Oh(eResultCode.Alert, InternalErrorCodes.D999, msg);
+                }
+                return true;
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 Ids 鍒犻櫎
+        /// </summary>
+        public async Task<bool> DeleteByIds(List<long> Ids)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鍏ㄩ儴
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> DeleteAll()
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        #endregion Delete
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModel.cs b/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModel.cs
new file mode 100644
index 0000000..3870a06
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModel.cs
@@ -0,0 +1,279 @@
+锘縰sing HStation.Xhs;
+
+namespace HStation.CAL.LocalClient
+{
+    /// <summary>
+    /// 鎶ヨ绛夌骇
+    /// </summary>
+    public class XhsProjectItemModel : IXhsProjectItemModel
+    {
+        private readonly HStation.Service.XhsProjectItemModel _service = new();
+
+        #region Query
+
+        /// <summary>
+        /// 鑾峰彇鎵�鏈�
+        /// </summary>
+        public async Task<List<XhsProjectItemModelDto>> GetAll()
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = _service.GetAll();
+                var vm_list = list?.Select(x => new XhsProjectItemModelDto(x)).ToList();
+                return vm_list;
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 ID 鑾峰彇
+        /// </summary>
+        public async Task<XhsProjectItemModelDto> GetByID(long ID)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = _service.GetByID(ID);
+                return model == null ? null : new XhsProjectItemModelDto(model);
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 Ids 鑾峰彇
+        /// </summary>
+        public async Task<List<XhsProjectItemModelDto>> GetByIds(List<long> Ids)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = _service.GetByIds(Ids);
+                var vm_list = list?.Select(x => new XhsProjectItemModelDto(x)).ToList();
+                return vm_list;
+            });
+        }
+
+        #endregion Query
+
+        #region Insert
+
+        /// <summary>
+        /// 鎻掑叆涓�鏉�
+        /// </summary>
+        public async Task<long> Insert(AddXhsProjectItemModelInput input)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = input.Adapt<AddXhsProjectItemModelInput, Model.XhsProjectItemModel>();
+                model.SortCode = _service.GetMaxSortCode() + 1;
+                var id = _service.Insert(model);
+                return id;
+            });
+        }
+
+        /// <summary>
+        /// 鎵归噺鎻掑叆
+        /// </summary>
+        public async Task<bool> Inserts(List<AddXhsProjectItemModelInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = inputList.Select(x => x.Adapt<AddXhsProjectItemModelInput, Model.XhsProjectItemModel>()).ToList();
+                list.ForEach(x =>
+                {
+                    x.SortCode = _service.GetMaxSortCode() + 1 + list.IndexOf(x);
+                });
+                var bol = _service.Inserts(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�
+        /// </summary>
+        public async Task<bool> BulkInserts(List<AddXhsProjectItemModelInput> list)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        #endregion Insert
+
+        #region Update
+
+        /// <summary>
+        /// 鏇存柊涓�鏉�
+        /// </summary>
+        public async Task<bool> Update(UpdateXhsProjectItemModelInput input)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = _service.GetByID(input.ID);
+                if (model == null)
+                {
+                    throw YOops.Oh(eResultCode.Alert, InternalErrorCodes.D001, $"ID:{input.ID} 鏁版嵁涓嶅瓨鍦�");
+                }
+
+                var rhs = new Model.XhsProjectItemModel(model);
+                input.Adapt(rhs);
+                var bol = _service.Update(rhs);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鎵归噺鏇存柊
+        /// </summary>
+        public async Task<bool> Updates(List<UpdateXhsProjectItemModelInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                if (inputList == null || inputList.Count < 1)
+                {
+                    return false;
+                }
+                var list = inputList.Select(x => x.Adapt<UpdateXhsProjectItemModelInput, Model.XhsProjectItemModel>()).ToList();
+                var bol = _service.Updates(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔洿鏂�
+        /// </summary>
+        public async Task<bool> BulkUpdates(List<UpdateXhsProjectItemModelInput> list)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊缂栫爜
+        /// </summary>
+        public async Task<bool> UpdateCode(long ID, string Code)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊鎺掑簭鐮�
+        /// </summary>
+        public async Task<bool> UpdateSortCode(long ID, int SortCode)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateSortCode(ID, SortCode);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊鎺掑簭
+        /// </summary>
+        public async Task<bool> UpdateSorter(List<UpdateSortCodeInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = inputList.Select(x => x.Adapt<Yw.Model.Sorter>()).ToList();
+                var bol = _service.UpdateSorter(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 Paras
+        /// </summary>
+        public async Task<bool> UpdateParas(long ID, Dictionary<string, string> Paras)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateParas(ID, Paras);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 Flags
+        /// </summary>
+        public async Task<bool> UpdateFlags(long ID, List<string> Flags)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateFlags(ID, Flags);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 TagName
+        /// </summary>
+        public async Task<bool> UpdateTagName(long ID, string TagName)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateTagName(ID, TagName);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 UseStatus
+        /// </summary>
+        public async Task<bool> UpdateUseStatus(long ID, int UseStatus)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateUseStatus(ID, (Yw.Model.eUseStatus)UseStatus);
+                return bol;
+            });
+        }
+
+        #endregion Update
+
+        #region Delete
+
+        /// <summary>
+        /// 閫氳繃 ID 鍒犻櫎
+        /// </summary>
+        public async Task<bool> DeleteByID(long ID)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.DeleteByID(ID, out string msg);
+                if (!bol)
+                {
+                    throw YOops.Oh(eResultCode.Alert, InternalErrorCodes.D999, msg);
+                }
+                return true;
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 Ids 鍒犻櫎
+        /// </summary>
+        public async Task<bool> DeleteByIds(List<long> Ids)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鍏ㄩ儴
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> DeleteAll()
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        #endregion Delete
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModelMap.cs b/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModelMap.cs
new file mode 100644
index 0000000..2e54218
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/03-localclient/XhsProjectItemModelMap.cs
@@ -0,0 +1,225 @@
+锘縰sing HStation.Xhs;
+
+namespace HStation.CAL.LocalClient
+{
+    /// <summary>
+    /// 鎶ヨ绛夌骇
+    /// </summary>
+    public class XhsProjectItemModelMap : IXhsProjectItemModelMap
+    {
+        private readonly HStation.Service.XhsProjectItemModelMap _service = new();
+
+        #region Query
+
+        /// <summary>
+        /// 鑾峰彇鎵�鏈�
+        /// </summary>
+        public async Task<List<XhsProjectItemModelMapDto>> GetAll()
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = _service.GetAll();
+                var vm_list = list?.Select(x => new XhsProjectItemModelMapDto(x)).ToList();
+                return vm_list;
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 ID 鑾峰彇
+        /// </summary>
+        public async Task<XhsProjectItemModelMapDto> GetByID(long ID)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = _service.GetByID(ID);
+                return model == null ? null : new XhsProjectItemModelMapDto(model);
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 Ids 鑾峰彇
+        /// </summary>
+        public async Task<List<XhsProjectItemModelMapDto>> GetByIds(List<long> Ids)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = _service.GetByIds(Ids);
+                var vm_list = list?.Select(x => new XhsProjectItemModelMapDto(x)).ToList();
+                return vm_list;
+            });
+        }
+
+        #endregion Query
+
+        #region Insert
+
+        /// <summary>
+        /// 鎻掑叆涓�鏉�
+        /// </summary>
+        public async Task<long> Insert(AddXhsProjectItemModelMapInput input)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = input.Adapt<AddXhsProjectItemModelMapInput, Model.XhsProjectItemModelMap>();
+                var id = _service.Insert(model);
+                return id;
+            });
+        }
+
+        /// <summary>
+        /// 鎵归噺鎻掑叆
+        /// </summary>
+        public async Task<bool> Inserts(List<AddXhsProjectItemModelMapInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var list = inputList.Select(x => x.Adapt<AddXhsProjectItemModelMapInput, Model.XhsProjectItemModelMap>()).ToList();
+                var bol = _service.Inserts(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔彃鍏�
+        /// </summary>
+        public async Task<bool> BulkInserts(List<AddXhsProjectItemModelMapInput> list)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        #endregion Insert
+
+        #region Update
+
+        /// <summary>
+        /// 鏇存柊涓�鏉�
+        /// </summary>
+        public async Task<bool> Update(UpdateXhsProjectItemModelMapInput input)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var model = _service.GetByID(input.ID);
+                if (model == null)
+                {
+                    throw YOops.Oh(eResultCode.Alert, InternalErrorCodes.D001, $"ID:{input.ID} 鏁版嵁涓嶅瓨鍦�");
+                }
+
+                var rhs = new Model.XhsProjectItemModelMap(model);
+                input.Adapt(rhs);
+                var bol = _service.Update(rhs);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鎵归噺鏇存柊
+        /// </summary>
+        public async Task<bool> Updates(List<UpdateXhsProjectItemModelMapInput> inputList)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                if (inputList == null || inputList.Count < 1)
+                {
+                    return false;
+                }
+                var list = inputList.Select(x => x.Adapt<UpdateXhsProjectItemModelMapInput, Model.XhsProjectItemModelMap>()).ToList();
+                var bol = _service.Updates(list);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 澶ф壒閲忔洿鏂�
+        /// </summary>
+        public async Task<bool> BulkUpdates(List<UpdateXhsProjectItemModelMapInput> list)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊缂栫爜
+        /// </summary>
+        public async Task<bool> UpdateCode(long ID, string Code)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 Flags
+        /// </summary>
+        public async Task<bool> UpdateFlags(long ID, List<string> Flags)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateFlags(ID, Flags);
+                return bol;
+            });
+        }
+
+        /// <summary>
+        /// 鏇存柊 UseStatus
+        /// </summary>
+        public async Task<bool> UpdateUseStatus(long ID, int UseStatus)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.UpdateUseStatus(ID, (Yw.Model.eUseStatus)UseStatus);
+                return bol;
+            });
+        }
+
+        #endregion Update
+
+        #region Delete
+
+        /// <summary>
+        /// 閫氳繃 ID 鍒犻櫎
+        /// </summary>
+        public async Task<bool> DeleteByID(long ID)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                var bol = _service.DeleteByID(ID, out string msg);
+                if (!bol)
+                {
+                    throw YOops.Oh(eResultCode.Alert, InternalErrorCodes.D999, msg);
+                }
+                return true;
+            });
+        }
+
+        /// <summary>
+        /// 閫氳繃 Ids 鍒犻櫎
+        /// </summary>
+        public async Task<bool> DeleteByIds(List<long> Ids)
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鍏ㄩ儴
+        /// </summary>
+        /// <returns></returns>
+        public async Task<bool> DeleteAll()
+        {
+            return await Task.Factory.StartNew(() =>
+            {
+                return false;
+            });
+        }
+
+        #endregion Delete
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/04-bll/02-projectItem/XhsProjectItem.cs b/HStation.BLL.Xhs.Core/04-bll/02-projectItem/XhsProjectItem.cs
new file mode 100644
index 0000000..51ef252
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/04-bll/02-projectItem/XhsProjectItem.cs
@@ -0,0 +1,172 @@
+锘縰sing HStation.CAL;
+
+namespace HStation.BLL
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public class XhsProjectItem : IXhsProjectItem
+    {
+        private readonly HStation.CAL.IXhsProjectItem _cal = CALCreateHelper.CreateCAL<HStation.CAL.IXhsProjectItem>();
+
+        #region Query
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<List<XhsProjectItemDto>> GetAll()
+        {
+            return await _cal.GetAll();
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<XhsProjectItemDto> GetByID(long ID)
+        {
+            return await _cal.GetByID(ID);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<List<XhsProjectItemDto>> GetByIds(List<long> Ids)
+        {
+            return await _cal.GetByIds(Ids);
+        }
+
+        #endregion Query
+
+        #region Insert
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<long> Insert(AddXhsProjectItemInput model)
+        {
+            return await _cal.Insert(model);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Inserts(List<AddXhsProjectItemInput> list)
+        {
+            return await _cal.Inserts(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> BulkInserts(List<AddXhsProjectItemInput> list)
+        {
+            return await _cal.BulkInserts(list);
+        }
+
+        #endregion Insert
+
+        #region Update
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Update(UpdateXhsProjectItemInput model)
+        {
+            return await _cal.Update(model);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Updates(List<UpdateXhsProjectItemInput> list)
+        {
+            return await _cal.Updates(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> BulkUpdates(List<UpdateXhsProjectItemInput> list)
+        {
+            return await _cal.BulkUpdates(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> UpdateSortCode(long ID, int SortCode)
+        {
+            return await _cal.UpdateSortCode(ID, SortCode);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> UpdateSorter(List<UpdateSortCodeInput> Sorters)
+        {
+            return await _cal.UpdateSorter(Sorters);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateParas(long ID, Dictionary<string, string> Paras)
+        {
+            return _cal.UpdateParas(ID, Paras);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateFlags(long ID, List<string> Flags)
+        {
+            return _cal.UpdateFlags(ID, Flags);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateTagName(long ID, string TagName)
+        {
+            return _cal.UpdateTagName(ID, TagName);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateUseStatus(long ID, int UseStatus)
+        {
+            return _cal.UpdateUseStatus(ID, UseStatus);
+        }
+
+        #endregion Update
+
+        #region Delete
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteByID(long ID)
+        {
+            return await _cal.DeleteByID(ID);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteByIds(List<long> Ids)
+        {
+            return await _cal.DeleteByIds(Ids);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteAll()
+        {
+            return await _cal.DeleteAll();
+        }
+
+        #endregion Delete
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/04-bll/03-projectItemModel/XhsProjectItemModel.cs b/HStation.BLL.Xhs.Core/04-bll/03-projectItemModel/XhsProjectItemModel.cs
new file mode 100644
index 0000000..2e47521
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/04-bll/03-projectItemModel/XhsProjectItemModel.cs
@@ -0,0 +1,172 @@
+锘縰sing HStation.CAL;
+
+namespace HStation.BLL
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public class XhsProjectItemModel : IXhsProjectItemModel
+    {
+        private readonly HStation.CAL.IXhsProjectItemModel _cal = CALCreateHelper.CreateCAL<HStation.CAL.IXhsProjectItemModel>();
+
+        #region Query
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<List<XhsProjectItemModelDto>> GetAll()
+        {
+            return await _cal.GetAll();
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<XhsProjectItemModelDto> GetByID(long ID)
+        {
+            return await _cal.GetByID(ID);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<List<XhsProjectItemModelDto>> GetByIds(List<long> Ids)
+        {
+            return await _cal.GetByIds(Ids);
+        }
+
+        #endregion Query
+
+        #region Insert
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<long> Insert(AddXhsProjectItemModelInput model)
+        {
+            return await _cal.Insert(model);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Inserts(List<AddXhsProjectItemModelInput> list)
+        {
+            return await _cal.Inserts(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> BulkInserts(List<AddXhsProjectItemModelInput> list)
+        {
+            return await _cal.BulkInserts(list);
+        }
+
+        #endregion Insert
+
+        #region Update
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Update(UpdateXhsProjectItemModelInput model)
+        {
+            return await _cal.Update(model);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Updates(List<UpdateXhsProjectItemModelInput> list)
+        {
+            return await _cal.Updates(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> BulkUpdates(List<UpdateXhsProjectItemModelInput> list)
+        {
+            return await _cal.BulkUpdates(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> UpdateSortCode(long ID, int SortCode)
+        {
+            return await _cal.UpdateSortCode(ID, SortCode);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> UpdateSorter(List<UpdateSortCodeInput> Sorters)
+        {
+            return await _cal.UpdateSorter(Sorters);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateParas(long ID, Dictionary<string, string> Paras)
+        {
+            return _cal.UpdateParas(ID, Paras);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateFlags(long ID, List<string> Flags)
+        {
+            return _cal.UpdateFlags(ID, Flags);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateTagName(long ID, string TagName)
+        {
+            return _cal.UpdateTagName(ID, TagName);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateUseStatus(long ID, int UseStatus)
+        {
+            return _cal.UpdateUseStatus(ID, UseStatus);
+        }
+
+        #endregion Update
+
+        #region Delete
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteByID(long ID)
+        {
+            return await _cal.DeleteByID(ID);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteByIds(List<long> Ids)
+        {
+            return await _cal.DeleteByIds(Ids);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteAll()
+        {
+            return await _cal.DeleteAll();
+        }
+
+        #endregion Delete
+    }
+}
\ No newline at end of file
diff --git a/HStation.BLL.Xhs.Core/04-bll/03-projectItemModelMap/XhsProjectItemModelMap.cs b/HStation.BLL.Xhs.Core/04-bll/03-projectItemModelMap/XhsProjectItemModelMap.cs
new file mode 100644
index 0000000..1f15461
--- /dev/null
+++ b/HStation.BLL.Xhs.Core/04-bll/03-projectItemModelMap/XhsProjectItemModelMap.cs
@@ -0,0 +1,132 @@
+锘縰sing HStation.CAL;
+
+namespace HStation.BLL
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public class XhsProjectItemModelMap : IXhsProjectItemModelMap
+    {
+        private readonly HStation.CAL.IXhsProjectItemModelMap _cal = CALCreateHelper.CreateCAL<HStation.CAL.IXhsProjectItemModelMap>();
+
+        #region Query
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<List<XhsProjectItemModelMapDto>> GetAll()
+        {
+            return await _cal.GetAll();
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<XhsProjectItemModelMapDto> GetByID(long ID)
+        {
+            return await _cal.GetByID(ID);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<List<XhsProjectItemModelMapDto>> GetByIds(List<long> Ids)
+        {
+            return await _cal.GetByIds(Ids);
+        }
+
+        #endregion Query
+
+        #region Insert
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<long> Insert(AddXhsProjectItemModelMapInput model)
+        {
+            return await _cal.Insert(model);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Inserts(List<AddXhsProjectItemModelMapInput> list)
+        {
+            return await _cal.Inserts(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> BulkInserts(List<AddXhsProjectItemModelMapInput> list)
+        {
+            return await _cal.BulkInserts(list);
+        }
+
+        #endregion Insert
+
+        #region Update
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Update(UpdateXhsProjectItemModelMapInput model)
+        {
+            return await _cal.Update(model);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> Updates(List<UpdateXhsProjectItemModelMapInput> list)
+        {
+            return await _cal.Updates(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> BulkUpdates(List<UpdateXhsProjectItemModelMapInput> list)
+        {
+            return await _cal.BulkUpdates(list);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public Task<bool> UpdateUseStatus(long ID, int UseStatus)
+        {
+            return _cal.UpdateUseStatus(ID, UseStatus);
+        }
+
+        #endregion Update
+
+        #region Delete
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteByID(long ID)
+        {
+            return await _cal.DeleteByID(ID);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteByIds(List<long> Ids)
+        {
+            return await _cal.DeleteByIds(Ids);
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public async Task<bool> DeleteAll()
+        {
+            return await _cal.DeleteAll();
+        }
+
+        #endregion Delete
+    }
+}
\ No newline at end of file
diff --git a/HStation.Dto.Xhs.Core/01-project/AddXhsProjectInput.cs b/HStation.Dto.Xhs.Core/01-project/AddXhsProjectInput.cs
index c57ae10..db3e6af 100644
--- a/HStation.Dto.Xhs.Core/01-project/AddXhsProjectInput.cs
+++ b/HStation.Dto.Xhs.Core/01-project/AddXhsProjectInput.cs
@@ -46,6 +46,11 @@
         public string MapPosition { get; set; }
 
         /// <summary>
+        /// 椤圭洰璇︾粏鍦板潃
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
         /// 椤圭洰鐨勫鎴峰悕绉�
         /// </summary>
         public string CustomerName { get; set; }
diff --git a/HStation.Dto.Xhs.Core/01-project/UpdateXhsProjectInput.cs b/HStation.Dto.Xhs.Core/01-project/UpdateXhsProjectInput.cs
index 62d0196..455bf22 100644
--- a/HStation.Dto.Xhs.Core/01-project/UpdateXhsProjectInput.cs
+++ b/HStation.Dto.Xhs.Core/01-project/UpdateXhsProjectInput.cs
@@ -1,7 +1,7 @@
 锘縩amespace Yw.Dto
 {
     /// <summary>
-    /// 
+    ///
     /// </summary>
     public class UpdateXhsProjectInput
     {
@@ -14,7 +14,6 @@
         /// <summary>
         /// 鍚嶇О
         /// </summary>
-        [Required]
         public string Name { get; set; }
 
         /// <summary>
@@ -33,8 +32,38 @@
         public string TagName { get; set; }
 
         /// <summary>
+        /// 鍒涘缓浜�
+        /// </summary>
+        public long CreateUserID { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        public DateTime CreateTime { get; set; }
+
+        /// <summary>
+        /// 鐗堟湰
+        /// </summary>
+        public int Version { get; set; }
+
+        /// <summary>
+        /// 椤圭洰鍦板潃(缁忓害,缁村害)
+        /// </summary>
+        public string MapPosition { get; set; }
+
+        /// <summary>
+        /// 椤圭洰璇︾粏鍦板潃
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
+        /// 椤圭洰鐨勫鎴峰悕绉�
+        /// </summary>
+        public string CustomerName { get; set; }
+
+        /// <summary>
         /// 璇存槑
-        /// </summary>	
+        /// </summary>
         public string Description { get; set; }
     }
-}
+}
\ No newline at end of file
diff --git a/HStation.Dto.Xhs.Core/01-project/XhsProjectDto.cs b/HStation.Dto.Xhs.Core/01-project/XhsProjectDto.cs
index bb9c7b8..e1b481f 100644
--- a/HStation.Dto.Xhs.Core/01-project/XhsProjectDto.cs
+++ b/HStation.Dto.Xhs.Core/01-project/XhsProjectDto.cs
@@ -28,6 +28,7 @@
             this.CreateTime = rhs.CreateTime;
             this.CreateUserID = rhs.CreateUserID;
             this.Version = rhs.Version;
+            this.Address = rhs.Address;
             this.MapPosition = rhs.MapPosition;
         }
 
@@ -97,6 +98,11 @@
         public string MapPosition { get; set; }
 
         /// <summary>
+        /// 椤圭洰璇︾粏鍦板潃
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
         /// 椤圭洰鐨勫鎴峰悕绉�
         /// </summary>
         public string CustomerName { get; set; }
diff --git a/HStation.Service.Xhs.Core/01-entity/XhsProject.cs b/HStation.Service.Xhs.Core/01-entity/XhsProject.cs
index 2f56745..7cce978 100644
--- a/HStation.Service.Xhs.Core/01-entity/XhsProject.cs
+++ b/HStation.Service.Xhs.Core/01-entity/XhsProject.cs
@@ -21,6 +21,7 @@
         public XhsProject(XhsProject rhs) : base(rhs)
         {
             this.GID = rhs.GID;
+            this.ID = rhs.ID;
             this.Name = rhs.Name;
             this.Paras = rhs.Paras;
             this.Flags = rhs.Flags;
@@ -95,6 +96,11 @@
         public string MapPosition { get; set; }
 
         /// <summary>
+        /// 椤圭洰璇︾粏鍦板潃
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
         /// 椤圭洰鐨勫鎴峰悕绉�
         /// </summary>
         public string CustomerName { get; set; }
diff --git a/HStation.Service.Xhs.Core/02-model/XhsProject.cs b/HStation.Service.Xhs.Core/02-model/XhsProject.cs
index 69a0f0e..e7f3a26 100644
--- a/HStation.Service.Xhs.Core/02-model/XhsProject.cs
+++ b/HStation.Service.Xhs.Core/02-model/XhsProject.cs
@@ -26,6 +26,7 @@
             this.TagName = rhs.TagName;
             this.UseStatus = rhs.UseStatus;
             this.SortCode = rhs.SortCode;
+            this.Address = rhs.Address;
             this.Description = rhs.Description;
         }
 
@@ -34,7 +35,7 @@
         /// </summary>
         public void Reset(XhsProject rhs)
         {
-             this.ID = rhs.ID;
+            this.ID = rhs.ID;
             this.Name = rhs.Name;
             this.Paras = rhs.Paras == null ? null : new Dictionary<string, string>(rhs.Paras);
             this.Flags = rhs.Flags?.ToList();
@@ -42,13 +43,13 @@
             this.UseStatus = rhs.UseStatus;
             this.SortCode = rhs.SortCode;
             this.Description = rhs.Description;
+            this.Address = rhs.Address;
         }
 
         /// <summary>
         /// GUID 鐢ㄤ簬鍗囩骇
         /// </summary>
         public string GID { get; set; }
-
 
         /// <summary>
         /// 鍚嶇О
@@ -106,6 +107,11 @@
         public string MapPosition { get; set; }
 
         /// <summary>
+        /// 椤圭洰璇︾粏鍦板潃
+        /// </summary>
+        public string Address { get; set; }
+
+        /// <summary>
         /// 椤圭洰鐨勫鎴峰悕绉�
         /// </summary>
         public string CustomerName { get; set; }
diff --git a/HStation.Service.Xhs.Core/05-service/02-projectItem/XhsProjectItem_Instance.cs b/HStation.Service.Xhs.Core/05-service/02-projectItem/XhsProjectItem_Instance.cs
index 9a96360..29b3e6b 100644
--- a/HStation.Service.Xhs.Core/05-service/02-projectItem/XhsProjectItem_Instance.cs
+++ b/HStation.Service.Xhs.Core/05-service/02-projectItem/XhsProjectItem_Instance.cs
@@ -7,7 +7,7 @@
         {
             if (entity == null)
                 return default;
-            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.XhsProjectItem, Model.XhsProject>()
+            var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Entity.XhsProjectItem, Model.XhsProjectItem>()
             .ForMember(d => d.Paras, opt => opt.MapFrom(src => ParasHelper.ToDictionary(src.Paras)))
             .ForMember(d => d.Flags, opt => opt.MapFrom(src => FlagsHelper.ToList(src.Flags)))
             ).CreateMapper();
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.cs
index efb1ed0..e056b89 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.cs
@@ -63,5 +63,9 @@
         private void AddProjectDlg_Load(object sender, EventArgs e)
         {
         }
+
+        private void webView21_WebMessageReceived(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs e)
+        {
+        }
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.designer.cs
index 06245f4..0525a1f 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/AddProjectDlg.designer.cs
@@ -43,6 +43,8 @@
             DescriptionTextEdit = new MemoEdit();
             ModleTextEdit = new TextEdit();
             CustomerNameTextEdit = new TextEdit();
+            BtnFileChoice = new ButtonEdit();
+            TagName = new TextEdit();
             Root = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
             ItemForName = new DevExpress.XtraLayout.LayoutControlItem();
@@ -57,10 +59,10 @@
             ItemForConstructionYear = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
             ItemForTagName = new DevExpress.XtraLayout.LayoutControlItem();
-            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
-            BtnFileChoice = new ButtonEdit();
-            TagName = new TextEdit();
             layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
+            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
+            AddressTextEdit = new TextEdit();
+            layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
             ((ISupportInitialize)dataLayoutControl1).BeginInit();
             dataLayoutControl1.SuspendLayout();
             ((ISupportInitialize)webView21).BeginInit();
@@ -68,6 +70,8 @@
             ((ISupportInitialize)DescriptionTextEdit.Properties).BeginInit();
             ((ISupportInitialize)ModleTextEdit.Properties).BeginInit();
             ((ISupportInitialize)CustomerNameTextEdit.Properties).BeginInit();
+            ((ISupportInitialize)BtnFileChoice.Properties).BeginInit();
+            ((ISupportInitialize)TagName.Properties).BeginInit();
             ((ISupportInitialize)Root).BeginInit();
             ((ISupportInitialize)layoutControlGroup1).BeginInit();
             ((ISupportInitialize)ItemForName).BeginInit();
@@ -82,10 +86,10 @@
             ((ISupportInitialize)ItemForConstructionYear).BeginInit();
             ((ISupportInitialize)layoutControlItem5).BeginInit();
             ((ISupportInitialize)ItemForTagName).BeginInit();
-            ((ISupportInitialize)dxErrorProvider1).BeginInit();
-            ((ISupportInitialize)BtnFileChoice.Properties).BeginInit();
-            ((ISupportInitialize)TagName.Properties).BeginInit();
             ((ISupportInitialize)layoutControlItem4).BeginInit();
+            ((ISupportInitialize)dxErrorProvider1).BeginInit();
+            ((ISupportInitialize)AddressTextEdit.Properties).BeginInit();
+            ((ISupportInitialize)layoutControlItem6).BeginInit();
             SuspendLayout();
             // 
             // dataLayoutControl1
@@ -99,6 +103,7 @@
             dataLayoutControl1.Controls.Add(CustomerNameTextEdit);
             dataLayoutControl1.Controls.Add(BtnFileChoice);
             dataLayoutControl1.Controls.Add(TagName);
+            dataLayoutControl1.Controls.Add(AddressTextEdit);
             dataLayoutControl1.Dock = DockStyle.Fill;
             dataLayoutControl1.Location = new Point(0, 0);
             dataLayoutControl1.Name = "dataLayoutControl1";
@@ -113,11 +118,12 @@
             webView21.AllowExternalDrop = true;
             webView21.CreationProperties = null;
             webView21.DefaultBackgroundColor = Color.White;
-            webView21.Location = new Point(24, 120);
+            webView21.Location = new Point(24, 144);
             webView21.Name = "webView21";
-            webView21.Size = new Size(661, 273);
+            webView21.Size = new Size(661, 249);
             webView21.TabIndex = 15;
             webView21.ZoomFactor = 1D;
+            webView21.WebMessageReceived += webView21_WebMessageReceived;
             // 
             // btnOk
             // 
@@ -153,9 +159,9 @@
             // 
             // DescriptionTextEdit
             // 
-            DescriptionTextEdit.Location = new Point(22, 118);
+            DescriptionTextEdit.Location = new Point(22, 142);
             DescriptionTextEdit.Name = "DescriptionTextEdit";
-            DescriptionTextEdit.Size = new Size(665, 277);
+            DescriptionTextEdit.Size = new Size(665, 253);
             DescriptionTextEdit.StyleController = dataLayoutControl1;
             DescriptionTextEdit.TabIndex = 6;
             // 
@@ -176,6 +182,24 @@
             CustomerNameTextEdit.StyleController = dataLayoutControl1;
             CustomerNameTextEdit.TabIndex = 14;
             // 
+            // BtnFileChoice
+            // 
+            BtnFileChoice.Location = new Point(76, 36);
+            BtnFileChoice.Margin = new Padding(2);
+            BtnFileChoice.Name = "BtnFileChoice";
+            BtnFileChoice.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton() });
+            BtnFileChoice.Size = new Size(276, 20);
+            BtnFileChoice.StyleController = dataLayoutControl1;
+            BtnFileChoice.TabIndex = 11;
+            // 
+            // TagName
+            // 
+            TagName.Location = new Point(420, 36);
+            TagName.Name = "TagName";
+            TagName.Size = new Size(277, 20);
+            TagName.StyleController = dataLayoutControl1;
+            TagName.TabIndex = 16;
+            // 
             // Root
             // 
             Root.AppearanceItemCaption.Options.UseTextOptions = true;
@@ -191,7 +215,7 @@
             // 
             layoutControlGroup1.AllowDrawBackground = false;
             layoutControlGroup1.GroupBordersVisible = false;
-            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { ItemForName, layoutControlItem1, layoutControlItem2, emptySpaceItem1, tabbedControlGroup1, ItemForConstructionYear, layoutControlItem5, ItemForTagName, layoutControlItem4 });
+            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { ItemForName, layoutControlItem1, layoutControlItem2, emptySpaceItem1, tabbedControlGroup1, ItemForConstructionYear, layoutControlItem5, ItemForTagName, layoutControlItem4, layoutControlItem6 });
             layoutControlGroup1.Location = new Point(0, 0);
             layoutControlGroup1.Name = "autoGeneratedGroup0";
             layoutControlGroup1.Size = new Size(689, 420);
@@ -243,10 +267,10 @@
             tabbedControlGroup1.AppearanceTabPage.Header.Options.UseTextOptions = true;
             tabbedControlGroup1.AppearanceTabPage.Header.TextOptions.HAlignment = HorzAlignment.Center;
             tabbedControlGroup1.HeaderAutoFill = DefaultBoolean.True;
-            tabbedControlGroup1.Location = new Point(0, 72);
+            tabbedControlGroup1.Location = new Point(0, 96);
             tabbedControlGroup1.Name = "tabbedControlGroup1";
             tabbedControlGroup1.SelectedTabPage = layoutControlGroup2;
-            tabbedControlGroup1.Size = new Size(689, 325);
+            tabbedControlGroup1.Size = new Size(689, 301);
             tabbedControlGroup1.TabPages.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup2, layoutControlGroup3 });
             // 
             // layoutControlGroup2
@@ -255,7 +279,7 @@
             layoutControlGroup2.Location = new Point(0, 0);
             layoutControlGroup2.Name = "layoutControlGroup2";
             layoutControlGroup2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup2.Size = new Size(665, 277);
+            layoutControlGroup2.Size = new Size(665, 253);
             layoutControlGroup2.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
             layoutControlGroup2.Text = "鍦板浘鍧愭爣";
             // 
@@ -264,7 +288,7 @@
             layoutControlItem3.Control = webView21;
             layoutControlItem3.Location = new Point(0, 0);
             layoutControlItem3.Name = "layoutControlItem3";
-            layoutControlItem3.Size = new Size(665, 277);
+            layoutControlItem3.Size = new Size(665, 253);
             layoutControlItem3.TextSize = new Size(0, 0);
             layoutControlItem3.TextVisible = false;
             // 
@@ -273,7 +297,7 @@
             layoutControlGroup3.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { ItemForDescription });
             layoutControlGroup3.Location = new Point(0, 0);
             layoutControlGroup3.Name = "layoutControlGroup3";
-            layoutControlGroup3.Size = new Size(665, 277);
+            layoutControlGroup3.Size = new Size(665, 253);
             layoutControlGroup3.Text = "璇存槑";
             // 
             // ItemForDescription
@@ -282,7 +306,7 @@
             ItemForDescription.Location = new Point(0, 0);
             ItemForDescription.Name = "ItemForDescription";
             ItemForDescription.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            ItemForDescription.Size = new Size(665, 277);
+            ItemForDescription.Size = new Size(665, 253);
             ItemForDescription.Text = "璇存槑:";
             ItemForDescription.TextSize = new Size(0, 0);
             ItemForDescription.TextVisible = false;
@@ -316,28 +340,6 @@
             ItemForTagName.Text = "涓夌淮妯″瀷:";
             ItemForTagName.TextSize = new Size(52, 14);
             // 
-            // dxErrorProvider1
-            // 
-            dxErrorProvider1.ContainerControl = this;
-            // 
-            // BtnFileChoice
-            // 
-            BtnFileChoice.Location = new Point(76, 36);
-            BtnFileChoice.Margin = new Padding(2);
-            BtnFileChoice.Name = "BtnFileChoice";
-            BtnFileChoice.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton() });
-            BtnFileChoice.Size = new Size(276, 20);
-            BtnFileChoice.StyleController = dataLayoutControl1;
-            BtnFileChoice.TabIndex = 11;
-            // 
-            // TagName
-            // 
-            TagName.Location = new Point(420, 36);
-            TagName.Name = "TagName";
-            TagName.Size = new Size(277, 20);
-            TagName.StyleController = dataLayoutControl1;
-            TagName.TabIndex = 16;
-            // 
             // layoutControlItem4
             // 
             layoutControlItem4.Control = TagName;
@@ -346,6 +348,27 @@
             layoutControlItem4.Size = new Size(345, 24);
             layoutControlItem4.Text = "鏍囩:";
             layoutControlItem4.TextSize = new Size(52, 14);
+            // 
+            // dxErrorProvider1
+            // 
+            dxErrorProvider1.ContainerControl = this;
+            // 
+            // AddressTextEdit
+            // 
+            AddressTextEdit.Location = new Point(76, 84);
+            AddressTextEdit.Name = "AddressTextEdit";
+            AddressTextEdit.Size = new Size(621, 20);
+            AddressTextEdit.StyleController = dataLayoutControl1;
+            AddressTextEdit.TabIndex = 17;
+            // 
+            // layoutControlItem6
+            // 
+            layoutControlItem6.Control = AddressTextEdit;
+            layoutControlItem6.Location = new Point(0, 72);
+            layoutControlItem6.Name = "layoutControlItem6";
+            layoutControlItem6.Size = new Size(689, 24);
+            layoutControlItem6.Text = "璇︾粏鍦板潃:";
+            layoutControlItem6.TextSize = new Size(52, 14);
             // 
             // AddProjectDlg
             // 
@@ -364,6 +387,8 @@
             ((ISupportInitialize)DescriptionTextEdit.Properties).EndInit();
             ((ISupportInitialize)ModleTextEdit.Properties).EndInit();
             ((ISupportInitialize)CustomerNameTextEdit.Properties).EndInit();
+            ((ISupportInitialize)BtnFileChoice.Properties).EndInit();
+            ((ISupportInitialize)TagName.Properties).EndInit();
             ((ISupportInitialize)Root).EndInit();
             ((ISupportInitialize)layoutControlGroup1).EndInit();
             ((ISupportInitialize)ItemForName).EndInit();
@@ -378,10 +403,10 @@
             ((ISupportInitialize)ItemForConstructionYear).EndInit();
             ((ISupportInitialize)layoutControlItem5).EndInit();
             ((ISupportInitialize)ItemForTagName).EndInit();
-            ((ISupportInitialize)dxErrorProvider1).EndInit();
-            ((ISupportInitialize)BtnFileChoice.Properties).EndInit();
-            ((ISupportInitialize)TagName.Properties).EndInit();
             ((ISupportInitialize)layoutControlItem4).EndInit();
+            ((ISupportInitialize)dxErrorProvider1).EndInit();
+            ((ISupportInitialize)AddressTextEdit.Properties).EndInit();
+            ((ISupportInitialize)layoutControlItem6).EndInit();
             ResumeLayout(false);
         }
 
@@ -413,5 +438,7 @@
         private ButtonEdit BtnFileChoice;
         private TextEdit TagName;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private TextEdit AddressTextEdit;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem6;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.cs
index 4c7ef0d..a026d81 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.cs
@@ -3,6 +3,7 @@
 using HStation.WinFrmUI;
 using HStation.WinFrmUI.Xhs.Project;
 using System;
+using Yw.Dto;
 
 namespace ISupply.WinFrmUI
 {
@@ -13,10 +14,16 @@
             InitializeComponent();
         }
 
-        private EditProjectDlg _AddXhsProjectInput = null;
+        private UpdateXhsProjectInput _UpdateXhsProjectInput = null;
 
-        public void SetBindingData(ProjectViewModel projectViewModel)
+        public event Func<UpdateXhsProjectInput, Task<bool>> ReloadEvent = null;
+
+        public void SetBindingData(XhsProjectDto xhsProjectDto)
         {
+            this.NameTextEdit.Text = xhsProjectDto.Name;
+            this.CustomerNameTextEdit.Text = xhsProjectDto.CustomerName;
+            this.DescriptionTextEdit.Text = xhsProjectDto.Description;
+            this.AddressTextEdit.Text = xhsProjectDto.Address;
         }
 
         //楠岃瘉
@@ -44,13 +51,12 @@
         {
             if (!Valid())
                 return;
-            _AddXhsProjectInput = new AddXhsProjectInput();
-            _AddXhsProjectInput.Name = this.NameTextEdit.Text.Trim();
-            _AddXhsProjectInput.CustomerName = this.CustomerNameTextEdit.Text.Trim();
-            _AddXhsProjectInput.CreateTime = DateTime.Now;
-            _AddXhsProjectInput.GID = new Guid().ToString();
-            _AddXhsProjectInput.Description = this.DescriptionTextEdit.Text.Trim();
-            if (await this.ReloadEvent.Invoke(_AddXhsProjectInput))
+            _UpdateXhsProjectInput = new UpdateXhsProjectInput();
+            _UpdateXhsProjectInput.Name = this.NameTextEdit.Text.Trim();
+            _UpdateXhsProjectInput.CustomerName = this.CustomerNameTextEdit.Text.Trim();
+            _UpdateXhsProjectInput.CreateTime = DateTime.Now;
+            _UpdateXhsProjectInput.Description = this.DescriptionTextEdit.Text.Trim();
+            if (await this.ReloadEvent.Invoke(_UpdateXhsProjectInput))
             {
                 MessageBoxHelper.ShowSuccess("娣诲姞鎴愬姛!");
             }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.designer.cs
index aa416d1..f39e27a 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/EditProjectDlg.designer.cs
@@ -43,6 +43,8 @@
             DescriptionTextEdit = new MemoEdit();
             ModleTextEdit = new TextEdit();
             CustomerNameTextEdit = new TextEdit();
+            BtnFileChoice = new ButtonEdit();
+            TagName = new TextEdit();
             Root = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
             ItemForName = new DevExpress.XtraLayout.LayoutControlItem();
@@ -57,10 +59,13 @@
             ItemForConstructionYear = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
             ItemForTagName = new DevExpress.XtraLayout.LayoutControlItem();
-            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
-            BtnFileChoice = new ButtonEdit();
-            TagName = new TextEdit();
             layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
+            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
+            layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem7 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem8 = new DevExpress.XtraLayout.LayoutControlItem();
+            AddressTextEdit = new TextEdit();
+            layoutControlItem9 = new DevExpress.XtraLayout.LayoutControlItem();
             ((ISupportInitialize)dataLayoutControl1).BeginInit();
             dataLayoutControl1.SuspendLayout();
             ((ISupportInitialize)webView21).BeginInit();
@@ -68,6 +73,8 @@
             ((ISupportInitialize)DescriptionTextEdit.Properties).BeginInit();
             ((ISupportInitialize)ModleTextEdit.Properties).BeginInit();
             ((ISupportInitialize)CustomerNameTextEdit.Properties).BeginInit();
+            ((ISupportInitialize)BtnFileChoice.Properties).BeginInit();
+            ((ISupportInitialize)TagName.Properties).BeginInit();
             ((ISupportInitialize)Root).BeginInit();
             ((ISupportInitialize)layoutControlGroup1).BeginInit();
             ((ISupportInitialize)ItemForName).BeginInit();
@@ -82,14 +89,18 @@
             ((ISupportInitialize)ItemForConstructionYear).BeginInit();
             ((ISupportInitialize)layoutControlItem5).BeginInit();
             ((ISupportInitialize)ItemForTagName).BeginInit();
-            ((ISupportInitialize)dxErrorProvider1).BeginInit();
-            ((ISupportInitialize)BtnFileChoice.Properties).BeginInit();
-            ((ISupportInitialize)TagName.Properties).BeginInit();
             ((ISupportInitialize)layoutControlItem4).BeginInit();
+            ((ISupportInitialize)dxErrorProvider1).BeginInit();
+            ((ISupportInitialize)layoutControlItem6).BeginInit();
+            ((ISupportInitialize)layoutControlItem7).BeginInit();
+            ((ISupportInitialize)layoutControlItem8).BeginInit();
+            ((ISupportInitialize)AddressTextEdit.Properties).BeginInit();
+            ((ISupportInitialize)layoutControlItem9).BeginInit();
             SuspendLayout();
             // 
             // dataLayoutControl1
             // 
+            dataLayoutControl1.Controls.Add(AddressTextEdit);
             dataLayoutControl1.Controls.Add(webView21);
             dataLayoutControl1.Controls.Add(btnOk);
             dataLayoutControl1.Controls.Add(btnCancel);
@@ -113,9 +124,9 @@
             webView21.AllowExternalDrop = true;
             webView21.CreationProperties = null;
             webView21.DefaultBackgroundColor = Color.White;
-            webView21.Location = new Point(24, 120);
+            webView21.Location = new Point(24, 144);
             webView21.Name = "webView21";
-            webView21.Size = new Size(661, 273);
+            webView21.Size = new Size(661, 249);
             webView21.TabIndex = 15;
             webView21.ZoomFactor = 1D;
             // 
@@ -153,9 +164,9 @@
             // 
             // DescriptionTextEdit
             // 
-            DescriptionTextEdit.Location = new Point(22, 118);
+            DescriptionTextEdit.Location = new Point(22, 142);
             DescriptionTextEdit.Name = "DescriptionTextEdit";
-            DescriptionTextEdit.Size = new Size(665, 277);
+            DescriptionTextEdit.Size = new Size(665, 253);
             DescriptionTextEdit.StyleController = dataLayoutControl1;
             DescriptionTextEdit.TabIndex = 6;
             // 
@@ -176,6 +187,24 @@
             CustomerNameTextEdit.StyleController = dataLayoutControl1;
             CustomerNameTextEdit.TabIndex = 14;
             // 
+            // BtnFileChoice
+            // 
+            BtnFileChoice.Location = new Point(76, 36);
+            BtnFileChoice.Margin = new Padding(2);
+            BtnFileChoice.Name = "BtnFileChoice";
+            BtnFileChoice.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton() });
+            BtnFileChoice.Size = new Size(276, 20);
+            BtnFileChoice.StyleController = dataLayoutControl1;
+            BtnFileChoice.TabIndex = 11;
+            // 
+            // TagName
+            // 
+            TagName.Location = new Point(420, 36);
+            TagName.Name = "TagName";
+            TagName.Size = new Size(277, 20);
+            TagName.StyleController = dataLayoutControl1;
+            TagName.TabIndex = 16;
+            // 
             // Root
             // 
             Root.AppearanceItemCaption.Options.UseTextOptions = true;
@@ -191,7 +220,7 @@
             // 
             layoutControlGroup1.AllowDrawBackground = false;
             layoutControlGroup1.GroupBordersVisible = false;
-            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { ItemForName, layoutControlItem1, layoutControlItem2, emptySpaceItem1, tabbedControlGroup1, ItemForConstructionYear, layoutControlItem5, ItemForTagName, layoutControlItem4 });
+            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { ItemForName, layoutControlItem1, layoutControlItem2, emptySpaceItem1, tabbedControlGroup1, ItemForConstructionYear, layoutControlItem5, ItemForTagName, layoutControlItem4, layoutControlItem9 });
             layoutControlGroup1.Location = new Point(0, 0);
             layoutControlGroup1.Name = "autoGeneratedGroup0";
             layoutControlGroup1.Size = new Size(689, 420);
@@ -243,10 +272,10 @@
             tabbedControlGroup1.AppearanceTabPage.Header.Options.UseTextOptions = true;
             tabbedControlGroup1.AppearanceTabPage.Header.TextOptions.HAlignment = HorzAlignment.Center;
             tabbedControlGroup1.HeaderAutoFill = DefaultBoolean.True;
-            tabbedControlGroup1.Location = new Point(0, 72);
+            tabbedControlGroup1.Location = new Point(0, 96);
             tabbedControlGroup1.Name = "tabbedControlGroup1";
             tabbedControlGroup1.SelectedTabPage = layoutControlGroup2;
-            tabbedControlGroup1.Size = new Size(689, 325);
+            tabbedControlGroup1.Size = new Size(689, 301);
             tabbedControlGroup1.TabPages.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup2, layoutControlGroup3 });
             // 
             // layoutControlGroup2
@@ -255,7 +284,7 @@
             layoutControlGroup2.Location = new Point(0, 0);
             layoutControlGroup2.Name = "layoutControlGroup2";
             layoutControlGroup2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup2.Size = new Size(665, 277);
+            layoutControlGroup2.Size = new Size(665, 253);
             layoutControlGroup2.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
             layoutControlGroup2.Text = "鍦板浘鍧愭爣";
             // 
@@ -264,7 +293,7 @@
             layoutControlItem3.Control = webView21;
             layoutControlItem3.Location = new Point(0, 0);
             layoutControlItem3.Name = "layoutControlItem3";
-            layoutControlItem3.Size = new Size(665, 277);
+            layoutControlItem3.Size = new Size(665, 253);
             layoutControlItem3.TextSize = new Size(0, 0);
             layoutControlItem3.TextVisible = false;
             // 
@@ -273,7 +302,7 @@
             layoutControlGroup3.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { ItemForDescription });
             layoutControlGroup3.Location = new Point(0, 0);
             layoutControlGroup3.Name = "layoutControlGroup3";
-            layoutControlGroup3.Size = new Size(665, 277);
+            layoutControlGroup3.Size = new Size(665, 253);
             layoutControlGroup3.Text = "璇存槑";
             // 
             // ItemForDescription
@@ -282,7 +311,7 @@
             ItemForDescription.Location = new Point(0, 0);
             ItemForDescription.Name = "ItemForDescription";
             ItemForDescription.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            ItemForDescription.Size = new Size(665, 277);
+            ItemForDescription.Size = new Size(665, 253);
             ItemForDescription.Text = "璇存槑:";
             ItemForDescription.TextSize = new Size(0, 0);
             ItemForDescription.TextVisible = false;
@@ -316,28 +345,6 @@
             ItemForTagName.Text = "涓夌淮妯″瀷:";
             ItemForTagName.TextSize = new Size(52, 14);
             // 
-            // dxErrorProvider1
-            // 
-            dxErrorProvider1.ContainerControl = this;
-            // 
-            // BtnFileChoice
-            // 
-            BtnFileChoice.Location = new Point(76, 36);
-            BtnFileChoice.Margin = new Padding(2);
-            BtnFileChoice.Name = "BtnFileChoice";
-            BtnFileChoice.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton() });
-            BtnFileChoice.Size = new Size(276, 20);
-            BtnFileChoice.StyleController = dataLayoutControl1;
-            BtnFileChoice.TabIndex = 11;
-            // 
-            // TagName
-            // 
-            TagName.Location = new Point(420, 36);
-            TagName.Name = "TagName";
-            TagName.Size = new Size(277, 20);
-            TagName.StyleController = dataLayoutControl1;
-            TagName.TabIndex = 16;
-            // 
             // layoutControlItem4
             // 
             layoutControlItem4.Control = TagName;
@@ -347,13 +354,58 @@
             layoutControlItem4.Text = "鏍囩:";
             layoutControlItem4.TextSize = new Size(52, 14);
             // 
-            // AddProjectDlg
+            // dxErrorProvider1
+            // 
+            dxErrorProvider1.ContainerControl = this;
+            // 
+            // layoutControlItem6
+            // 
+            layoutControlItem6.Location = new Point(0, 72);
+            layoutControlItem6.Name = "layoutControlItem6";
+            layoutControlItem6.Size = new Size(689, 24);
+            layoutControlItem6.Text = "璇︾粏鍦板潃:";
+            layoutControlItem6.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem7
+            // 
+            layoutControlItem7.Location = new Point(0, 72);
+            layoutControlItem7.Name = "layoutControlItem6";
+            layoutControlItem7.Size = new Size(689, 24);
+            layoutControlItem7.Text = "璇︾粏鍦板潃:";
+            layoutControlItem7.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem8
+            // 
+            layoutControlItem8.Location = new Point(0, 72);
+            layoutControlItem8.Name = "layoutControlItem6";
+            layoutControlItem8.Size = new Size(689, 24);
+            layoutControlItem8.Text = "璇︾粏鍦板潃:";
+            layoutControlItem8.TextSize = new Size(52, 14);
+            // 
+            // AddressTextEdit
+            // 
+            AddressTextEdit.Location = new Point(76, 84);
+            AddressTextEdit.Name = "AddressTextEdit";
+            AddressTextEdit.Size = new Size(621, 20);
+            AddressTextEdit.StyleController = dataLayoutControl1;
+            AddressTextEdit.TabIndex = 5;
+            // 
+            // layoutControlItem9
+            // 
+            layoutControlItem9.Control = AddressTextEdit;
+            layoutControlItem9.Location = new Point(0, 72);
+            layoutControlItem9.Name = "layoutControlItem9";
+            layoutControlItem9.Size = new Size(689, 24);
+            layoutControlItem9.Text = "璇︾粏鍦板潃:";
+            layoutControlItem9.TextSize = new Size(52, 14);
+            // 
+            // EditProjectDlg
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
             ClientSize = new Size(709, 440);
             Controls.Add(dataLayoutControl1);
-            Name = "AddProjectDlg";
+            Name = "EditProjectDlg";
             StartPosition = FormStartPosition.CenterParent;
             Text = "娣诲姞";
             Load += AddProjectDlg_Load;
@@ -364,6 +416,8 @@
             ((ISupportInitialize)DescriptionTextEdit.Properties).EndInit();
             ((ISupportInitialize)ModleTextEdit.Properties).EndInit();
             ((ISupportInitialize)CustomerNameTextEdit.Properties).EndInit();
+            ((ISupportInitialize)BtnFileChoice.Properties).EndInit();
+            ((ISupportInitialize)TagName.Properties).EndInit();
             ((ISupportInitialize)Root).EndInit();
             ((ISupportInitialize)layoutControlGroup1).EndInit();
             ((ISupportInitialize)ItemForName).EndInit();
@@ -378,10 +432,13 @@
             ((ISupportInitialize)ItemForConstructionYear).EndInit();
             ((ISupportInitialize)layoutControlItem5).EndInit();
             ((ISupportInitialize)ItemForTagName).EndInit();
-            ((ISupportInitialize)dxErrorProvider1).EndInit();
-            ((ISupportInitialize)BtnFileChoice.Properties).EndInit();
-            ((ISupportInitialize)TagName.Properties).EndInit();
             ((ISupportInitialize)layoutControlItem4).EndInit();
+            ((ISupportInitialize)dxErrorProvider1).EndInit();
+            ((ISupportInitialize)layoutControlItem6).EndInit();
+            ((ISupportInitialize)layoutControlItem7).EndInit();
+            ((ISupportInitialize)layoutControlItem8).EndInit();
+            ((ISupportInitialize)AddressTextEdit.Properties).EndInit();
+            ((ISupportInitialize)layoutControlItem9).EndInit();
             ResumeLayout(false);
         }
 
@@ -413,5 +470,10 @@
         private ButtonEdit BtnFileChoice;
         private TextEdit TagName;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem6;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem7;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem8;
+        private TextEdit AddressTextEdit;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem9;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/ProjectViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/ProjectViewModel.cs
index 42a134c..dd44964 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/ProjectViewModel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/ProjectViewModel.cs
@@ -18,6 +18,12 @@
             this.CreateUserID = rhs.CreateUserID;
             this.Version = rhs.Version;
             this.MapPosition = rhs.MapPosition;
+            this.CreateDisplayName = CreateUserID.ToString();
         }
+
+        /// <summary>
+        /// 鍒涘缓浜烘樉绀哄悕瀛�
+        /// </summary>
+        public string CreateDisplayName { get; set; }
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.Designer.cs
index ee1fe49..4cf82d5 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.Designer.cs
@@ -41,6 +41,7 @@
             gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
             colName = new DevExpress.XtraGrid.Columns.GridColumn();
             colParas = new DevExpress.XtraGrid.Columns.GridColumn();
+            ColDisplayName = new DevExpress.XtraGrid.Columns.GridColumn();
             colTagName = new DevExpress.XtraGrid.Columns.GridColumn();
             colUseStatus = new DevExpress.XtraGrid.Columns.GridColumn();
             colSortCode = new DevExpress.XtraGrid.Columns.GridColumn();
@@ -91,6 +92,7 @@
             BtnDelete.Id = 3;
             BtnDelete.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("BtnDelete.ImageOptions.SvgImage");
             BtnDelete.Name = "BtnDelete";
+            BtnDelete.ItemClick += BtnDelete_ItemClick;
             // 
             // ribbonPage1
             // 
@@ -124,7 +126,7 @@
             // 
             // gridView1
             // 
-            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colName, colParas, colTagName, colUseStatus, colSortCode, colDescription, colCustomerName });
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colName, colParas, ColDisplayName, colTagName, colUseStatus, colSortCode, colDescription, colCustomerName });
             gridView1.GridControl = gridControl1;
             gridView1.Name = "gridView1";
             gridView1.OptionsView.ShowGroupPanel = false;
@@ -145,13 +147,21 @@
             colParas.Visible = true;
             colParas.VisibleIndex = 1;
             // 
+            // ColDisplayName
+            // 
+            ColDisplayName.Caption = "鍒涘缓浜�";
+            ColDisplayName.FieldName = "CreateDisplayName";
+            ColDisplayName.Name = "ColDisplayName";
+            ColDisplayName.Visible = true;
+            ColDisplayName.VisibleIndex = 2;
+            // 
             // colTagName
             // 
             colTagName.Caption = "鏍囩";
             colTagName.FieldName = "TagName";
             colTagName.Name = "colTagName";
             colTagName.Visible = true;
-            colTagName.VisibleIndex = 2;
+            colTagName.VisibleIndex = 3;
             // 
             // colUseStatus
             // 
@@ -159,7 +169,7 @@
             colUseStatus.FieldName = "UseStatus";
             colUseStatus.Name = "colUseStatus";
             colUseStatus.Visible = true;
-            colUseStatus.VisibleIndex = 3;
+            colUseStatus.VisibleIndex = 4;
             // 
             // colSortCode
             // 
@@ -167,7 +177,7 @@
             colSortCode.FieldName = "SortCode";
             colSortCode.Name = "colSortCode";
             colSortCode.Visible = true;
-            colSortCode.VisibleIndex = 4;
+            colSortCode.VisibleIndex = 5;
             // 
             // colDescription
             // 
@@ -175,7 +185,7 @@
             colDescription.FieldName = "Description";
             colDescription.Name = "colDescription";
             colDescription.Visible = true;
-            colDescription.VisibleIndex = 5;
+            colDescription.VisibleIndex = 6;
             // 
             // colCustomerName
             // 
@@ -183,7 +193,7 @@
             colCustomerName.FieldName = "CustomerName";
             colCustomerName.Name = "colCustomerName";
             colCustomerName.Visible = true;
-            colCustomerName.VisibleIndex = 6;
+            colCustomerName.VisibleIndex = 7;
             // 
             // XhsProjectListPage
             // 
@@ -219,5 +229,6 @@
         private DevExpress.XtraGrid.Columns.GridColumn colSortCode;
         private DevExpress.XtraGrid.Columns.GridColumn colDescription;
         private DevExpress.XtraGrid.Columns.GridColumn colCustomerName;
+        private DevExpress.XtraGrid.Columns.GridColumn ColDisplayName;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.cs
index 8cacf39..0e2780f 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.cs
@@ -10,6 +10,8 @@
         {
             InitializeComponent();
             this.PageTitle.Caption = "椤圭洰绠$悊";
+            this.gridView1.SetNormalView();
+            this.gridView1.RegistCustomDrawRowIndicator();
         }
 
         /// <summary>
@@ -58,9 +60,47 @@
         }
 
         //淇敼
-        private void BtnEdit_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        private async void BtnEdit_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            //var dlg=new EditProjectDlg();
+            var vm = this.gridView1.GetCurrentViewModel(_allBindingList);
+            if (vm == null)
+            {
+                MessageBoxHelper.ShowError("璇烽�夋嫨鏁版嵁琛�!");
+                return;
+            }
+            var dlg = new EditProjectDlg();
+            dlg.SetBindingData(vm);
+            dlg.ReloadEvent += async (rhs) =>
+            {
+                if (await _bll.Update(rhs))
+                {
+                    return true;
+                }
+                return false;
+            };
+            dlg.ShowDialog();
+        }
+
+        //鍒犻櫎
+        private async void BtnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            var vm = this.gridView1.GetCurrentViewModel(_allBindingList);
+            if (vm == null)
+            {
+                MessageBoxHelper.ShowError("璇烽�夋嫨鏁版嵁琛�!");
+                return;
+            }
+            if (MessageBoxHelper.IsClickOk($"纭鍒犻櫎鏁版嵁琛�?", "鎻愮ず", MessageBoxButtons.OKCancel))
+                return;
+            var result = await _bll.DeleteByID(vm.ID);
+            if (!result)
+            {
+                MessageBoxHelper.ShowError($"鍒犻櫎澶辫触!", "璀﹀憡");
+                return;
+            }
+            MessageBoxHelper.ShowSuccess($"鍒犻櫎鎴愬姛!");
+            _allBindingList.Remove(vm);
+            this.projectViewModelBindingSource.ResetBindings(false);
         }
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.resx.bak b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.resx.bak
deleted file mode 100644
index 2b49cfb..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/01-project/XhsProjectListPage.resx.bak
+++ /dev/null
@@ -1,192 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <assembly alias="DevExpress.Data.v22.2" name="DevExpress.Data.v22.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="BtnAdd.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKcCAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
-        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
-        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
-        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkFkZCI+DQogICAgPHBhdGggZD0iTTI3LDE0aC05VjVj
-        MC0wLjUtMC41LTEtMS0xaC0yYy0wLjUsMC0xLDAuNS0xLDF2OUg1Yy0wLjUsMC0xLDAuNS0xLDF2MmMw
-        LDAuNSwwLjUsMSwxLDFoOXY5ICAgYzAsMC41LDAuNSwxLDEsMWgyYzAuNSwwLDEtMC41LDEtMXYtOWg5
-        YzAuNSwwLDEtMC41LDEtMXYtMkMyOCwxNC41LDI3LjUsMTQsMjcsMTR6IiBjbGFzcz0iR3JlZW4iIC8+
-        DQogIDwvZz4NCjwvc3ZnPgs=
-</value>
-  </data>
-  <data name="BtnEdit.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABwFAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
-        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3
-        RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh
-        Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm
-        aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iUmVuYW1lXzFfIj4NCiAgICA8
-        cGF0aCBkPSJNMi4xLDE2aDIuMmwwLjYtMi4zaDMuMkw4LjgsMTZIMTFMNy44LDZINS40TDIuMSwxNnog
-        TTYuNCw4LjdjMC4xLTAuMywwLjEtMC42LDAuMS0wLjloMC4xICAgYzAsMC4zLDAuMSwwLjYsMC4xLDAu
-        OWwxLDMuM0g1LjRMNi40LDguN3ogTTE3LjUsMTAuNmMwLjYtMC4yLDEuMS0wLjUsMS41LTAuOWMwLjQt
-        MC40LDAuNi0wLjksMC42LTEuNGMwLTAuNy0wLjMtMS4zLTAuOS0xLjcgICBDMTguMSw2LjIsMTcuMSw2
-        LDE1LjksNkgxMnY5LjlWMTZoNGMxLjIsMCwyLjItMC4yLDIuOS0wLjhDMTkuNywxNC42LDIwLDE0LDIw
-        LDEzYzAtMC42LTAuMi0xLjItMC43LTEuNiAgIEMxOC45LDExLDE4LjMsMTAuNywxNy41LDEwLjZ6IE0x
-        NC40LDcuN2gwLjljMS4xLDAsMS43LDAuNCwxLjcsMS4xYzAsMC40LTAuMSwwLjctMC40LDAuOUMxNi40
-        LDkuOSwxNiwxMCwxNS41LDEwaC0xLjFWNy43eiAgICBNMTcsMTMuOGMtMC4zLDAuMi0wLjgsMC40LTEu
-        MywwLjRoLTEuM3YtMi42aDEuM2MwLjUsMCwwLjksMC4xLDEuMywwLjNjMC4zLDAuMiwwLjUsMC42LDAu
-        NSwwLjlDMTcuNSwxMy4zLDE3LjQsMTMuNiwxNywxMy44eiIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxw
-        YXRoIGQ9Ik0yNywxOWwtOCw4bC00LTRsOC04TDI3LDE5eiBNMjgsMThsMS43LTEuN2MwLjQtMC40LDAu
-        NC0xLDAtMS4zTDI3LDEyLjNjLTAuNC0wLjQtMS0wLjQtMS4zLDBMMjQsMTRMMjgsMTh6ICAgIE0xNCwy
-        NHY0aDRMMTQsMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
-</value>
-  </data>
-  <data name="BtnDelete.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJIDAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
-        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
-        MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjU7fQoJLnN0MXtkaXNwbGF5Om5vbmU7fQoJLnN0MntkaXNwbGF5OmlubGluZTtmaWxsOiMw
-        MzlDMjM7fQoJLnN0M3tkaXNwbGF5OmlubGluZTtmaWxsOiNEMTFDMUM7fQoJLnN0NHtkaXNwbGF5Omlu
-        bGluZTtmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iRGVsZXRlIj4NCiAgICA8cGF0aCBk
-        PSJNMTguOCwxNmw4LjktOC45YzAuNC0wLjQsMC40LTEsMC0xLjRsLTEuNC0xLjRjLTAuNC0wLjQtMS0w
-        LjQtMS40LDBMMTYsMTMuMkw3LjEsNC4zYy0wLjQtMC40LTEtMC40LTEuNCwwICAgTDQuMyw1LjdjLTAu
-        NCwwLjQtMC40LDEsMCwxLjRsOC45LDguOWwtOC45LDguOWMtMC40LDAuNC0wLjQsMSwwLDEuNGwxLjQs
-        MS40YzAuNCwwLjQsMSwwLjQsMS40LDBsOC45LTguOWw4LjksOC45ICAgYzAuNCwwLjQsMSwwLjQsMS40
-        LDBsMS40LTEuNGMwLjQtMC40LDAuNC0xLDAtMS40TDE4LjgsMTZ6IiBjbGFzcz0iUmVkIiAvPg0KICA8
-        L2c+DQo8L3N2Zz4L
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/DocumentPage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/DocumentPage.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/DocumentPage.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/DocumentPage.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/DocumentPage.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/DocumentPage.resx
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/DocumentPage.resx
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/DocumentPage.resx
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/MainForm.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/MainForm.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/MainForm.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/MainForm.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/MainForm.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/MainForm.resx
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/MainForm.resx
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/MainForm.resx
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/ObjectType.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/ObjectType.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/ObjectType.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/ObjectType.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageDataSync.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageDataSync.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageDataSync.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageDataSync.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageFunctionItem.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageFunctionItem.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageFunctionItem.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageFunctionItem.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageMenu.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageMenu.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageMenu.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageMenu.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageTitle.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageTitle.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/PageTitle.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/PageTitle.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/SurfaceGuid.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/SurfaceGuid.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/SurfaceGuid.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/SurfaceGuid.cs
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/ePageDataOperation.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/ePageDataOperation.cs
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-DocumentPage/ePageDataOperation.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/00-DocumentPage/ePageDataOperation.cs
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/BandGridViewExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/BandGridViewExtend.cs"
new file mode 100644
index 0000000..daf0317
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/BandGridViewExtend.cs"
@@ -0,0 +1,23 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraGrid.Views.BandedGrid;
+
+namespace HStation.WinFrmUI
+{
+    /// <summary>
+    /// BandedGridView鎷撳睍绫�
+    /// </summary>
+    public static class BandGridViewExtend
+    {
+        /// <summary>
+        /// 璁剧疆bandView
+        /// </summary>
+        /// <param name="band"></param>
+        public static void SetBandView(this BandedGridView band, int height = 28)
+        {
+            band.SetNormalView(height);
+            band.BandPanelRowHeight = height;
+            band.Appearance.BandPanel.TextOptions.HAlignment = HorzAlignment.Center;
+        }
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ButtonEditExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ButtonEditExtend.cs"
new file mode 100644
index 0000000..1174208
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ButtonEditExtend.cs"
@@ -0,0 +1,65 @@
+锘縰sing DevExpress.XtraEditors;
+using System;
+
+namespace HStation.WinFrmUI
+{
+    public static class ButtonEditExtend
+    {
+
+        /// <summary>
+        /// 璁剧疆鏌ヨ
+        /// </summary>
+        /// <param name="btn"></param>
+        /// <param name="SearchData"></param>
+        /// <param name="RecoverData"></param>
+        public static void SetSearchSettings(this ButtonEdit btn, EventHandler SearchData, EventHandler RecoverData)
+        {
+            btn.Properties.Buttons.Clear();
+            btn.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Clear),
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Search)});
+            btn.Properties.Buttons[0].Visible = false;
+            btn.EditValueChanged += delegate
+            {
+                if (btn.EditValue == null || string.IsNullOrEmpty(btn.EditValue.ToString()))
+                {
+                    btn.Properties.Buttons[0].Visible = false;
+                    if (RecoverData != null)
+                        RecoverData(null, null);
+                }
+                else
+                    btn.Properties.Buttons[0].Visible = true;
+
+            };
+            btn.ButtonClick += (sender, e) =>
+                {
+                    if (e.Button == btn.Properties.Buttons[0])
+                    {
+                        btn.EditValue = null;
+                        if (RecoverData != null)
+                            RecoverData(sender, e);
+                    }
+                    else if (SearchData != null)
+                    {
+                        if (RecoverData != null)
+                            RecoverData(sender, e);
+                        SearchData(sender, e);
+                    }
+                };
+            btn.KeyPress += (sender, e) =>
+                {
+                    if (e.KeyChar == 13)
+                    {
+                        if (RecoverData != null)
+                            RecoverData(sender, e);
+                        if (SearchData != null)
+                            SearchData(sender, e);
+                    }
+                };
+
+
+        }
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ClassUpdateVailDataHelper.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ClassUpdateVailDataHelper.cs"
new file mode 100644
index 0000000..e53af41
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ClassUpdateVailDataHelper.cs"
@@ -0,0 +1,102 @@
+锘縰sing System;
+
+namespace HStation.WinFrmUI.Core
+{
+    public static class ClassUpdateVailDataHelper
+    {
+        /// <summary>
+        /// 鍙嶅皠瀵规瘮瀹炰綋灞炴�у彉鏇�
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        public static class CompareEntry<T>
+        {
+            /// <summary>
+            /// 缂栬緫涔嬪墠鐨勫璞″拰缂栬緫鍚庣殑瀵硅薄杩涜瀵规瘮
+            /// </summary>
+            /// <returns></returns>
+            public static bool CompareDTO(T BeforeDTO, T AfterDTO)
+            {
+                bool IsEqual = true;
+
+                if (BeforeDTO == null || AfterDTO == null)
+                {
+                    IsEqual = false;
+                }
+                else if (BeforeDTO.Equals(DBNull.Value) || AfterDTO.Equals(DBNull.Value))
+                {
+                    IsEqual = false;
+                }
+                else if (BeforeDTO.GetType() != AfterDTO.GetType())
+                {
+                    IsEqual = false;
+                    return IsEqual;
+                }
+                else if (BeforeDTO is int || BeforeDTO is short || BeforeDTO is long || BeforeDTO is float || BeforeDTO is double || BeforeDTO is decimal)
+                {
+                    //int 01涓�1      
+                    if (BeforeDTO is int)
+                    {
+                        if (Convert.ToInt32(BeforeDTO) != Convert.ToInt32(AfterDTO))
+                        {
+                            IsEqual = false;
+                        }
+                    }
+                    else if (BeforeDTO is short)
+                    {
+                        if (Convert.ToInt16(BeforeDTO) != Convert.ToInt16(AfterDTO))
+                        {
+                            IsEqual = false;
+                        }
+                    }
+                    else if (BeforeDTO is long)
+                    {
+                        if (Convert.ToInt64(BeforeDTO) != Convert.ToInt64(AfterDTO))
+                        {
+                            IsEqual = false;
+                        }
+                    }
+                    else if (BeforeDTO is float)
+                    {
+                        if (Convert.ToSingle(BeforeDTO) != Convert.ToSingle(AfterDTO))
+                        {
+                            IsEqual = false;
+                        }
+                    }
+                    else if (BeforeDTO is double)
+                    {
+                        if (Convert.ToDouble(BeforeDTO) != Convert.ToDouble(AfterDTO))
+                        {
+                            IsEqual = false;
+                        }
+                    }
+                    else if (BeforeDTO is decimal)
+                    {
+                        if (Convert.ToDecimal(BeforeDTO) == Convert.ToDecimal(AfterDTO))
+                        {
+                            IsEqual = false;
+                        }
+                    }
+                }
+                else
+                {
+                    var beforeMembers = BeforeDTO.GetType().GetProperties();
+                    var afterMembers = AfterDTO.GetType().GetProperties();
+                    for (int i = 0; i < beforeMembers.Length; i++)
+                    {
+                        var beforeVal = beforeMembers[i].GetValue(BeforeDTO, null);
+                        var afterVal = afterMembers[i].GetValue(AfterDTO, null);
+                        var beforeValue = beforeVal == null ? null : beforeVal.ToString();
+                        var afterValue = afterVal == null ? null : afterVal.ToString();
+                        if (beforeValue != afterValue)
+                        {
+                            IsEqual = false;
+                            break;
+                        }
+                    }
+                }
+
+                return IsEqual;
+            }
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ControlExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ControlExtend.cs"
new file mode 100644
index 0000000..783c763
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ControlExtend.cs"
@@ -0,0 +1,32 @@
+锘縰sing System.Drawing;
+using System.Windows.Forms;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// 鎺т欢鎷撳睍绫�
+    /// </summary>
+    public static class ControlExtend
+    {
+        /// <summary>
+        /// 缁樺埗鎺т欢杈规
+        /// </summary>
+        /// <param name="ctrl">鎺т欢</param>
+        /// <param name="e">PaintEventArgs</param>
+        /// <param name="borderColor">Color</param>
+        /// <param name="borderWidth">榛樿涓�1</param>
+        public static void DrawBorder(this Control ctrl, PaintEventArgs e, Color borderColor, int borderWidth = 1)
+        {
+            ControlPaint.DrawBorder(e.Graphics,
+                                                    ctrl.ClientRectangle,
+                                                    borderColor, borderWidth, ButtonBorderStyle.Solid,
+                                                    borderColor, borderWidth, ButtonBorderStyle.Solid,
+                                                    borderColor, borderWidth, ButtonBorderStyle.Solid,
+                                                    borderColor, borderWidth, ButtonBorderStyle.Solid);
+        }
+
+
+
+    }
+
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ControlNavigatorExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ControlNavigatorExtend.cs"
new file mode 100644
index 0000000..4561af6
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ControlNavigatorExtend.cs"
@@ -0,0 +1,37 @@
+锘縰sing DevExpress.XtraEditors;
+using DevExpress.XtraGrid;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// ControlNavigator鎷撳睍绫�
+    /// </summary>
+    public static class ControlNavigatorExtend
+    {
+
+        /// <summary>
+        /// 琛ㄦ牸瀵艰埅鏉¤缃�
+        /// </summary>
+        /// <param name="controlNavigator1"></param>
+        /// <param name="gridControl1"></param>
+        public static void SetControlNavigator(this ControlNavigator controlNavigator1, GridControl gridControl1)
+        {
+            controlNavigator1.Buttons.Append.Visible = false;
+            controlNavigator1.Buttons.CancelEdit.Visible = false;
+            controlNavigator1.Buttons.Edit.Visible = false;
+            controlNavigator1.Buttons.EndEdit.Visible = false;
+            controlNavigator1.Buttons.Remove.Visible = false;
+            controlNavigator1.Dock = System.Windows.Forms.DockStyle.Right;
+            controlNavigator1.LookAndFeel.SkinName = "Money Twins";
+            controlNavigator1.Name = "controlNavigator1";
+            controlNavigator1.NavigatableControl = gridControl1;
+            controlNavigator1.Size = new System.Drawing.Size(299, 24);
+            controlNavigator1.TabIndex = 1;
+            controlNavigator1.Text = "controlNavigator1";
+            controlNavigator1.TextLocation = DevExpress.XtraEditors.NavigatorButtonsTextLocation.Center;
+            controlNavigator1.TextStringFormat = "绗瑊0}椤� - 鍏眥1}椤�";
+
+        }
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/DateEditExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/DateEditExtend.cs"
new file mode 100644
index 0000000..1263a84
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/DateEditExtend.cs"
@@ -0,0 +1,81 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace ISupply.WinFrmUI
+{
+    public static class DateEditExtend
+    {
+        //        //鏄剧ず骞�
+        //        dateEdit1.Properties.ShowToday = false;
+        //dateEdit1.Properties.ShowMonthHeaders = false;
+        //dateEdit1.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.Vista;
+        //dateEdit1.Properties.VistaCalendarInitialViewStyle = DevExpress.XtraEditors.VistaCalendarInitialViewStyle.YearsGroupView;
+        //dateEdit1.Properties.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearsGroupView;
+        //dateEdit1.Properties.Mask.EditMask = "yyyy";
+        //dateEdit1.Properties.Mask.UseMaskAsDisplayFormat = true;
+
+        ////鏄剧ず鏈�
+        //dateEdit2.Properties.ShowToday = false;
+        //dateEdit2.Properties.ShowMonthHeaders = true;
+        //dateEdit2.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.Vista;
+        //dateEdit2.Properties.VistaCalendarInitialViewStyle = DevExpress.XtraEditors.VistaCalendarInitialViewStyle.YearView;
+        //dateEdit2.Properties.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearView;
+        //dateEdit2.Properties.Mask.EditMask = "yyyy-MM";
+        //dateEdit2.Properties.Mask.UseMaskAsDisplayFormat = true;
+
+        ////瀛e害
+        //dateEdit3.Properties.ShowToday = false;
+        //dateEdit3.Properties.ShowMonthHeaders = false;
+        //dateEdit3.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.Vista;
+        //dateEdit3.Properties.VistaCalendarInitialViewStyle = DevExpress.XtraEditors.VistaCalendarInitialViewStyle.QuarterView;
+        //dateEdit3.Properties.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.QuarterView;
+        //dateEdit3.Properties.Mask.EditMask = "yyyy-MM";
+        //dateEdit3.Properties.Mask.UseMaskAsDisplayFormat = true;
+
+        /// <summary>
+        /// 璁剧疆鍙樉绀哄勾鏈�
+        /// </summary>
+        public static void SetOnlyShowYearMonth(this DateEdit dt)
+        {
+            dt.Properties.ShowToday = false;
+            dt.Properties.ShowMonthHeaders = true;
+            dt.Properties.CalendarView = DevExpress.XtraEditors.Repository.CalendarView.Vista;
+            dt.Properties.VistaCalendarInitialViewStyle = DevExpress.XtraEditors.VistaCalendarInitialViewStyle.YearView;
+            dt.Properties.VistaCalendarViewStyle = DevExpress.XtraEditors.VistaCalendarViewStyle.YearView;
+            dt.Properties.Mask.EditMask = "yyyy-MM";
+            dt.Properties.Mask.UseMaskAsDisplayFormat = true;
+        }
+
+        /// <summary>
+        /// 璁剧疆鍙樉绀烘棩鏈�
+        /// </summary>
+        /// <param name="dt"></param>
+        public static void SetOnlyShowDate(this DateEdit dt)
+        {
+            dt.Properties.DisplayFormat.FormatString = "yyyy-MM-dd";
+            dt.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+            dt.Properties.EditFormat.FormatString = "yyyy-MM-dd";
+            dt.Properties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+            dt.Properties.Mask.EditMask = "yyyy-MM-dd";
+        }
+
+        /// <summary>
+        /// 璁剧疆鏄剧ず鏃堕挓
+        /// </summary>
+        /// <param name="dt"></param>
+        public static void SetShowClock(this DateEdit dt)
+        {
+            dt.Properties.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm";
+            dt.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+            dt.Properties.EditFormat.FormatString = "yyyy-MM-dd HH:mm";
+            dt.Properties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+            dt.Properties.Mask.EditMask = "yyyy-MM-dd HH:mm";
+            dt.Properties.VistaDisplayMode = DevExpress.Utils.DefaultBoolean.True;
+            dt.Properties.VistaEditTime = DevExpress.Utils.DefaultBoolean.True;
+            dt.Properties.VistaTimeProperties.DisplayFormat.FormatString = "HH:mm";
+            dt.Properties.VistaTimeProperties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+            dt.Properties.VistaTimeProperties.EditFormat.FormatString = "HH:mm";
+            dt.Properties.VistaTimeProperties.EditFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
+            dt.Properties.VistaTimeProperties.Mask.EditMask = "HH:mm";
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/DevHelper.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/DevHelper.cs"
new file mode 100644
index 0000000..2419e16
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/DevHelper.cs"
@@ -0,0 +1,42 @@
+锘縰sing DevExpress.Utils;
+
+namespace ISupply.WinFrmUI
+{
+    public class DevHelper
+    {
+        /// <summary>
+        /// 杈撳叆 <see cref="DefaultBoolean"/>
+        /// </summary>
+        /// <remarks>
+        /// 榧荤鐨勭О鍙峰彲浠ヨ鏄潪寮犻洩杩庤帿灞炰簡锛�
+        /// 寮犻洩杩庡湪鍙傚姞缁艰壓鑺傜洰鐨勬椂鍊欙紝濂瑰湪閲岄潰鎷ㄩ�氫簡鍏虫檽褰ょ殑鐢佃瘽锛�
+        /// 澶у閮戒互涓哄ス浠琛ㄨ揪鎰熸儏鏈夊娣卞帤锛屽濡规儏鏈夊娣憋紝
+        /// <br/> <br/> <br/>
+        /// <para>
+        /// 浣嗘槸濂逛竴寮�鍙e氨璁╂墍鏈変汉闈炲父鐨勬儕璁讹紝濂圭涓�鍙ヨ瘽灏辨妸鍏虫檽褰ょ粰鎯规�掍簡锛�
+        /// </para>
+        ///  <para>鍦ㄧ數璇濅腑濂规晠鎰忓彨鍏虫檽褰ょ殑灏忓悕鍙屽弻锛岃繕娌$瓑寮犻洩杩庢妸璇濊瀹岋紝
+        ///  鍏虫檽褰ょ殑椹笂璇村啀鍙垜灏忓悕灏辨妸浣犳媺榛戜簡锛�  </para>
+        ///  <para>寮犻洩杩庤繕鏁呮剰璋冧緝璇撮偅鎴戝簲璇ュ彨浣犱粈涔堬紝杩欎竴娉㈡搷浣滀笅鏉ョ湡鐨勬槸鍗佸垎鐨勭豢鑼讹紝鍏虫檽褰ゅ湪濞变箰鍦堝綋涓劸姘旂畻鏄瘮杈冨ソ鐨勯偅绉嶏紝浣嗘槸鑳借鍏虫檽褰ょ敓姘旂殑浜嬪苟涓嶆槸寰堝锛屽緢鏄剧劧鍏虫檽褰よ兘澶熻繖鏍峰瓙鐩存埅浜嗗綋瀵瑰紶闆繋璇磋瘽锛屽彲浠ョ煡閬撳紶闆繋鏄笉姝㈣繖涓�娆″仛鍑鸿繖涔堢豢鑼剁殑
+        ///  </para></remarks>
+        /// <example>
+        /// <code lang="c#">
+        /// <![CDATA[
+        /// Tran(Visible)
+        /// ]]>
+        /// </code>
+        /// </example>
+        /// <param name="bol"></param>
+        /// <returns></returns>
+        /// <exception cref="??">
+        /// 
+        /// </exception>
+        public static bool Tran(DevExpress.Utils.DefaultBoolean bol)
+        {
+            if (bol == DevExpress.Utils.DefaultBoolean.True)
+                return true;
+            else
+                return false;
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ExtensionsDev.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ExtensionsDev.cs"
new file mode 100644
index 0000000..2f210ad
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ExtensionsDev.cs"
@@ -0,0 +1,252 @@
+锘縰sing System;
+using System.Drawing;
+
+namespace ISupply.WinFrmUI
+{
+    //鎷撳睍XtraEditors
+    static public class ExtendSpinEdit
+    {
+        public static double GetValue(this DevExpress.XtraEditors.SpinEdit editCtrl)
+        {
+            return Convert.ToDouble(editCtrl.Value);
+        }
+
+        public static void SetValue(this DevExpress.XtraEditors.SpinEdit editCtrl, double v)
+        {
+            editCtrl.Value = Convert.ToDecimal(v);
+        }
+
+    }
+
+    static public class ExtendCalcEdit
+    {
+        public static double GetValue(this DevExpress.XtraEditors.CalcEdit editCtrl)
+        {
+            return Convert.ToDouble(editCtrl.Value);
+        }
+
+        public static void SetValue(this DevExpress.XtraEditors.CalcEdit editCtrl, double v)
+        {
+            editCtrl.Value = Convert.ToDecimal(v);
+        }
+    }
+
+    public static class Extensions
+    {
+
+
+        /// <summary>
+        /// 杞寲涓鸿嚜瀹氫箟瀛楃涓叉牸寮�
+        /// </summary>
+        public static String ToCustomString(this DateTime dateTime)
+        {
+            return dateTime.ToString("yyyy-MM-dd HH:mm:ss");
+        }
+
+
+
+        /// <summary>
+        /// 璁剧疆褰揥indowsUIButtonPanel浣嶄簬鐣岄潰搴曢儴鏃剁殑澶栬
+        /// </summary>
+        /// <param name="panel"></param>
+        public static void SetAppearanceAtBottom(this DevExpress.XtraBars.Docking2010.WindowsUIButtonPanel panel)
+        {
+            panel.UseButtonBackgroundImages = false;
+            //panel.BackColor = Color.FromArgb(63, 63, 63);
+            //panel.AppearanceButton.Hovered.ForeColor = Color.FromArgb(130, 130, 130);
+            //panel.AppearanceButton.Normal.ForeColor = Color.White;
+            //panel.AppearanceButton.Pressed.ForeColor = Color.FromArgb(159, 159, 159);
+            panel.ButtonInterval = 20;
+            panel.BackColor = Color.Transparent;
+            panel.AppearanceButton.Hovered.ForeColor = Color.FromArgb(0, 122, 204);
+            panel.AppearanceButton.Normal.ForeColor = Color.Black;
+            panel.AppearanceButton.Pressed.ForeColor = Color.Red;
+
+        }
+
+        /// <summary>
+        /// 閲戦杞崲鎴愪腑鏂囧ぇ鍐欓噾棰�
+        /// </summary>
+        /// <param name="LowerMoney">eg:10.74</param>
+        /// <returns></returns>
+        public static string MoneyToUpper(string LowerMoney)
+        {
+            string functionReturnValue = null;
+            bool IsNegative = false; // 鏄惁鏄礋鏁�
+            if (LowerMoney.Trim().Substring(0, 1) == "-")
+            {
+                // 鏄礋鏁板垯鍏堣浆涓烘鏁�
+                LowerMoney = LowerMoney.Trim().Remove(0, 1);
+                IsNegative = true;
+            }
+            string strLower = null;
+            string strUpart = null;
+            string strUpper = null;
+            int iTemp = 0;
+            // 淇濈暀涓や綅灏忔暟 123.489鈫�123.49銆�銆�123.4鈫�123.4
+            LowerMoney = Math.Round(double.Parse(LowerMoney), 2).ToString();
+            if (LowerMoney.IndexOf(".") > 0)
+            {
+                if (LowerMoney.IndexOf(".") == LowerMoney.Length - 2)
+                {
+                    LowerMoney = LowerMoney + "0";
+                }
+            }
+            else
+            {
+                LowerMoney = LowerMoney + ".00";
+            }
+            strLower = LowerMoney;
+            iTemp = 1;
+            strUpper = "";
+            while (iTemp <= strLower.Length)
+            {
+                switch (strLower.Substring(strLower.Length - iTemp, 1))
+                {
+                    case ".":
+                        strUpart = "鍦�";
+                        break;
+                    case "0":
+                        strUpart = "闆�";
+                        break;
+                    case "1":
+                        strUpart = "澹�";
+                        break;
+                    case "2":
+                        strUpart = "璐�";
+                        break;
+                    case "3":
+                        strUpart = "鍙�";
+                        break;
+                    case "4":
+                        strUpart = "鑲�";
+                        break;
+                    case "5":
+                        strUpart = "浼�";
+                        break;
+                    case "6":
+                        strUpart = "闄�";
+                        break;
+                    case "7":
+                        strUpart = "鏌�";
+                        break;
+                    case "8":
+                        strUpart = "鎹�";
+                        break;
+                    case "9":
+                        strUpart = "鐜�";
+                        break;
+                }
+
+                switch (iTemp)
+                {
+                    case 1:
+                        strUpart = strUpart + "鍒�";
+                        break;
+                    case 2:
+                        strUpart = strUpart + "瑙�";
+                        break;
+                    case 3:
+                        strUpart = strUpart + "";
+                        break;
+                    case 4:
+                        strUpart = strUpart + "";
+                        break;
+                    case 5:
+                        strUpart = strUpart + "鎷�";
+                        break;
+                    case 6:
+                        strUpart = strUpart + "浣�";
+                        break;
+                    case 7:
+                        strUpart = strUpart + "浠�";
+                        break;
+                    case 8:
+                        strUpart = strUpart + "涓�";
+                        break;
+                    case 9:
+                        strUpart = strUpart + "鎷�";
+                        break;
+                    case 10:
+                        strUpart = strUpart + "浣�";
+                        break;
+                    case 11:
+                        strUpart = strUpart + "浠�";
+                        break;
+                    case 12:
+                        strUpart = strUpart + "浜�";
+                        break;
+                    case 13:
+                        strUpart = strUpart + "鎷�";
+                        break;
+                    case 14:
+                        strUpart = strUpart + "浣�";
+                        break;
+                    case 15:
+                        strUpart = strUpart + "浠�";
+                        break;
+                    case 16:
+                        strUpart = strUpart + "涓�";
+                        break;
+                    default:
+                        strUpart = strUpart + "";
+                        break;
+                }
+
+                strUpper = strUpart + strUpper;
+                iTemp = iTemp + 1;
+            }
+
+            strUpper = strUpper.Replace("闆舵嬀", "闆�");
+            strUpper = strUpper.Replace("闆朵桨", "闆�");
+            strUpper = strUpper.Replace("闆朵粺", "闆�");
+            strUpper = strUpper.Replace("闆堕浂闆�", "闆�");
+            strUpper = strUpper.Replace("闆堕浂", "闆�");
+            strUpper = strUpper.Replace("闆惰闆跺垎", "鏁�");
+            strUpper = strUpper.Replace("闆跺垎", "鏁�");
+            strUpper = strUpper.Replace("闆惰", "闆�");
+            strUpper = strUpper.Replace("闆朵嚎闆朵竾闆跺渾", "浜垮渾");
+            strUpper = strUpper.Replace("浜块浂涓囬浂鍦�", "浜垮渾");
+            strUpper = strUpper.Replace("闆朵嚎闆朵竾", "浜�");
+            strUpper = strUpper.Replace("闆朵竾闆跺渾", "涓囧渾");
+            strUpper = strUpper.Replace("闆朵嚎", "浜�");
+            strUpper = strUpper.Replace("闆朵竾", "涓�");
+            strUpper = strUpper.Replace("闆跺渾", "鍦�");
+            strUpper = strUpper.Replace("闆堕浂", "闆�");
+
+            // 瀵瑰9鍦嗕互涓嬬殑閲戦鐨勫鐞�
+            if (strUpper.Substring(0, 1) == "鍦�")
+            {
+                strUpper = strUpper.Substring(1, strUpper.Length - 1);
+            }
+            if (strUpper.Substring(0, 1) == "闆�")
+            {
+                strUpper = strUpper.Substring(1, strUpper.Length - 1);
+            }
+            if (strUpper.Substring(0, 1) == "瑙�")
+            {
+                strUpper = strUpper.Substring(1, strUpper.Length - 1);
+            }
+            if (strUpper.Substring(0, 1) == "鍒�")
+            {
+                strUpper = strUpper.Substring(1, strUpper.Length - 1);
+            }
+            if (strUpper.Substring(0, 1) == "鏁�")
+            {
+                strUpper = "闆跺渾鏁�";
+            }
+            functionReturnValue = strUpper;
+
+            if (IsNegative == true)
+            {
+                return "璐�" + functionReturnValue;
+            }
+            else
+            {
+                return functionReturnValue;
+            }
+        }
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/FormExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/FormExtend.cs"
new file mode 100644
index 0000000..1293857
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/FormExtend.cs"
@@ -0,0 +1,48 @@
+锘縰sing System;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// FORM绐椾綋鎷撳睍绫�
+    /// </summary>
+    public static class FormExtensions
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        [DllImport("user32.dll")]
+        public static extern bool ReleaseCapture();
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="hwnd"></param>
+        /// <param name="wMsg"></param>
+        /// <param name="wParam"></param>
+        /// <param name="lParam"></param>
+        /// <returns></returns>
+        [DllImport("user32.dll")]
+        public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
+
+        private const int VM_NCLBUTTONDOWN = 0X00A1;//瀹氫箟榧犳爣宸﹂敭鎸変笅
+        private const int HTCAPTION = 2;
+
+        /// <summary>
+        /// 鎷栧姩绉诲姩
+        /// </summary>
+        /// <param name="frm"></param>
+        public static void DragMove(this Form frm)
+        {
+            //涓哄綋鍓嶅簲鐢ㄧ▼搴忛噴鏀鹃紶鏍囨崟鑾�
+            ReleaseCapture();
+            //鍙戦�佹秷鎭� 璁╃郴缁熻浠ヤ负鍦ㄦ爣棰樻爮涓婃寜涓嬮紶鏍�
+            SendMessage(frm.Handle, VM_NCLBUTTONDOWN, HTCAPTION, 0);
+        }
+
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/GridContorlExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/GridContorlExtend.cs"
new file mode 100644
index 0000000..8f974cc
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/GridContorlExtend.cs"
@@ -0,0 +1,57 @@
+锘縰sing DevExpress.XtraGrid;
+using DevExpress.XtraGrid.Views.Grid;
+using System;
+using System.Windows.Forms;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// GridView鐨勬嫇灞曠被
+    /// </summary>
+    public static class GridContorlExtend
+    {
+        #region 榛樿
+        /// <summary>
+        /// 鏅�氳鍥捐缃�
+        /// </summary>
+        /// <param name="grid"></param> 
+        public static void ContextMenuStrip(this GridControl grid)
+        {
+            if (grid.Views.Count < 1)
+                return;
+            var view = grid.Views[0] as GridView;
+
+
+            var contextMenuStrip = new System.Windows.Forms.ContextMenuStrip();
+            var copyItem = new System.Windows.Forms.ToolStripMenuItem();
+            copyItem.Text = "澶嶅埗鍗曞厓鏍�";
+            copyItem.Click += new System.EventHandler((object sender, EventArgs e) =>
+            {
+                var text = view.GetFocusedDisplayText();
+                Clipboard.SetData(DataFormats.Text, text);
+            });
+            contextMenuStrip.Items.Add(copyItem);
+
+            var exportExcelItem = new System.Windows.Forms.ToolStripMenuItem();
+            exportExcelItem.Text = "瀵煎嚭Excel";
+            exportExcelItem.Click += new System.EventHandler((object sender, EventArgs e) =>
+            {
+                var dlg = new SaveFileDialog();
+                dlg.Filter = "excel|.xlsx";
+                if (dlg.ShowDialog() != DialogResult.OK)
+                    return;
+                var options = new DevExpress.XtraPrinting.XlsxExportOptionsEx();
+                options.ExportType = DevExpress.Export.ExportType.DataAware;//鎵�瑙佸嵆鎵�寰�
+                options.TextExportMode = DevExpress.XtraPrinting.TextExportMode.Text;
+                view.ExportToXlsx(dlg.FileName, options);
+            });
+            contextMenuStrip.Items.Add(exportExcelItem);
+
+            grid.ContextMenuStrip = contextMenuStrip;
+        }
+
+
+        #endregion
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/GridViewExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/GridViewExtend.cs"
new file mode 100644
index 0000000..aaf832c
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/GridViewExtend.cs"
@@ -0,0 +1,573 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraEditors;
+using DevExpress.XtraGrid.Columns;
+using DevExpress.XtraGrid.Views.Grid;
+using DevExpress.XtraGrid.Views.Grid.ViewInfo;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace HStation.WinFrmUI
+{
+    /// <summary>
+    /// GridView鐨勬嫇灞曠被
+    /// </summary>
+    public static class GridViewExtend
+    {
+        #region 榛樿
+
+        /// <summary>
+        /// 鏅�氳鍥捐缃�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetNormalView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = true;
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = true;
+            grid.OptionsCustomization.AllowSort = true;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.ShowIndicator = true;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsView.ShowDetailButtons = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = false;
+            grid.OptionsBehavior.ReadOnly = true;
+
+            grid.OptionsView.EnableAppearanceOddRow = true;   // 浣胯兘 // 鍜屽拰涓婇潰缁戝畾 鍚屾椂浣跨敤鏈夋晥
+            grid.Appearance.EvenRow.BackColor = Color.FromArgb(244, 248, 251);  // 璁剧疆鍋舵暟琛岄鑹�
+            grid.OptionsView.EnableAppearanceEvenRow = true;
+            grid.Appearance.OddRow.BackColor = Color.White; // 璁剧疆鍋舵暟琛岄鑹�
+
+            grid.RowHeight = height;
+            grid.BestFitColumns();
+
+            grid.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+            grid.OptionsFind.ShowCloseButton = false;
+            grid.OptionsFind.Behavior = FindPanelBehavior.Search;
+        }
+
+        /// <summary>
+        /// 闄愬埗鍔熻兘鐨勮鍥�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetLimitView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = false;
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = false;
+            grid.OptionsCustomization.AllowSort = false;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = false;
+            grid.OptionsBehavior.ReadOnly = true;
+
+            grid.OptionsView.EnableAppearanceOddRow = true;   // 浣胯兘 // 鍜屽拰涓婇潰缁戝畾 鍚屾椂浣跨敤鏈夋晥
+            grid.Appearance.EvenRow.BackColor = Color.FromArgb(244, 248, 251);  // 璁剧疆鍋舵暟琛岄鑹�
+            grid.OptionsView.EnableAppearanceEvenRow = true;
+            grid.Appearance.OddRow.BackColor = Color.White; // 璁剧疆鍋舵暟琛岄鑹�
+
+            grid.RowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.BestFitColumns();
+        }
+
+        /// <summary>
+        /// 鏅�氱紪杈戣鍥捐缃�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetNormalEditView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = true;
+
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = true;
+            grid.OptionsCustomization.AllowSort = true;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = true;
+            grid.OptionsBehavior.ReadOnly = false;
+
+            grid.OptionsView.EnableAppearanceOddRow = true;
+            grid.OptionsView.EnableAppearanceEvenRow = true;
+            grid.Appearance.OddRow.BackColor = Color.White;
+            grid.Appearance.EvenRow.BackColor = Color.FromArgb(244, 248, 251);
+
+            grid.RowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.BestFitColumns();
+
+            grid.OptionsFilter.AllowFilterEditor = false;
+        }
+
+        /// <summary>
+        /// 闄愬埗鍔熻兘鐨勭紪杈戣鍥�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetLimitEditView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = false;
+
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = false;
+            grid.OptionsCustomization.AllowSort = false;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = true;
+            grid.OptionsBehavior.ReadOnly = false;
+
+            grid.OptionsView.EnableAppearanceOddRow = true;   // 浣胯兘 // 鍜屽拰涓婇潰缁戝畾 鍚屾椂浣跨敤鏈夋晥
+            grid.Appearance.EvenRow.BackColor = Color.FromArgb(244, 248, 251);  // 璁剧疆鍋舵暟琛岄鑹�
+            grid.OptionsView.EnableAppearanceEvenRow = true;
+            grid.Appearance.OddRow.BackColor = Color.White; // 璁剧疆鍋舵暟琛岄鑹�
+
+            grid.RowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.BestFitColumns();
+        }
+
+        /// <summary>
+        /// 缁戝畾鏅�氱紪杈戣鍥捐缃�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetBindingNormalEditView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = true;
+
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = true;
+            grid.OptionsCustomization.AllowSort = true;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = true;
+            grid.OptionsBehavior.ReadOnly = false;
+
+            grid.RowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.BestFitColumns();
+        }
+
+        /// <summary>
+        /// 缁戝畾闄愬埗缂栬緫瑙嗗浘璁剧疆
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetBindingLimitEditView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = false;
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = false;
+            grid.OptionsCustomization.AllowSort = false;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = true;
+            grid.OptionsBehavior.ReadOnly = false;
+
+            grid.RowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.BestFitColumns();
+        }
+
+        /// <summary>
+        /// 鏄剧ずViewCaption
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void ShowViewCaption(this GridView grid, int height = 30)
+        {
+            grid.OptionsView.ShowViewCaption = true;
+            grid.ViewCaptionHeight = height;
+            grid.Appearance.ViewCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near;
+        }
+
+        /// <summary>
+        /// GridView娉ㄥ唽鏄剧ず琛屾爣
+        /// </summary>
+        /// <param name="grid"></param>
+        public static void RegistCustomDrawRowIndicator(this GridView grid, int IndicatorWidth = 35)
+        {
+            grid.OptionsView.ShowIndicator = true;
+            grid.IndicatorWidth = IndicatorWidth;
+            grid.CustomDrawRowIndicator += (sender, e) =>
+            {
+                if (e.Info.IsRowIndicator && e.RowHandle >= 0)
+                {
+                    e.Info.DisplayText = (e.RowHandle + 1).ToString().Trim();
+                    e.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
+                }
+            };
+        }
+
+        /// <summary>
+        /// 娉ㄥ唽鑷畾涔夌粍鍚�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="col"></param>
+        /// <param name="func"></param>
+        public static void RegistCustomGroupRow(this GridView grid, GridColumn col, Func<object, string> func)
+        {
+            grid.CustomDrawGroupRow += (sender, e) =>
+            {
+                var gridGroupRowInfo = e.Info as GridGroupRowInfo;
+                if (gridGroupRowInfo.Column == col)
+                {
+                    var index = grid.GetDataRowHandleByGroupRowHandle(e.RowHandle);
+                    var row = grid.GetRow(index);
+                    if (row == null)
+                        return;
+                    gridGroupRowInfo.GroupText = func(row);
+                }
+            };
+        }
+
+        /// <summary>
+        /// 鑷畾涔夊崟鍏冩牸鏍峰紡
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="bgColor"></param>
+        /// <param name="foreColor"></param>
+        public static void RegistCustomDrawCell(this GridView grid, System.Drawing.Color? bgColor = null, System.Drawing.Color? foreColor = null)
+        {
+            if (bgColor == null)
+                bgColor = System.Drawing.Color.FromArgb(0, 122, 204);
+            if (foreColor == null)
+                foreColor = System.Drawing.Color.White;
+            grid.CustomDrawCell += (sender, e) =>
+            {
+                if (e.RowHandle == (sender as GridView).FocusedRowHandle)
+                {
+                    var cell = e.Cell as DevExpress.XtraGrid.Views.Grid.ViewInfo.GridCellInfo;
+                    if (!cell.IsMerged)
+                    {
+                        e.Appearance.BackColor = bgColor.Value;
+                        e.Appearance.ForeColor = foreColor.Value;
+                    }
+                }
+            };
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠鏁版嵁琛�
+        /// </summary>
+        public static T GetCurrentViewModel<T>(this GridView grid, List<T> source) where T : class
+        {
+            if (source == null)
+                return default;
+            if (source.Count < 1)
+            {
+                return default;
+            }
+            var row = grid.GetFocusedRow() as T;
+            if (row == null)
+            {
+                return null;
+            }
+            return row;
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠鏁版嵁琛�
+        /// </summary>
+        public static T GetCurrentViewModel<T>(this GridView grid, BindingList<T> source) where T : class
+        {
+            if (source == null)
+                return default;
+            if (source.Count < 1)
+            {
+                return default;
+            }
+            var row = grid.GetFocusedRow() as T;
+            if (row == null)
+            {
+                return null;
+            }
+            return row;
+        }
+
+        #endregion 榛樿
+
+        /// <summary>
+        /// 缁戝畾鎸夊垪鍒嗙粍瑙嗗浘璁剧疆 Nsx_20210729
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="col"></param>
+        /// <param name="height"></param>
+        public static void SetGroupView(this GridView grid, GridColumn col, int height = 30)
+        {
+            grid.GroupCount = 1;
+            grid.RowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.OptionsBehavior.ReadOnly = true;
+            grid.OptionsBehavior.Editable = false;
+            grid.OptionsView.ShowDetailButtons = false;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+            grid.FocusRectStyle = DevExpress.XtraGrid.Views.Grid.DrawFocusRectStyle.RowFullFocus;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.OptionsBehavior.AllowFixedGroups = DevExpress.Utils.DefaultBoolean.True;
+            grid.OptionsBehavior.AllowPixelScrolling = DevExpress.Utils.DefaultBoolean.True;
+            grid.OptionsClipboard.ClipboardMode = DevExpress.Export.ClipboardMode.Formatted;
+            grid.OptionsBehavior.AutoExpandAllGroups = true;
+            grid.OptionsFind.AlwaysVisible = false;
+            grid.OptionsPrint.PrintHorzLines = false;
+            grid.OptionsPrint.PrintPreview = true;
+            grid.OptionsPrint.PrintVertLines = false;
+            grid.OptionsView.GroupDrawMode = DevExpress.XtraGrid.Views.Grid.GroupDrawMode.Office;
+            grid.OptionsView.ShowGroupedColumns = true;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsView.ShowIndicator = false;
+            grid.OptionsView.ShowVerticalLines = DevExpress.Utils.DefaultBoolean.False;
+            grid.PreviewFieldName = "PlainText";
+            grid.SortInfo.AddRange(new DevExpress.XtraGrid.Columns.GridColumnSortInfo[] {
+            new DevExpress.XtraGrid.Columns.GridColumnSortInfo(col, DevExpress.Data.ColumnSortOrder.None)});
+            grid.BestFitColumns();
+        }
+
+        /// <summary>
+        /// 瀵煎嚭Excel
+        /// </summary>
+        public static void ExportExcel(this GridView grid)
+        {
+            var path = ExcelSaveFilePathHelper.SaveFilePathName();
+            if (string.IsNullOrEmpty(path)) return;
+            grid.OptionsPrint.PrintDetails = true;//瀵煎嚭鏄庣粏
+            grid.OptionsPrint.ExpandAllDetails = true;//瀵煎嚭鎵�鏈夋槑缁嗭紝false鐨勮瘽锛屽彧浼氬鍑哄睍寮�鐨勬槑缁�
+            grid.ExportToXlsx(path, new DevExpress.XtraPrinting.XlsxExportOptionsEx() { ExportType = DevExpress.Export.ExportType.WYSIWYG, TextExportMode = DevExpress.XtraPrinting.TextExportMode.Text });
+            DialogResult dr = XtraMessageBox.Show("瀵煎嚭鎴愬姛锛佹槸鍚︽墦寮�鍒氬垰淇濆瓨鐨凟xcel鏂囦欢锛�", "鎻愮ず", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
+            if (dr != DialogResult.OK)
+                return;
+            System.Diagnostics.Process.Start(path);
+        }
+
+        /// <summary>
+        /// 瀵煎嚭Excel
+        /// </summary>
+        public static void ExportExcel(this GridView grid, DocumentPage page, string pageOperateInfo)
+        {
+            page.ShowCmdOperateInfo("瀵煎嚭鍒楄〃淇℃伅鍒癊xcel");
+            var path = ExcelSaveFilePathHelper.SaveFilePathName();
+            page.ShowCmdOperateInfo(pageOperateInfo);
+            if (string.IsNullOrEmpty(path)) return;
+            grid.OptionsPrint.PrintDetails = true;//瀵煎嚭鏄庣粏
+            grid.OptionsPrint.ExpandAllDetails = true;//瀵煎嚭鎵�鏈夋槑缁嗭紝false鐨勮瘽锛屽彧浼氬鍑哄睍寮�鐨勬槑缁�
+            grid.ExportToXlsx(path, new DevExpress.XtraPrinting.XlsxExportOptionsEx() { ExportType = DevExpress.Export.ExportType.WYSIWYG, TextExportMode = DevExpress.XtraPrinting.TextExportMode.Text });
+            DialogResult dr = XtraMessageBox.Show("瀵煎嚭鎴愬姛锛佹槸鍚︽墦寮�鍒氬垰淇濆瓨鐨凟xcel鏂囦欢锛�", "鎻愮ず", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
+            if (dr != DialogResult.OK)
+                return;
+            System.Diagnostics.Process.Start(path);
+        }
+
+        /// <summary>
+        /// 涓昏〃瑙嗗浘棰滆壊鏍峰紡璁剧疆
+        /// </summary>
+        /// <param name="grid"></param>
+        public static void SetGridMianViewColor(this GridView grid)
+        {
+            var focusRowColor = Color.FromName(Skin.FocusRowColor);
+            //鑱氱劍
+            grid.Appearance.FocusedRow.Options.UseBackColor = true;
+            grid.Appearance.FocusedRow.BackColor = focusRowColor;
+            grid.Appearance.FocusedCell.Options.UseBackColor = true;
+            grid.Appearance.FocusedCell.BackColor = focusRowColor;
+
+            //濂囧伓琛岄鑹�
+            grid.OptionsView.EnableAppearanceOddRow = true;
+            grid.Appearance.OddRow.Options.UseBackColor = true;
+            grid.Appearance.OddRow.BackColor = Color.FromName(Skin.OddRowColor);  // 璁剧疆濂囨暟琛岄鑹�
+
+            grid.OptionsView.EnableAppearanceEvenRow = true;
+            grid.Appearance.EvenRow.Options.UseBackColor = true;
+            grid.Appearance.EvenRow.BackColor = Color.FromName(Skin.EvenRowColor);  // 璁剧疆鍋舵暟琛岄鑹�
+        }
+
+        /// <summary>
+        /// 浠庤〃瑙嗗浘棰滆壊鏍峰紡璁剧疆
+        /// </summary>
+        /// <param name="grid"></param>
+        public static void SetGridSubViewColor(this GridView grid)
+        {
+            //鑱氱劍
+            grid.Appearance.FocusedRow.Options.UseBackColor = true;
+            grid.Appearance.FocusedRow.BackColor = Color.FromName(Skin.FocusRowColor);
+            grid.Appearance.FocusedCell.Options.UseBackColor = true;
+            grid.Appearance.FocusedCell.BackColor = Color.FromName(Skin.FocusRowColor);
+        }
+
+        /// <summary>
+        /// 鏅�氱紪杈戣鍥捐缃�
+        /// </summary>
+        /// <param name="grid"></param>
+        /// <param name="height"></param>
+        public static void SetDefaultEditView(this GridView grid, int height = 30)
+        {
+            grid.OptionsFind.FindNullPrompt = "妫�绱�";
+            grid.OptionsSelection.MultiSelect = false;
+            grid.OptionsMenu.EnableColumnMenu = true;
+
+            grid.OptionsSelection.EnableAppearanceFocusedCell = false;
+            grid.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            grid.FocusRectStyle = DrawFocusRectStyle.RowFullFocus;
+            grid.OptionsCustomization.AllowFilter = true;
+            grid.OptionsCustomization.AllowSort = true;
+            grid.OptionsCustomization.AllowQuickHideColumns = false;
+            grid.OptionsView.ShowAutoFilterRow = false;
+            grid.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never;
+            grid.OptionsView.NewItemRowPosition = NewItemRowPosition.None;
+            grid.OptionsView.ShowGroupPanel = false;
+            grid.OptionsClipboard.AllowCopy = DefaultBoolean.True;
+            grid.OptionsBehavior.Editable = true;
+            grid.OptionsBehavior.ReadOnly = false;
+
+            grid.OptionsView.EnableAppearanceOddRow = true;
+            grid.OptionsView.EnableAppearanceEvenRow = true;
+            grid.Appearance.OddRow.BackColor = Color.White;
+            grid.Appearance.EvenRow.BackColor = Color.FromArgb(244, 248, 251);
+
+            grid.RowHeight = height;
+            grid.ColumnPanelRowHeight = height;
+            grid.GroupRowHeight = height;
+            grid.BestFitColumns();
+        }
+
+        public class Skin
+        {
+            public static string ThemeStyle { get; set; } = "The Bezier";
+
+            public static string Style { get; set; } = "Office Colorful";
+
+            public string MainFromColor { get; set; } = "#0070C0";
+
+            public string ConfirmButtonColor { get; set; } = "#2960A4";
+
+            public string CancelButtonColor { get; set; } = "#F07409";
+
+            public string StartButtonColor { get; set; } = "#8DB3E2";
+
+            public static string FocusRowColor { get; set; } = "#2960A4";
+
+            public static string OddRowColor { get; set; } = "#D8D8D8";
+
+            public static string EvenRowColor { get; set; } = "#FFFFFF";
+        }
+
+        /// <summary>
+        /// 璁剧疆鎷栨嫿鐘舵�佷笅鐨勬櫘閫氳鍥�
+        /// </summary>
+        public static void SetDragNormalView<t>(this GridView rhs, int height = 30) where t : class
+        {
+            rhs.SetNormalView(height);
+
+            GridHitInfo downHitInfo = null;
+            rhs.MouseDown += (sender, e) =>
+            {
+                var view = sender as GridView;
+                downHitInfo = null;
+                if (view != null)
+                {
+                    GridHitInfo hitInfo = view.CalcHitInfo(new Point(e.X, e.Y));
+                    if (e.Button == MouseButtons.Left && hitInfo.InRow && hitInfo.HitTest != GridHitTest.RowIndicator)
+                    {
+                        downHitInfo = hitInfo;
+                    }
+                }
+            };
+
+            rhs.MouseMove += (sender, e) =>
+            {
+                var view = sender as GridView;
+                if (e.Button == MouseButtons.Left && downHitInfo != null)
+                {
+                    Size dragSize = SystemInformation.DragSize;
+                    Rectangle dragRect = new Rectangle(new Point(downHitInfo.HitPoint.X - dragSize.Width / 2, downHitInfo.HitPoint.Y - dragSize.Height / 2), dragSize);
+
+                    if (!dragRect.Contains(new Point(e.X, e.Y)))
+                    {
+                        if (view != null)
+                        {
+                            var dragVm = view.GetSelectedRows().Select(rownum => view.GetRow(rownum) as t).FirstOrDefault();
+                            if (dragVm != null)
+                            {
+                                view.GridControl.DoDragDrop(dragVm, DragDropEffects.Move);
+                            }
+                        }
+                        downHitInfo = null;
+                        DevExpress.Utils.DXMouseEventArgs.GetMouseArgs(e).Handled = true;
+                    }
+                }
+            };
+        }
+    }
+}
\ No newline at end of file
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ImageExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ImageExtend.cs"
new file mode 100644
index 0000000..ba67f7e
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ImageExtend.cs"
@@ -0,0 +1,37 @@
+锘縰sing System.Drawing;
+
+namespace ISupply.WinFrmUI
+{
+    public static class ImageExtend
+    {
+        /// <summary>
+        /// 灏嗘寚瀹氬浘鐗囪浆鍖栦负鎸囧畾灏哄,Image瀵硅薄鑷甫鑾峰彇缂╃暐鍥剧殑鏂规硶GetThumbnailImage
+        /// </summary>
+        /// <param name="img"></param>
+        /// <param name="width"></param>
+        /// <param name="height"></param>
+        /// <returns></returns>
+        public static Image GetCustomizedImage(this Image img, int width, int height)
+        {
+            var bp = new Bitmap(width, height);
+            //绋嬪簭浣跨敤璁惧鐨凞PI鍒涘缓鍥剧墖锛屾墍浠ヤ唬鐮佹敞閲�
+            //using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
+            //{
+            //    float dpiX = g.DpiX;
+            //    float dpiY = g.DpiY;
+            //    bp.SetResolution((int)dpiX, (int)dpiY);
+            //}
+            using (Graphics g = Graphics.FromImage(bp))
+            {
+                Rectangle resultRectangle = new Rectangle(0, 0, width, height);
+                Rectangle sourceRectangle = new Rectangle(0, 0, img.Width, img.Height);
+                g.DrawImage(img, resultRectangle, sourceRectangle, GraphicsUnit.Pixel);
+            }
+            return bp;
+        }
+
+
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/LayoutControlExtensions.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/LayoutControlExtensions.cs"
new file mode 100644
index 0000000..34997af
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/LayoutControlExtensions.cs"
@@ -0,0 +1,21 @@
+锘縰sing DevExpress.XtraLayout;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// layoutControl鎷撳睍绫�
+    /// </summary>
+    public static class LayoutControlExtensions
+    {
+        /// <summary>
+        /// 璁剧疆
+        /// </summary>
+        /// <param name="layout"></param>
+        public static void SetupLayoutControl(this LayoutControl layout)
+        {
+            layout.AllowCustomization = false;
+            layout.OptionsView.UseParentAutoScaleFactor = true;
+        }
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ListBoxControlExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ListBoxControlExtend.cs"
new file mode 100644
index 0000000..05f2c66
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/ListBoxControlExtend.cs"
@@ -0,0 +1,13 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace ISupply.WinFrmUI
+{
+    public static class ListBoxControlExtend
+    {
+        public static void InitialDefaultSettings(this ListBoxControl listBox, int ItemHeight = 25)
+        {
+            listBox.ShowFocusRect = false;
+            listBox.ItemHeight = ItemHeight;
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/LookUpEditExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/LookUpEditExtend.cs"
new file mode 100644
index 0000000..36a7d8d
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/LookUpEditExtend.cs"
@@ -0,0 +1,27 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// LookUpEdit鎷撳睍绫�
+    /// </summary>
+    public static class LookUpEditExtend
+    {
+        /// <summary>
+        /// 璁剧疆鎴怌ombo鐨勬樉绀烘晥鏋�
+        /// </summary>
+        /// <param name="lookUp"></param>
+        public static void SetAsCombo(this LookUpEdit lookUp)
+        {
+            lookUp.Properties.AllowFocused = false;
+            lookUp.Properties.NullText = string.Empty;
+            lookUp.Properties.ShowFooter = false;
+            lookUp.Properties.ShowHeader = false;
+            lookUp.Properties.ShowLines = false;
+        }
+
+
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/MessageBoxShow.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/MessageBoxShow.cs"
new file mode 100644
index 0000000..da7568a
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/MessageBoxShow.cs"
@@ -0,0 +1,50 @@
+锘縰sing DevExpress.XtraEditors;
+using System.Windows.Forms;
+
+namespace ISupply.WinFrmUI
+{
+    public static class MyMessageBox
+    {
+        public static void InfomationShow(string str)
+        {
+            if (System.Globalization.CultureInfo.CurrentCulture.Name.Equals("zh-CN"))
+            {
+                XtraMessageBox.Show(str, "鎻愮ず淇℃伅", MessageBoxButtons.OK, MessageBoxIcon.Information);
+            }
+            else
+            {
+                XtraMessageBox.Show(str, "Notice", MessageBoxButtons.OK, MessageBoxIcon.Information);
+            }
+        }
+
+        public static DialogResult WarningShow(string str)
+        {
+            if (System.Globalization.CultureInfo.CurrentCulture.Name.Equals("zh-CN"))
+            {
+                return XtraMessageBox.Show(str, "璀﹀憡", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
+            }
+            else
+            {
+                return XtraMessageBox.Show(str, "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
+            }
+        }
+
+        public static DialogResult StopShow(string str)
+        {
+            if (System.Globalization.CultureInfo.CurrentCulture.Name.Equals("zh-CN"))
+            {
+                return XtraMessageBox.Show(str, "閿欒", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+            }
+            else
+            {
+                return XtraMessageBox.Show(str, "Error", MessageBoxButtons.OK, MessageBoxIcon.Stop);
+            }
+        }
+
+
+
+
+    }
+
+
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/RibbonControlExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/RibbonControlExtend.cs"
new file mode 100644
index 0000000..da12945
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/RibbonControlExtend.cs"
@@ -0,0 +1,21 @@
+锘縰sing DevExpress.XtraBars.Ribbon;
+
+namespace ISupply.WinFrmUI
+{
+    public static class RibbonControlExtend
+    {
+        /// <summary>
+        /// 璁剧疆甯歌瑙嗗浘
+        /// </summary>
+        public static void SetNormalView(this RibbonControl rc)
+        {
+            rc.DrawGroupsBorderMode = DevExpress.Utils.DefaultBoolean.True;
+            rc.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
+            //rc.OptionsMenuMinWidth = 300;
+            rc.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
+            rc.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide;
+            rc.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden;
+            rc.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonControlStyle.Office2013;
+        }
+    }
+}
\ No newline at end of file
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/SearchLookUpEditExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/SearchLookUpEditExtend.cs"
new file mode 100644
index 0000000..930f3da
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/SearchLookUpEditExtend.cs"
@@ -0,0 +1,29 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraEditors;
+using System.Drawing;
+
+namespace ISupply.WinFrmUI
+{
+    /// <summary>
+    /// SearchLookUpEdit
+    /// </summary>
+    public static class SearchLookUpEditExtend
+    {
+        /// <summary>
+        /// 璁剧疆榛樿
+        /// </summary> 
+        public static void SetDefaultView(this SearchLookUpEdit rhs, int height = 250)
+        {
+            rhs.Properties.AllowFocused = false;
+            rhs.Properties.NullText = "";
+            rhs.Properties.ShowClearButton = false;
+            var width = rhs.Size.Width - 105;
+            rhs.Properties.PopupFormSize = new Size(width, height);
+            rhs.Properties.Appearance.TextOptions.HAlignment = HorzAlignment.Center;
+        }
+
+
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TextEditExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TextEditExtend.cs"
new file mode 100644
index 0000000..72f50a5
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TextEditExtend.cs"
@@ -0,0 +1,21 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace ISupply.WinFrmUI
+{
+    public static class TextEditExtend
+    {
+        /// <summary>
+        /// 鍙兘杈撳叆鏁板瓧
+        /// </summary> 
+        public static void SetNumeric(this TextEdit txt)
+        {
+            txt.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric;
+            // txt.Properties.Mask.UseMaskAsDisplayFormat = true;
+            txt.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.True;
+            txt.Text = string.Empty;
+        }
+
+
+
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TileControlExtensions.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TileControlExtensions.cs"
new file mode 100644
index 0000000..890b69f
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TileControlExtensions.cs"
@@ -0,0 +1,60 @@
+锘縰sing DevExpress.XtraEditors;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace ISupply.WinFrmUI
+{
+    public static class TileControlExtensions
+    {
+        /// <summary>
+        /// Peek寮瑰嚭璁剧疆
+        /// </summary>
+        /// <param name="tc"></param>
+        public static void SetForPeek(this TileControl tc)
+        {
+            tc.AllowItemHover = true;
+            tc.AllowGlyphSkinning = true;
+            tc.AllowDrag = false;
+            tc.LayoutMode = TileControlLayoutMode.Adaptive;
+            tc.Orientation = Orientation.Vertical;
+            tc.ItemBorderVisibility = TileItemBorderVisibility.Never;
+            tc.OptionsAdaptiveLayout.ItemMinSize = new Size(200, 50);
+            tc.Padding = new Padding(0);
+            tc.ItemPadding = new Padding(15);
+            tc.IndentBetweenItems = 0;
+            tc.AppearanceItem.Normal.BackColor = Color.White;
+            tc.AppearanceItem.Normal.ForeColor = Color.FromArgb(63, 63, 63);
+            tc.AppearanceItem.Hovered.BackColor = Color.FromArgb(0, 122, 204);
+            tc.AppearanceItem.Hovered.ForeColor = Color.White;
+        }
+
+        /// <summary>
+        /// Peek寮瑰嚭璁剧疆
+        /// </summary>
+        /// <param name="tc"></param>
+        public static void SetForPeek2(this TileControl tc)
+        {
+            tc.AllowItemHover = true;
+            tc.AllowGlyphSkinning = true;
+            tc.AllowDrag = false;
+            tc.LayoutMode = TileControlLayoutMode.Adaptive;
+            tc.Orientation = Orientation.Vertical;
+            tc.ItemBorderVisibility = TileItemBorderVisibility.Never;
+            tc.OptionsAdaptiveLayout.ItemMinSize = new Size(180, 50);
+            tc.Padding = new Padding(0);
+            tc.ItemPadding = new Padding(5);
+            tc.IndentBetweenItems = 0;
+
+            tc.AppearanceItem.Normal.BackColor = Color.White;
+            tc.AppearanceItem.Normal.ForeColor = Color.FromArgb(63, 63, 63);
+            tc.AppearanceItem.Hovered.BackColor = Color.FromArgb(0, 122, 204);
+            tc.AppearanceItem.Hovered.ForeColor = Color.White;
+
+            /*tc.AppearanceItem.Normal.BackColor = Color.FromArgb(63, 63, 63);
+            tc.AppearanceItem.Normal.ForeColor = Color.White;
+
+            tc.AppearanceItem.Hovered.BackColor = Color.White;
+            tc.AppearanceItem.Hovered.ForeColor = Color.FromArgb(0, 122, 204); */
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TilePeekItemsExtensions.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TilePeekItemsExtensions.cs"
new file mode 100644
index 0000000..0e7fa80
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TilePeekItemsExtensions.cs"
@@ -0,0 +1,84 @@
+锘縰sing DevExpress.XtraEditors;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HStation.WinFrmUI
+{
+    public static class TilePeekItemsExtensions
+    {
+        /// <summary>
+        /// 鍒涘缓寮瑰嚭闈㈡澘
+        /// </summary>
+        /// <param name="items"></param>
+        /// <param name="dele"></param>
+        /// <returns></returns>
+        public static Control CreatePeekCtrl(this List<TilePeekItem> items, Action<TilePeekItem> dele)
+        {
+            var tc = new TileControl();
+            tc.SetForPeek();
+
+            var group = new DevExpress.XtraEditors.TileGroup();
+            tc.Groups.Add(group);
+            tc.BeginUpdate();
+            items.ForEach(x =>
+            {
+                TileItem item = new TileItem();
+                item.Text = x.Caption;
+                item.ImageScaleMode = TileItemImageScaleMode.Default;
+                item.ImageToTextAlignment = TileControlImageToTextAlignment.Left;
+                item.ImageAlignment = TileItemContentAlignment.MiddleLeft;
+                item.ImageToTextIndent = 15;
+                item.ImageOptions.Image = x.Image;
+                item.ImageOptions.SvgImage = x.SvgImage;
+                item.ImageOptions.SvgImageSize = x.SvgImageSize;
+                item.ItemClick += delegate { dele(x); };
+                item.Enabled = x.Enable;
+                x.EnableChangedEvent += bol => item.Enabled = bol;
+                item.Tag = x.Tag;
+                group.Items.Add(item);
+            });
+            tc.EndUpdate();
+            tc.Size = new Size(tc.OptionsAdaptiveLayout.ItemMinSize.Width, group.Items.Count * tc.OptionsAdaptiveLayout.ItemMinSize.Height);
+            return tc;
+        }
+
+        /// <summary>
+        /// 鍒涘缓寮瑰嚭闈㈡澘
+        /// </summary>
+        /// <param name="items"></param> 
+        public static Control CreatePeekCtrl(this List<TilePeekItem> items, int width, int height)
+        {
+            var tileCtrl = new TileControl();
+            tileCtrl.SetForPeek();
+            var group = new DevExpress.XtraEditors.TileGroup();
+            tileCtrl.Groups.Add(group);
+            tileCtrl.BeginUpdate();
+            foreach (var peekItem in items)
+            {
+                var item = new TileItem();
+                item.Text = peekItem.Caption;
+                item.AppearanceItem.Normal.ForeColor = Color.Black;
+                item.AppearanceItem.Disabled.ForeColor = Color.Black;
+                item.AppearanceItem.Hovered.ForeColor = Color.Black;
+                item.AppearanceItem.Pressed.ForeColor = Color.Black;
+                item.ImageScaleMode = TileItemImageScaleMode.Default;
+                item.ImageToTextAlignment = TileControlImageToTextAlignment.Left;
+                item.ImageAlignment = TileItemContentAlignment.MiddleLeft;
+                item.ImageToTextIndent = 15;
+                item.ImageOptions.Image = peekItem.Image;
+                item.ImageOptions.SvgImage = peekItem.SvgImage;
+                item.ImageOptions.SvgImageSize = peekItem.SvgImageSize;
+                item.ItemClick += delegate { if (peekItem.Click != null) peekItem.Click(); };
+                item.Enabled = peekItem.Enable;
+                peekItem.EnableChangedEvent += bol => item.Enabled = bol;
+                item.Tag = peekItem.Tag;
+                group.Items.Add(item);
+            }
+            tileCtrl.EndUpdate();
+            tileCtrl.Size = new Size(tileCtrl.OptionsAdaptiveLayout.ItemMinSize.Width, group.Items.Count * tileCtrl.OptionsAdaptiveLayout.ItemMinSize.Height);
+            return tileCtrl;
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TokenEditExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TokenEditExtend.cs"
new file mode 100644
index 0000000..a23d80a
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TokenEditExtend.cs"
@@ -0,0 +1,28 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace ISupply.WinFrmUI
+{
+    public static class TokenEditExtend
+    {
+        /// <summary>
+        /// 鍒濆鍖栭粯璁よ缃�
+        /// </summary>
+        /// <param name="rhs"></param>
+        /// <param name="SeparatorChar"></param>
+        public static void InitDefaultSettings(this TokenEdit rhs, char SeparatorChar = ',')
+        {
+            rhs.Properties.ShowDropDown = true;
+            rhs.Properties.DropDownRowCount = 5;
+            rhs.Properties.CheckMode = TokenEditCheckMode.Default;
+            rhs.Properties.MaxExpandLines = 5;
+            rhs.Properties.PopupPanelOptions.ShowPopupPanel = true;
+            rhs.Properties.PopupPanelOptions.Location = TokenEditPopupPanelLocation.BelowToken;
+            rhs.Properties.ShowRemoveTokenButtons = false;
+            rhs.Properties.PopupSizeable = false;
+            rhs.Properties.TokenGlyphLocation = TokenEditGlyphLocation.Left;
+            rhs.Properties.EditValueSeparatorChar = SeparatorChar;
+            rhs.Properties.AutoHeightMode = TokenEditAutoHeightMode.RestrictedExpand;
+            rhs.ShowPopup();
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TreeListExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TreeListExtend.cs"
new file mode 100644
index 0000000..e3e7c1e
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/TreeListExtend.cs"
@@ -0,0 +1,310 @@
+锘縰sing DevExpress.Utils.Drawing;
+using DevExpress.XtraEditors;
+using DevExpress.XtraTreeList;
+using DevExpress.XtraTreeList.Columns;
+using DevExpress.XtraTreeList.Nodes;
+using System.Collections;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace ISupply.WinFrmUI
+{
+    public static class TreeListExtend
+    {
+        /// <summary>
+        /// 鏍规嵁clinet point 鑾峰彇鑺傜偣
+        /// </summary>
+        /// <param name="rhs"></param>
+        /// <param name="cp"></param>
+        /// <returns></returns>
+        public static TreeListNode GetNodeByCP(this TreeList rhs, Point cp)
+        {
+            Point pt = rhs.PointToClient(cp);
+            DevExpress.XtraTreeList.TreeListHitInfo ht = rhs.CalcHitInfo(pt);
+            TreeListNode node = ht.Node;
+            if (node is TreeListAutoFilterNode)
+                return null;
+            return node;
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栭粯璁よ缃�
+        /// </summary>
+        /// <param name="rhs"></param>
+        /// <param name="height"></param>
+        public static void InitialDefaultSettings(this TreeList rhs, int height = 30)
+        {
+            rhs.OptionsBehavior.Editable = false;
+            rhs.OptionsBehavior.ReadOnly = true;
+            rhs.OptionsSelection.EnableAppearanceFocusedCell = false;
+            rhs.OptionsMenu.EnableNodeMenu = false;
+            rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
+            rhs.OptionsSelection.SelectNodesOnRightClick = true;
+            rhs.ViewStyle = TreeListViewStyle.TreeView;
+            rhs.RowHeight = height;
+
+
+
+            rhs.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+            rhs.OptionsFind.ShowCloseButton = false;
+            rhs.OptionsFind.Behavior = FindPanelBehavior.Search;
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栧閫夋璁剧疆
+        /// </summary>
+        /// <param name="rhs"></param>
+        /// <param name="checkBoxFieldName"></param>
+        /// <param name="height"></param>
+        public static void InitialDefaultMultiSelectSettings(this TreeList rhs, string checkBoxFieldName = "Checked", int height = 30)
+        {
+            InitialDefaultSettings(rhs, height);
+            rhs.CheckBoxFieldName = checkBoxFieldName;//澶氶�夋缁戝畾鍒楀悕
+            rhs.OptionsBehavior.AllowRecursiveNodeChecking = true;//鑾峰彇鎴栬缃埗鑺傜偣鏃舵槸鍚﹁嚜鍔ㄦ鏌�/鍙栨秷妫�鏌ュ瓙鑺傜偣   
+            rhs.OptionsView.CheckBoxStyle = DevExpress.XtraTreeList.DefaultNodeCheckBoxStyle.Check;//璁剧疆鍕鹃�夋鏍峰紡
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栧彲缂栬緫瑙嗗浘
+        /// </summary> 
+        public static void InitialBindingNormalEditView(this TreeList rhs, int height = 30)
+        {
+            rhs.OptionsSelection.EnableAppearanceFocusedCell = false;
+            rhs.OptionsMenu.EnableNodeMenu = false;
+            rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
+            rhs.OptionsSelection.SelectNodesOnRightClick = true;
+            rhs.OptionsMenu.EnableColumnMenu = false;
+            rhs.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            rhs.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Near;
+            rhs.RowHeight = height;
+        }
+
+        /// <summary>
+        /// 澶氬垪鏄剧ず璁剧疆
+        /// </summary>
+        /// <param name="rhs"></param>
+        /// <param name="height"></param>
+        public static void InitialMultiColSettings(this TreeList rhs, int height = 30)
+        {
+            rhs.OptionsBehavior.Editable = false;
+            rhs.OptionsBehavior.ReadOnly = true;
+            rhs.OptionsSelection.EnableAppearanceFocusedCell = false;
+            rhs.OptionsMenu.EnableNodeMenu = false;
+            rhs.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
+            rhs.OptionsSelection.SelectNodesOnRightClick = true;
+            rhs.OptionsMenu.EnableColumnMenu = false;
+            rhs.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            rhs.Appearance.Row.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            rhs.RowHeight = height;
+
+            rhs.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+            rhs.OptionsFind.ShowCloseButton = false;
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栧閫夋璁剧疆
+        /// </summary>
+        /// <param name="rhs"></param>
+        /// <param name="checkBoxFieldName"></param>
+        /// <param name="height"></param>
+        public static void InitialMultiColMultiSelectSettings(this TreeList rhs, string checkBoxFieldName = "Checked", int height = 30)
+        {
+            InitialDefaultSettings(rhs, height);
+            rhs.CheckBoxFieldName = checkBoxFieldName;//澶氶�夋缁戝畾鍒楀悕
+            rhs.OptionsBehavior.AllowRecursiveNodeChecking = true;//鑾峰彇鎴栬缃埗鑺傜偣鏃舵槸鍚﹁嚜鍔ㄦ鏌�/鍙栨秷妫�鏌ュ瓙鑺傜偣   
+            rhs.OptionsView.CheckBoxStyle = DevExpress.XtraTreeList.DefaultNodeCheckBoxStyle.Check;//璁剧疆鍕鹃�夋鏍峰紡
+        }
+
+        /// <summary>
+        /// TreeList娉ㄥ唽鏄剧ず琛屾爣
+        /// </summary>
+        /// <param name="tree"></param>
+        public static void RegistCustomDrawRowIndicator(this TreeList tree, int IndicatorWidth = 35)
+        {
+            tree.OptionsView.ShowIndicator = true;
+            tree.IndicatorWidth = IndicatorWidth;
+            tree.CustomDrawNodeIndicator += (sender, e) =>
+            {
+                IndicatorObjectInfoArgs args = e.ObjectArgs as IndicatorObjectInfoArgs;
+                args.DisplayText = (tree.GetVisibleIndexByNode(e.Node) + 1).ToString();
+            };
+        }
+
+        //娓愬彉鑹�
+        public static void RegistCustomDrawNodeCell(this TreeList rhs, System.Drawing.Color? bgColor = null, System.Drawing.Color? foreColor = null)
+        {
+            if (bgColor == null)
+                bgColor = System.Drawing.Color.FromArgb(0, 122, 204);
+            if (foreColor == null)
+                foreColor = System.Drawing.Color.White;
+            rhs.CustomDrawNodeCell += (sender, e) =>
+            {
+                if (e.Node == (sender as TreeList).FocusedNode)
+                {
+                    e.Appearance.BackColor = bgColor.Value;
+                    e.Appearance.ForeColor = foreColor.Value;
+                }
+            };
+        }
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠鏁版嵁琛�
+        /// </summary>
+        public static T GetCurrentViewModel<T>(this TreeList tree, IEnumerable<T> source) where T : class
+        {
+            if (source == null)
+                return default;
+            if (source.Count() < 1)
+            {
+                return default;
+            }
+            var row = tree.GetFocusedRow() as T;
+            if (row == null)
+            {
+                return null;
+            }
+            return row;
+        }
+
+
+        /// <summary>
+        /// 瀵煎嚭Excel
+        /// </summary> 
+        public static void ExportExcel(this TreeList tree, DocumentPage page, string pageOperateInfo)
+        {
+            page.ShowCmdOperateInfo("瀵煎嚭鍒楄〃淇℃伅鍒癊xcel");
+            var path = ExcelSaveFilePathHelper.SaveFilePathName();
+            page.ShowCmdOperateInfo(pageOperateInfo);
+            if (string.IsNullOrEmpty(path)) return;
+            tree.OptionsPrint.PrintAllNodes = true;//瀵煎嚭鏄庣粏
+            tree.OptionsPrint.PrintTree = true;//瀵煎嚭鎵�鏈夋槑缁嗭紝false鐨勮瘽锛屽彧浼氬鍑哄睍寮�鐨勬槑缁�
+            tree.ExportToXlsx(path, new DevExpress.XtraPrinting.XlsxExportOptionsEx() { ExportType = DevExpress.Export.ExportType.WYSIWYG, TextExportMode = DevExpress.XtraPrinting.TextExportMode.Text });
+            DialogResult dr = XtraMessageBox.Show("瀵煎嚭鎴愬姛锛佹槸鍚︽墦寮�鍒氬垰淇濆瓨鐨凟xcel鏂囦欢锛�", "鎻愮ず", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
+            if (dr != DialogResult.OK)
+                return;
+            System.Diagnostics.Process.Start(path);
+        }
+
+        /// <summary>
+        /// 璁剧疆鎷栨嫿鐘舵�佷笅鐨勬櫘閫氳鍥�
+        /// </summary> 
+        public static void SetDragViewModels<t>(this TreeList rhs) where t : class
+        {
+            rhs.DragDrop += (sender, e) =>
+            {
+                TreeListNode node = (TreeListNode)e.Data.GetData(typeof(TreeListNode));
+                if (node == null) return;
+                TreeList list = (TreeList)sender;
+                if (list == node.TreeList) return;
+                TreeListHitInfo info = list.CalcHitInfo(list.PointToClient(new Point(e.X, e.Y)));
+                InsertBrush(list, node, info.Node == null ? -1 : info.Node.Id);
+            };
+        }
+
+        private static void InsertBrush(TreeList list, TreeListNode node, int parent)
+        {
+            ArrayList data = new ArrayList();
+            foreach (TreeListColumn column in node.TreeList.Columns)
+            {
+                data.Add(node[column]);
+            }
+            parent = list.AppendNode(data.ToArray(), parent).Id;
+
+            if (node.HasChildren)
+                foreach (TreeListNode n in node.Nodes)
+                    InsertBrush(list, n, parent);
+        }
+
+
+
+        #region 鍒锋柊閫変腑鑺傜偣
+        private static List<TreeListNode> _haveChildNodes = null;
+        public static void RefreshCheckeState(this TreeList rhs)
+        {
+            if (rhs.OptionsView.CheckBoxStyle != DevExpress.XtraTreeList.DefaultNodeCheckBoxStyle.Check)
+                return;
+            _haveChildNodes = new List<TreeListNode>();
+            foreach (TreeListNode node in rhs.Nodes)
+            {
+                GetHaveChildNode(node);
+            }
+            if (_haveChildNodes != null && _haveChildNodes.Count > 0)
+            {
+                _haveChildNodes.Reverse();
+                foreach (var node in _haveChildNodes)
+                {
+                    if (node.Nodes != null && node.Nodes.Any())
+                    {
+                        foreach (var childNode in node.Nodes)
+                        {
+
+                        }
+                        var checkCount = node.Nodes.Where(x => x.Checked).Count();
+                        if (checkCount == 0)
+                        {
+                            node.CheckState = CheckState.Unchecked;
+                        }
+                        else if (checkCount == node.Nodes.Count)
+                        {
+                            node.CheckState = CheckState.Checked;
+                        }
+                        else
+                        {
+                            node.CheckState = CheckState.Indeterminate;
+                        }
+                    }
+                }
+            }
+            _haveChildNodes = null;
+        }
+
+        private static void GetHaveChildNode(TreeListNode node)
+        {
+            if (node.Nodes.Count > 0)
+            {
+                _haveChildNodes.Add(node);
+
+                foreach (TreeListNode childNode in node.Nodes)
+                {
+                    GetHaveChildNode(childNode);
+                }
+            }
+        }
+        #endregion
+
+    }
+}
+
+
+
+/*/// <summary>
+/// 璁剧疆鎷栨嫿鐘舵�佷笅鐨勬櫘閫氳鍥�
+/// </summary> 
+public static void SetDragViewModels<t>(this TreeList rhs) where t : class
+{
+    rhs.DragDrop += (sender, e) =>
+    {
+        TreeListNode node = (TreeListNode)e.Data.GetData(typeof(TreeListNode));
+        if (node == null) return;
+        TreeList list = (TreeList)sender;
+        if (list == node.TreeList) return;
+        TreeListHitInfo info = list.CalcHitInfo(list.PointToClient(new Point(e.X, e.Y)));
+        InsertBrush(list, node, info.Node == null ? -1 : info.Node.Id);
+    };
+}
+
+private static void InsertBrush(TreeList list, TreeListNode node, int parent)
+{
+    ArrayList data = new ArrayList();
+    foreach (TreeListColumn column in node.TreeList.Columns)
+    {
+        data.Add(node[column]);
+    }
+    parent = list.AppendNode(data.ToArray(), parent).Id;
+
+    if (node.HasChildren)
+        foreach (TreeListNode n in node.Nodes)
+            InsertBrush(list, n, parent);
+}*/
\ No newline at end of file
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/XtraChartHelper.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/XtraChartHelper.cs"
new file mode 100644
index 0000000..328db7a
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/XtraChartHelper.cs"
@@ -0,0 +1,96 @@
+锘�//using System.Data.SqlClient;
+using DevExpress.XtraCharts;
+
+namespace ISupply.WinFrmUI
+{
+    //鎷撳睍XtraChart
+    public class XtraChartHelper
+    {
+        #region SetAxisRange
+        public static void SetAxisRange(AxisX axis, double minValue, double maxValue)
+        {
+            axis.NumericScaleOptions.AutoGrid = false;
+
+            axis.VisualRange.Auto = false;
+            axis.WholeRange.Auto = false;
+            axis.WholeRange.SideMarginsValue = 0;
+            axis.VisualRange.SideMarginsValue = 0;
+            axis.WholeRange.SetMinMaxValues(minValue, maxValue);
+            axis.VisualRange.SetMinMaxValues(minValue, maxValue);
+            axis.WholeRange.AlwaysShowZeroLevel = false;
+        }
+
+        public static void SetAxisRange(SecondaryAxisX axis, double minValue, double maxValue)
+        {
+            axis.NumericScaleOptions.AutoGrid = false;
+
+            axis.VisualRange.Auto = false;
+            axis.WholeRange.Auto = false;
+            axis.WholeRange.SideMarginsValue = 0;
+            axis.VisualRange.SideMarginsValue = 0;
+            axis.WholeRange.SetMinMaxValues(minValue, maxValue);
+            axis.VisualRange.SetMinMaxValues(minValue, maxValue);
+            axis.WholeRange.AlwaysShowZeroLevel = false;
+        }
+
+        public static void SetAxisRange(AxisY axis, double minValue, double maxValue)
+        {
+            axis.NumericScaleOptions.AutoGrid = false;
+
+            axis.VisualRange.Auto = false;
+            axis.WholeRange.Auto = false;
+            axis.WholeRange.SideMarginsValue = 0;
+            axis.VisualRange.SideMarginsValue = 0;
+            axis.WholeRange.AutoSideMargins = false;
+            axis.VisualRange.AutoSideMargins = false;
+            axis.WholeRange.SetMinMaxValues(minValue, maxValue);
+            axis.VisualRange.SetMinMaxValues(minValue, maxValue);
+            axis.WholeRange.AlwaysShowZeroLevel = false;
+        }
+        public static void SetAxisRange(SecondaryAxisY axis, double minValue, double maxValue)
+        {
+            axis.NumericScaleOptions.AutoGrid = false;
+
+            axis.VisualRange.Auto = false;
+            axis.WholeRange.Auto = false;
+            axis.WholeRange.SideMarginsValue = 0;
+            axis.VisualRange.SideMarginsValue = 0;
+            axis.WholeRange.AutoSideMargins = false;
+            axis.VisualRange.AutoSideMargins = false;
+            axis.WholeRange.SetMinMaxValues(minValue, maxValue);
+            axis.VisualRange.SetMinMaxValues(minValue, maxValue);
+            axis.WholeRange.AlwaysShowZeroLevel = false;
+        }
+        public static void SetAxisRange(AxisY axis, double minValueWhole, double maxValueWhole,
+            double minValueVisual, double maxValueVisual)
+        {
+            axis.NumericScaleOptions.AutoGrid = false;
+
+            axis.VisualRange.Auto = false;
+            axis.WholeRange.Auto = false;
+            axis.WholeRange.SideMarginsValue = 0;
+            axis.VisualRange.SideMarginsValue = 0;
+            axis.WholeRange.SetMinMaxValues(minValueWhole, maxValueWhole);
+            axis.VisualRange.SetMinMaxValues(minValueVisual, maxValueVisual);
+            axis.WholeRange.AlwaysShowZeroLevel = false;
+        }
+        public static void SetAxisRange(SecondaryAxisY axis, double minValueWhole, double maxValueWhole,
+            double minValueVisual, double maxValueVisual)
+        {
+            axis.NumericScaleOptions.AutoGrid = false;
+
+            axis.VisualRange.Auto = false;
+            axis.WholeRange.Auto = false;
+            axis.WholeRange.SideMarginsValue = 0;
+            axis.VisualRange.SideMarginsValue = 0;
+            axis.WholeRange.SetMinMaxValues(minValueWhole, maxValueWhole);
+            axis.VisualRange.SetMinMaxValues(minValueVisual, maxValueVisual);
+            axis.WholeRange.AlwaysShowZeroLevel = false;
+        }
+        #endregion
+
+
+
+    }
+
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/XtraFormExtend.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/XtraFormExtend.cs"
new file mode 100644
index 0000000..e9fb79e
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/01-\346\211\251\345\261\225\347\261\273/XtraFormExtend.cs"
@@ -0,0 +1,14 @@
+锘縰sing DevExpress.XtraEditors;
+using System.Drawing;
+
+namespace ISupply.WinFrmUI
+{
+    public static class XtraFormExtend
+    {
+        public static void SetGlowEffect(this XtraForm form)
+        {
+            form.ActiveGlowColor = Color.FromArgb(0, 122, 204);
+            form.FormBorderEffect = FormBorderEffect.Glow;
+        }
+    }
+}
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/\346\217\220\347\244\272\345\274\271\347\252\227/MessageBoxHelper.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-\346\217\220\347\244\272\345\274\271\347\252\227/MessageBoxHelper.cs"
similarity index 100%
rename from "WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/\346\217\220\347\244\272\345\274\271\347\252\227/MessageBoxHelper.cs"
rename to "WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/02-\346\217\220\347\244\272\345\274\271\347\252\227/MessageBoxHelper.cs"
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-\346\226\207\344\273\266\345\270\256\345\212\251\347\261\273/DataTabelToList.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-\346\226\207\344\273\266\345\270\256\345\212\251\347\261\273/DataTabelToList.cs"
new file mode 100644
index 0000000..dc6c836
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-\346\226\207\344\273\266\345\270\256\345\212\251\347\261\273/DataTabelToList.cs"
@@ -0,0 +1,48 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Data;
+using System.Reflection;
+
+namespace HStation.WinFrmUI
+{
+    public class DataTabelToList
+    {
+        public List<T> TableToEntity<T>(DataTable dt) where T : new()
+        {
+            //瀹氫箟闆嗗悎
+            List<T> ts = new List<T>();
+            //鑾峰緱姝ゆā鍨嬬殑绫诲瀷
+            Type type = typeof(T);
+            //瀹氫箟涓�涓复鏃剁殑鍙橀噺
+            string tempName = "";
+            //閬嶅巻datatable涓墍鏈夋暟鎹
+            foreach (DataRow dr in dt.Rows)
+            {
+                T t = new T();
+                //鑾峰緱姝ゆā鍨嬬殑鍏叡灞炴��
+                PropertyInfo[] propertys = t.GetType().GetProperties();
+                //閬嶅巻鎵�鏈夊睘鎬�
+                foreach (PropertyInfo pi in propertys)
+                {
+                    //灏嗘灞炴�ц祴鍊肩粰涓存椂鍙橀噺
+                    tempName = pi.Name;
+                    //妫�鏌atatable鏄惁鍖呭惈姝ゅ垪
+                    if (dt.Columns.Contains(tempName))
+                    {
+                        //鍒ゆ柇姝ゅ睘鎬ф槸鍚︽湁setter锛岃繖涓暐鎰忔�濆憿锛屽氨鏄垜浠殑瀹炰綋灞傜殑{get;set;}濡傛灉鎴戜滑鐨勫疄浣撴湁浜唖et鏂规硶锛屽氨璇存槑鍙互璧嬪�硷紒
+                        if (!pi.CanWrite) continue;
+                        {
+                            //鍙栧��
+                            object value = dr[tempName];
+                            if (value != DBNull.Value)
+                                pi.SetValue(t, value, null);
+                        }
+                    }
+                }
+                //瀵硅薄娣诲姞鍒版硾鍨嬮泦鍚堜腑
+                ts.Add(t);
+            }
+            return ts;
+        }
+    }
+}
\ No newline at end of file
diff --git "a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-\346\226\207\344\273\266\345\270\256\345\212\251\347\261\273/ExcelSaveFilePathHelper.cs" "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-\346\226\207\344\273\266\345\270\256\345\212\251\347\261\273/ExcelSaveFilePathHelper.cs"
new file mode 100644
index 0000000..0a67fa1
--- /dev/null
+++ "b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/02-UICore/03-\346\226\207\344\273\266\345\270\256\345\212\251\347\261\273/ExcelSaveFilePathHelper.cs"
@@ -0,0 +1,33 @@
+锘縰sing System;
+
+namespace HStation.WinFrmUI
+{
+    public class ExcelSaveFilePathHelper
+    {
+        public static string SaveFilePathName(string fileName = null, string title = null, string filter = null)
+        {
+            string path = "";
+            System.Windows.Forms.SaveFileDialog fbd = new System.Windows.Forms.SaveFileDialog();
+            if (!string.IsNullOrEmpty(title))
+            {
+                fbd.Title = title;
+            }
+            fbd.FileName = fbd.Title + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");//璁剧疆鏂囦欢淇濆瓨鍚嶇О
+            if (!string.IsNullOrEmpty(fileName))
+            {
+                fbd.FileName = fileName;
+            }
+
+            fbd.Filter = "Excel 鏂囦欢(*.xls)|*.xls|Excel 鏂囦欢(*.xlsx)|*.xlsx"; ;// "Excel|*.xls;*.xlsx;";
+            if (!string.IsNullOrEmpty(title))
+            {
+                fbd.Title = title;// "淇濆瓨涓�";
+            }
+            if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
+            {
+                path = fbd.FileName;
+            }
+            return path;
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj
index 260bfa4..e173b7c 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj
@@ -8,12 +8,30 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <Compile Remove="01-project\EditProjectDlg.cs" />
-    <Compile Remove="01-project\EditProjectDlg.designer.cs" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <EmbeddedResource Remove="01-project\EditProjectDlg.resx" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠BandGridViewExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ButtonEditExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ClassUpdateVailDataHelper.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ControlExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ControlNavigatorExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠DateEditExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠DevHelper.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ExtensionsDev.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠FormExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠GridContorlExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ImageExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠LayoutControlExtensions.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠ListBoxControlExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠LookUpEditExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠MessageBoxShow.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠RibbonControlExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠SearchLookUpEditExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠TextEditExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠TileControlExtensions.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠TilePeekItemsExtensions.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠TokenEditExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠TreeListExtend.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠XtraChartHelper.cs" />
+    <Compile Remove="02-UICore\01-鎵╁睍绫籠XtraFormExtend.cs" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj.user b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj.user
index 8b0f779..6f8bfbc 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj.user
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.Project.csproj.user
@@ -5,13 +5,16 @@
     <Compile Update="01-project\AddProjectDlg.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Update="01-project\EditProjectDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
     <Compile Update="01-project\XhsProjectListPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="02-UICore\02-DocumentPage\DocumentPage.cs">
+    <Compile Update="02-UICore\00-DocumentPage\DocumentPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="02-UICore\02-DocumentPage\MainForm.cs">
+    <Compile Update="02-UICore\00-DocumentPage\MainForm.cs">
       <SubType>Form</SubType>
     </Compile>
   </ItemGroup>

--
Gitblit v1.9.3