From ce8693980144b310cbaaae5372c55046996348df Mon Sep 17 00:00:00 2001
From: duheng <2784771470@qq.com>
Date: 星期二, 16 七月 2024 16:04:11 +0800
Subject: [PATCH] 增加首页项目总览

---
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.cs                                     |   61 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/PropertySorter.cs                                         |  135 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj                       |    4 
 WinFrmUI/HStation.WinFrmUI.Bimface.Core/UserControl1.cs                                       |    2 
 HStation.Xhs.Desktop.sln                                                                      |   21 
 WinFrmUI/Hstation.WinFrmUI.Core/Hstation.WinFrmUI.Core.csproj                                 |    1 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.cs                                  |   56 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.resx                                   |  144 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/ViewModelHelper.cs                                        |   73 +
 WinFrmUI/HStation.WinFrmUI.Core/00-UICore/04-用户登陆类/LoginUser.cs                               |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.Designer.cs                          |   63 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.resx                                            |  120 ++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.designer.cs                              |  373 ++++++++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.cs                                       |  141 +++
 WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj               |    1 
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.PumpProduct.csproj               |    1 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj                         |   31 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.Designer.cs                                     |  166 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.resx                                 |  120 ++
 BLL/HStation.BLL.Xhs.Core/HStation.BLL.Xhs.Core.csproj                                        |    4 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.resx                                     |  141 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.cs                                              |   55 +
 Desktop/HStation.DeskTop.Xhs.Main/HStation.Desktop.Xhs.Main.csproj                            |    5 
 WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.Designer.cs                 |   37 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/AmapLocationViewModel.cs                                  |   26 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/FixationReceivedViewModel.cs                              |    9 
 /dev/null                                                                                     |   17 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.resx                                |  123 ++
 WinFrmUI/HStation.WinFrmUI.Xhs.Project/00-PumpProductManage/AddPumpProductMainDlg.Designer.cs |   67 +
 WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.cs                          |   21 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.Designer.cs                         |  373 ++++++++
 WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj.user          |    3 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.Designer.cs                            |  157 +++
 Desktop/HStation.DeskTop.Xhs.Main/GuideMain.cs                                                |    5 
 WinFrmUI/HStation.WinFrmUI.Xhs.Curve/XhsPumpCurveMainPanel.cs                                 |    4 
 WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj.user                  |    1 
 36 files changed, 2,513 insertions(+), 48 deletions(-)

diff --git a/BLL/HStation.BLL.Xhs.Core/HStation.BLL.Xhs.Core.csproj b/BLL/HStation.BLL.Xhs.Core/HStation.BLL.Xhs.Core.csproj
index 428e992..b30cb7f 100644
--- a/BLL/HStation.BLL.Xhs.Core/HStation.BLL.Xhs.Core.csproj
+++ b/BLL/HStation.BLL.Xhs.Core/HStation.BLL.Xhs.Core.csproj
@@ -8,8 +8,8 @@
 	</PropertyGroup>
 
 	<ItemGroup>
-	  <PackageReference Include="Yw.CAL.HttpClient.Core" Version="3.0.6" />
-	  <PackageReference Include="Yw.CALFactory.Core" Version="3.0.0" />
+	  <PackageReference Include="Yw.CAL.HttpClient.Core" Version="3.0.9" />
+	  <PackageReference Include="Yw.CALFactory.Core" Version="3.0.2" />
 	  <PackageReference Include="Yw.Mapster.Core" Version="3.0.0" />
 	</ItemGroup>
 
diff --git a/Desktop/HStation.DeskTop.Xhs.Main/GuideMain.cs b/Desktop/HStation.DeskTop.Xhs.Main/GuideMain.cs
index 4306ded..8c066aa 100644
--- a/Desktop/HStation.DeskTop.Xhs.Main/GuideMain.cs
+++ b/Desktop/HStation.DeskTop.Xhs.Main/GuideMain.cs
@@ -4,6 +4,7 @@
 using DevExpress.XtraEditors;
 using HStation.WinFrmUI;
 using HStation.WinFrmUI.Basic;
+using HStation.WinFrmUI.Xhs.Core;
 using HStation.WinFrmUI.Xhs.PumpProduct;
 using HStation.WinFrmUI.Xhs.PumpProject;
 using System;
@@ -492,12 +493,12 @@
         {
             var guid = new SurfaceGuid()
             {
-                Function = "椤圭洰绠$悊",
+                Function = "椤圭洰鎬昏",
                 Modular = eModular.Basic
             };
             if (!IsExistPage(guid, true))
             {
-                var page = new XhsProjectMainPanel();
+                var page = new MainPanel();
                 page.PageTitle.Caption = guid.Function;
                 page.SurfaceGuid = guid;
                 CreatePage(page, guid);
diff --git a/Desktop/HStation.DeskTop.Xhs.Main/HStation.Desktop.Xhs.Main.csproj b/Desktop/HStation.DeskTop.Xhs.Main/HStation.Desktop.Xhs.Main.csproj
index f23458a..f7d1eaa 100644
--- a/Desktop/HStation.DeskTop.Xhs.Main/HStation.Desktop.Xhs.Main.csproj
+++ b/Desktop/HStation.DeskTop.Xhs.Main/HStation.Desktop.Xhs.Main.csproj
@@ -9,12 +9,11 @@
 
 	<ItemGroup>
 		<PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
-		<PackageReference Include="Yw.BLL.Auth.Core" Version="3.0.3" />
+		<PackageReference Include="Yw.BLL.Auth.Core" Version="3.0.7" />
 	</ItemGroup>
 
 	<ItemGroup>
-		<ProjectReference Include="..\..\Service\HStation.Service.Xhs.Core\HStation.Service.Xhs.Project.csproj" />
-		<ProjectReference Include="..\..\Setting\HStation.Hxs.Setting\HStation.Setting.Xhs.Core.csproj" />
+		<ProjectReference Include="..\..\Service\HStation.Service.Xhs.Core\HStation.Service.Xhs.Core.csproj" />
 		<ProjectReference Include="..\..\WinFrmUI\HStation.WinFrmUI.Basic\HStation.WinFrmUI.Basic.csproj" />
 		<ProjectReference Include="..\..\WinFrmUI\HStation.WinFrmUI.PumpProject\HStation.WinFrmUI.Xhs.PumpProject.csproj" />
 		<ProjectReference Include="..\..\WinFrmUI\HStation.WinFrmUI.Xhs.Core\HStation.WinFrmUI.Xhs.Core.csproj" />
diff --git a/HStation.Xhs.Desktop.sln b/HStation.Xhs.Desktop.sln
index 2c488f4..07ffd61 100644
--- a/HStation.Xhs.Desktop.sln
+++ b/HStation.Xhs.Desktop.sln
@@ -31,8 +31,6 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.Dto.Xhs.Core", "Dto\HStation.Dto.Xhs.Core\HStation.Dto.Xhs.Core.csproj", "{A669AAEF-9242-4B78-A171-BFC98D87CE35}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.Setting.Xhs.Core", "Setting\Hstation.Hxs.Setting\HStation.Setting.Xhs.Core.csproj", "{32960E3C-F6A0-445F-84C0-3303B93FDD0D}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.WebApi.Xhs.Core", "WebApi\HStation.WebApi.Xhs.Core\HStation.WebApi.Xhs.Core.csproj", "{84266C68-21C0-4F2D-8569-18B0CB96669D}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.WinFrmUI.Core", "WinFrmUI\Hstation.WinFrmUI.Core\HStation.WinFrmUI.Core.csproj", "{435871C0-4F2F-4D7D-824D-8E7D53C88756}"
@@ -56,6 +54,10 @@
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.Service.Xhs.PumpProduct", "Service\HStation.Service.Xhs.PumpProduct.Core\HStation.Service.Xhs.PumpProduct.csproj", "{37571FD9-E0AC-4AA3-AD53-9E8A539390D6}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.Service.Xhs.Core", "Service\HStation.Service.Xhs.Core\HStation.Service.Xhs.Core.csproj", "{62C9B772-A274-4E04-A206-50E6505614D3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Map.Core", "WinFrmUI\Yw.WinFrmUI.Map.Core\Yw.WinFrmUI.Map.Core.csproj", "{62405CA1-35EB-4DBE-AD07-C16952808C9A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Core", "WinFrmUI\Yw.WinFrmUI.Core\Yw.WinFrmUI.Core.csproj", "{B1F602CA-C4A9-4E2B-B9E7-69D582EC1E67}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -91,10 +93,6 @@
 		{A669AAEF-9242-4B78-A171-BFC98D87CE35}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{A669AAEF-9242-4B78-A171-BFC98D87CE35}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{A669AAEF-9242-4B78-A171-BFC98D87CE35}.Release|Any CPU.Build.0 = Release|Any CPU
-		{32960E3C-F6A0-445F-84C0-3303B93FDD0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{32960E3C-F6A0-445F-84C0-3303B93FDD0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{32960E3C-F6A0-445F-84C0-3303B93FDD0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{32960E3C-F6A0-445F-84C0-3303B93FDD0D}.Release|Any CPU.Build.0 = Release|Any CPU
 		{84266C68-21C0-4F2D-8569-18B0CB96669D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{84266C68-21C0-4F2D-8569-18B0CB96669D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{84266C68-21C0-4F2D-8569-18B0CB96669D}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -139,6 +137,14 @@
 		{62C9B772-A274-4E04-A206-50E6505614D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{62C9B772-A274-4E04-A206-50E6505614D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{62C9B772-A274-4E04-A206-50E6505614D3}.Release|Any CPU.Build.0 = Release|Any CPU
+		{62405CA1-35EB-4DBE-AD07-C16952808C9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{62405CA1-35EB-4DBE-AD07-C16952808C9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{62405CA1-35EB-4DBE-AD07-C16952808C9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{62405CA1-35EB-4DBE-AD07-C16952808C9A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{B1F602CA-C4A9-4E2B-B9E7-69D582EC1E67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{B1F602CA-C4A9-4E2B-B9E7-69D582EC1E67}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{B1F602CA-C4A9-4E2B-B9E7-69D582EC1E67}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{B1F602CA-C4A9-4E2B-B9E7-69D582EC1E67}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -150,7 +156,6 @@
 		{E692C0F6-2627-4E05-89A5-705462B3751B} = {6FA135ED-89EF-474B-B502-FEA300F613A5}
 		{AC84FDBE-787C-4B95-82A2-C852A905CEA4} = {60068812-89D4-4DAB-A41B-0334B8D76A0B}
 		{A669AAEF-9242-4B78-A171-BFC98D87CE35} = {60068812-89D4-4DAB-A41B-0334B8D76A0B}
-		{32960E3C-F6A0-445F-84C0-3303B93FDD0D} = {00D75422-0508-4383-A558-AF5B7CB4AA7E}
 		{84266C68-21C0-4F2D-8569-18B0CB96669D} = {2AE8DD9B-A07B-44C4-B5C4-A9D98C49D633}
 		{435871C0-4F2F-4D7D-824D-8E7D53C88756} = {D5B088B2-E69E-4B43-838B-080B9F012077}
 		{2DFEFAC8-58AC-443D-8FCD-EF7EA9DFBB2F} = {D5B088B2-E69E-4B43-838B-080B9F012077}
@@ -162,6 +167,8 @@
 		{DA7418A4-7ABA-48C0-B7D8-4C5642BE53C1} = {67608112-BE07-493C-8240-E084CF461482}
 		{37571FD9-E0AC-4AA3-AD53-9E8A539390D6} = {67608112-BE07-493C-8240-E084CF461482}
 		{62C9B772-A274-4E04-A206-50E6505614D3} = {67608112-BE07-493C-8240-E084CF461482}
+		{62405CA1-35EB-4DBE-AD07-C16952808C9A} = {D5B088B2-E69E-4B43-838B-080B9F012077}
+		{B1F602CA-C4A9-4E2B-B9E7-69D582EC1E67} = {D5B088B2-E69E-4B43-838B-080B9F012077}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {E02989A8-9B6F-43E5-AACA-790328215089}
diff --git a/Setting/Hstation.Hxs.Setting/DbFirstHelper.cs b/Setting/Hstation.Hxs.Setting/DbFirstHelper.cs
deleted file mode 100644
index 32b9fb9..0000000
--- a/Setting/Hstation.Hxs.Setting/DbFirstHelper.cs
+++ /dev/null
@@ -1,90 +0,0 @@
-锘縰sing SqlSugar;
-
-namespace Yw.Service
-{
-    /// <summary>
-    ///
-    /// </summary>
-    public class DbFirstHelper
-    {
-        /// <summary>
-        /// 鍒濆鍖�
-        /// </summary>
-        public static bool Initial(out string msg)
-        {
-            var settings = Yw.Settings.MigrationParasHelper.Migration;
-            msg = string.Empty;
-            try
-            {
-                #region 鍩虹妯″潡
-
-                var basicConnectConfig = Yw.Migration.ConfigHelper.GetConnectionConfig(settings.Basic.Dest.DbType, settings.Basic.Dest.ConnectString);
-                if (basicConnectConfig == null)
-                {
-                    msg = "鍩虹妯″潡杩炴帴閰嶇疆鍒濆鍖栧け璐�";
-                    return false;
-                }
-                basicConnectConfig.ConfigureExternalServices = new ConfigureExternalServices()
-                {
-                    EntityService = (property, column) =>
-                    {
-                        //闄や富閿鍏朵粬鍒楅兘鍙┖
-                        if (!column.IsPrimarykey)
-                        {
-                            column.IsNullable = true;
-                        }
-                        if (column.DataType == StaticConfig.CodeFirst_BigString)
-                        {
-                            if (settings.Basic.Dest.DbType == Yw.Migration.DbType.PostgreSql)
-                            {
-                                column.DataType = "character varying";
-                            }
-                        }
-                    }
-                };
-
-                var basicTypeList = new List<Type>();
-                //绯荤粺绫诲瀷
-                if (settings.Basic.Config.ContainsType)
-                {
-                    basicTypeList.Add(typeof(Yw.Entity.SysModule));
-                    basicTypeList.Add(typeof(Yw.Entity.SysType));
-                }
-                //绯荤粺鍒嗙被
-                if (settings.Basic.Config.ContainsCatalog)
-                {
-                    basicTypeList.Add(typeof(Yw.Entity.SysCatalog));
-                    basicTypeList.Add(typeof(Yw.Entity.SysCatalogOrg));
-                }
-                //绯荤粺灞炴��
-                if (settings.Basic.Config.ContainsProp)
-                {
-                }
-                if (basicTypeList.Count > 0)
-                {
-                    using (var db = new SqlSugarClient(basicConnectConfig))
-                    {
-                        //璁剧疆瀛楃涓查粯璁ら暱搴�
-                        //db.CodeFirst.SetStringDefaultLength(250);
-                        //db.CodeFirst.SetStringDefaultLength(int.MaxValue);
-                        //寤哄簱锛氬鏋滀笉瀛樺湪鍒涘缓鏁版嵁搴撳瓨鍦ㄤ笉浼氶噸澶嶅垱寤� createdb;娉ㄦ剰 锛歄racle鍜屼釜鍒浗浜у簱闇�涓嶆敮鎸佽鏂规硶锛岄渶瑕佹墜鍔ㄥ缓搴�
-                        db.DbMaintenance.CreateDatabase();
-                        db.CodeFirst.InitTables
-                            (
-                                basicTypeList.ToArray()
-                            );
-                    }
-                }
-
-                #endregion 鍩虹妯″潡
-
-                return true;
-            }
-            catch (Exception ex)
-            {
-                msg = ex.Message;
-                return false;
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/Setting/Hstation.Hxs.Setting/Hstation.Setting.Xhs.Core.csproj b/Setting/Hstation.Hxs.Setting/Hstation.Setting.Xhs.Core.csproj
deleted file mode 100644
index 862d119..0000000
--- a/Setting/Hstation.Hxs.Setting/Hstation.Setting.Xhs.Core.csproj
+++ /dev/null
@@ -1,17 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <TargetFramework>net6.0-windows</TargetFramework>
-    <ImplicitUsings>enable</ImplicitUsings>
-    <Nullable>enable</Nullable>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <Compile Remove="DbFirstHelper.cs" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <PackageReference Include="Yw.BLL.Auth.Core" Version="3.0.3" />
-  </ItemGroup>
-
-</Project>
diff --git a/WinFrmUI/HStation.WinFrmUI.Bimface.Core/UserControl1.cs b/WinFrmUI/HStation.WinFrmUI.Bimface.Core/UserControl1.cs
index e87f8d5..502b9b6 100644
--- a/WinFrmUI/HStation.WinFrmUI.Bimface.Core/UserControl1.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Bimface.Core/UserControl1.cs
@@ -7,4 +7,4 @@
             InitializeComponent();
         }
     }
-}
+}
\ No newline at end of file
diff --git a/Setting/Hstation.Hxs.Setting/LoginUser.cs "b/WinFrmUI/HStation.WinFrmUI.Core/00-UICore/04-\347\224\250\346\210\267\347\231\273\351\231\206\347\261\273/LoginUser.cs"
similarity index 100%
rename from Setting/Hstation.Hxs.Setting/LoginUser.cs
rename to "WinFrmUI/HStation.WinFrmUI.Core/00-UICore/04-\347\224\250\346\210\267\347\231\273\351\231\206\347\261\273/LoginUser.cs"
diff --git a/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj b/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj
index a4e6207..9ca4b27 100644
--- a/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj
@@ -14,7 +14,6 @@
   <ItemGroup>
     <ProjectReference Include="..\..\BLL\HStation.BLL.Xhs.Core\HStation.BLL.Xhs.Core.csproj" />
     <ProjectReference Include="..\..\Dto\Hstation.Dto.Core\Hstation.Dto.Core.csproj" />
-    <ProjectReference Include="..\..\Setting\Hstation.Hxs.Setting\HStation.Setting.Xhs.Core.csproj" />
     <ProjectReference Include="..\Hstation.WinFrmUI.Core\HStation.WinFrmUI.Core.csproj" />
   </ItemGroup>
 
diff --git a/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj.user b/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj.user
index f30c985..02f47a8 100644
--- a/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj.user
+++ b/WinFrmUI/HStation.WinFrmUI.PumpProject/HStation.WinFrmUI.Xhs.PumpProject.csproj.user
@@ -23,5 +23,8 @@
     <Compile Update="00-PumpProject\XhsProjectMainPanel.cs">
       <SubType>UserControl</SubType>
     </Compile>
+    <Compile Update="MainPanel\XtraUserControl1.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.Designer.cs b/WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.Designer.cs
new file mode 100644
index 0000000..9420e4e
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.Designer.cs
@@ -0,0 +1,37 @@
+锘縩amespace HStation.WinFrmUI.Xhs.PumpProject.MainPanel
+{
+    partial class XtraUserControl1
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+        }
+
+        #endregion
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.cs b/WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.cs
new file mode 100644
index 0000000..fd2c86a
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PumpProject/MainPanel/XtraUserControl1.cs
@@ -0,0 +1,21 @@
+锘縰sing DevExpress.XtraEditors;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HStation.WinFrmUI.Xhs.PumpProject.MainPanel
+{
+    public partial class XtraUserControl1 : DevExpress.XtraEditors.XtraUserControl
+    {
+        public XtraUserControl1()
+        {
+            InitializeComponent();
+        }
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.cs
new file mode 100644
index 0000000..98239b2
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.cs
@@ -0,0 +1,141 @@
+锘縰sing HStation.Dto;
+using Newtonsoft.Json;
+
+namespace HStation.WinFrmUI.Xhs.Core
+{
+    public partial class AddXhsProjectDlg : DevExpress.XtraEditors.XtraForm
+    {
+        public AddXhsProjectDlg()
+        {
+            InitializeComponent();
+        }
+
+        private AddXhsProjectInput _AddXhsProjectInput = null;
+
+        public event Func<AddXhsProjectInput, AddXhsProjectItemInput, AddXhsProjectItemModelInput, AddXhsProjectItemModelMapInput, Task<bool>> ReloadEvent;
+
+        //鍒濆鍖�
+        private void AddProjectDlg_Load(object sender, EventArgs e)
+        {
+            _AddXhsProjectInput = new AddXhsProjectInput();
+            this.webView21.Source = new Uri(AppDomain.CurrentDomain.BaseDirectory + "data/web/html/map_select.html");
+            this.navigationFrame.SelectedPage = navigationPageForm;
+            layoutControlItemBack.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+            layoutControlItemAddress.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+        }
+
+        private void webView21_WebMessageReceived(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs e)
+        {
+            var j = JsonConvert.DeserializeObject<FixationReceivedViewModel>(e.WebMessageAsJson);
+            switch (j.Oper)
+            {
+                case "getLocation":
+                    var o = JsonConvert.DeserializeObject<AmapLocationViewModel>(j.Json);
+                    if (o == null)
+                        break;
+                    this.textEditAddress.Text = o.address;
+                    _AddXhsProjectInput.Address = o.address;
+                    _AddXhsProjectInput.MapPosition = o.location.lng + "," + o.location.lat;
+                    break;
+            }
+        }
+
+        //涓嬩竴姝�
+        private void btnNextStep_Click(object sender, EventArgs e)
+        {
+            var currentindex = this.navigationFrame.SelectedPageIndex;
+            switch (currentindex)
+            {
+                case 0:
+                    if (!this.projectUserControl1.Valid())
+                        return;
+                    this.navigationFrame.SelectedPage = navigationPageMapSelect;
+                    stepProgressBar1.SelectedItemIndex = 1;
+                    layoutControlItemAddress.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
+                    layoutControlItemBack.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
+                    this.btnNextStep.Text = "瀹屾垚";
+                    break;
+
+                case 1:
+                    Finish();
+                    break;
+            }
+        }
+
+        //涓婁竴姝�
+        private void BtnBack_Click(object sender, EventArgs e)
+        {
+            var currentindex = this.navigationFrame.SelectedPageIndex;
+            switch (currentindex)
+            {
+                case 0:
+
+                    break;
+
+                case 1:
+                    this.navigationFrame.SelectedPage = navigationPageForm;
+                    stepProgressBar1.SelectedItemIndex = 0;
+                    layoutControlItemBack.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+                    layoutControlItemAddress.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+                    this.btnNextStep.Text = "涓嬩竴姝�>";
+                    break;
+            }
+        }
+
+        //鏁版嵁楠岃瘉
+        private bool Valid()
+        {
+            this.dxErrorProvider1.ClearErrors();
+            if (string.IsNullOrEmpty(textEditAddress.Text.Trim()))
+            {
+                this.dxErrorProvider1.SetError(this.textEditAddress, "蹇呭~椤�");
+                return false;
+            }
+            if (string.IsNullOrEmpty(_AddXhsProjectInput.MapPosition))
+            {
+                MessageBoxHelper.ShowInfo("璇风幇鍦ㄥ湴鍥句腑閫夋嫨浣嶇疆!");
+                return false;
+            }
+            return true;
+        }
+
+        //纭畾
+        private async void Finish()
+        {
+            if (!this.projectUserControl1.Valid())
+                return;
+            var login = LoginUser.GetInstance();
+            var proresult = this.projectUserControl1.GetData(_AddXhsProjectInput);
+            proresult.Address = this.textEditAddress.Text.Trim();
+            proresult.CreateUserID = login.CreateUserID;
+            proresult.CreateUserDisplayName = login.LoginName;
+            var Item = new AddXhsProjectItemInput();
+            Item.Name = proresult.Name;
+            Item.Version = proresult.Version;
+            Item.TagName = proresult.TagName;
+            Item.CreateTime = proresult.CreateTime;
+            Item.Description = proresult.Description;
+            Item.CreateUserID = proresult.CreateUserID;
+            Item.Version = proresult.Version;
+            var Model = new AddXhsProjectItemModelInput();
+            Model.Name = proresult.Name;
+            Model.Version = proresult.Version;
+            Model.TagName = proresult.TagName;
+            Model.Description = proresult.Description;
+            Model.UploadStatus = HStation.Xhs.eUploadStatus.Disable;
+            var Mapinput = new AddXhsProjectItemModelMapInput();
+            Mapinput.UploadUserID = proresult.CreateUserID;
+            Mapinput.UploadTime = DateTime.Now;
+            if (await this.ReloadEvent.Invoke(proresult, Item, Model, Mapinput))
+            {
+                MessageBoxHelper.ShowSuccess("娣诲姞鎴愬姛!");
+            }
+            else
+            {
+                MessageBoxHelper.ShowError("娣诲姞澶辫触!");
+            }
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.designer.cs
new file mode 100644
index 0000000..c592476
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.designer.cs
@@ -0,0 +1,373 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraEditors;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace HStation.WinFrmUI.Xhs.Core
+{
+    partial class AddXhsProjectDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new Container();
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(AddXhsProjectDlg));
+            dataLayoutControl1 = new DevExpress.XtraDataLayout.DataLayoutControl();
+            navigationFrame = new DevExpress.XtraBars.Navigation.NavigationFrame();
+            navigationPageForm = new DevExpress.XtraBars.Navigation.NavigationPage();
+            projectUserControl1 = new PumpProject.XhsProjectUserControl();
+            navigationPageMapSelect = new DevExpress.XtraBars.Navigation.NavigationPage();
+            webView21 = new Microsoft.Web.WebView2.WinForms.WebView2();
+            stepProgressBar1 = new StepProgressBar();
+            stepProgressBarItemPostion = new StepProgressBarItem();
+            stepProgressBarItem = new StepProgressBarItem();
+            btnNextStep = new SimpleButton();
+            btnCancel = new SimpleButton();
+            BtnBack = new SimpleButton();
+            textEditAddress = new TextEdit();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
+            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItemBack = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItemAddress = new DevExpress.XtraLayout.LayoutControlItem();
+            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
+            ((ISupportInitialize)dataLayoutControl1).BeginInit();
+            dataLayoutControl1.SuspendLayout();
+            ((ISupportInitialize)navigationFrame).BeginInit();
+            navigationFrame.SuspendLayout();
+            navigationPageForm.SuspendLayout();
+            navigationPageMapSelect.SuspendLayout();
+            ((ISupportInitialize)webView21).BeginInit();
+            ((ISupportInitialize)stepProgressBar1).BeginInit();
+            ((ISupportInitialize)textEditAddress.Properties).BeginInit();
+            ((ISupportInitialize)Root).BeginInit();
+            ((ISupportInitialize)layoutControlGroup1).BeginInit();
+            ((ISupportInitialize)layoutControlItem1).BeginInit();
+            ((ISupportInitialize)layoutControlItem2).BeginInit();
+            ((ISupportInitialize)emptySpaceItem1).BeginInit();
+            ((ISupportInitialize)layoutControlItem3).BeginInit();
+            ((ISupportInitialize)layoutControlItem4).BeginInit();
+            ((ISupportInitialize)layoutControlItemBack).BeginInit();
+            ((ISupportInitialize)layoutControlItemAddress).BeginInit();
+            ((ISupportInitialize)dxErrorProvider1).BeginInit();
+            SuspendLayout();
+            // 
+            // dataLayoutControl1
+            // 
+            dataLayoutControl1.Controls.Add(navigationFrame);
+            dataLayoutControl1.Controls.Add(stepProgressBar1);
+            dataLayoutControl1.Controls.Add(btnNextStep);
+            dataLayoutControl1.Controls.Add(btnCancel);
+            dataLayoutControl1.Controls.Add(BtnBack);
+            dataLayoutControl1.Controls.Add(textEditAddress);
+            dataLayoutControl1.Dock = DockStyle.Fill;
+            dataLayoutControl1.Location = new Point(0, 0);
+            dataLayoutControl1.Name = "dataLayoutControl1";
+            dataLayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(640, 239, 978, 700);
+            dataLayoutControl1.Root = Root;
+            dataLayoutControl1.Size = new Size(742, 400);
+            dataLayoutControl1.TabIndex = 0;
+            dataLayoutControl1.Text = "dataLayoutControl1";
+            // 
+            // navigationFrame
+            // 
+            navigationFrame.AllowTransitionAnimation = DefaultBoolean.False;
+            navigationFrame.Controls.Add(navigationPageForm);
+            navigationFrame.Controls.Add(navigationPageMapSelect);
+            navigationFrame.Location = new Point(12, 66);
+            navigationFrame.Name = "navigationFrame";
+            navigationFrame.Pages.AddRange(new DevExpress.XtraBars.Navigation.NavigationPageBase[] { navigationPageForm, navigationPageMapSelect });
+            navigationFrame.SelectedPage = navigationPageForm;
+            navigationFrame.Size = new Size(718, 272);
+            navigationFrame.TabIndex = 2;
+            navigationFrame.Text = "navigationFrame1";
+            // 
+            // navigationPageForm
+            // 
+            navigationPageForm.Caption = "navigationPageMapSelect";
+            navigationPageForm.Controls.Add(projectUserControl1);
+            navigationPageForm.Name = "navigationPageForm";
+            navigationPageForm.Size = new Size(718, 272);
+            // 
+            // projectUserControl1
+            // 
+            projectUserControl1.Dock = DockStyle.Fill;
+            projectUserControl1.Location = new Point(0, 0);
+            projectUserControl1.Name = "projectUserControl1";
+            projectUserControl1.Size = new Size(718, 272);
+            projectUserControl1.TabIndex = 0;
+            // 
+            // navigationPageMapSelect
+            // 
+            navigationPageMapSelect.Caption = "navigationPageForm";
+            navigationPageMapSelect.Controls.Add(webView21);
+            navigationPageMapSelect.Name = "navigationPageMapSelect";
+            navigationPageMapSelect.Size = new Size(718, 272);
+            // 
+            // webView21
+            // 
+            webView21.AllowExternalDrop = true;
+            webView21.CreationProperties = null;
+            webView21.DefaultBackgroundColor = Color.White;
+            webView21.Dock = DockStyle.Fill;
+            webView21.Location = new Point(0, 0);
+            webView21.Name = "webView21";
+            webView21.Size = new Size(718, 272);
+            webView21.TabIndex = 0;
+            webView21.ZoomFactor = 1D;
+            webView21.WebMessageReceived += webView21_WebMessageReceived;
+            // 
+            // stepProgressBar1
+            // 
+            stepProgressBar1.ContentAlignment = ContentAlignment.MiddleLeft;
+            stepProgressBar1.ItemOptions.Indicator.ActiveStateImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("stepProgressBar1.ItemOptions.Indicator.ActiveStateImageOptions.SvgImage");
+            stepProgressBar1.ItemOptions.Indicator.ActiveStateImageOptions.SvgImageSize = new Size(20, 20);
+            stepProgressBar1.ItemOptions.Indicator.Width = 23;
+            stepProgressBar1.Items.Add(stepProgressBarItemPostion);
+            stepProgressBar1.Items.Add(stepProgressBarItem);
+            stepProgressBar1.Location = new Point(12, 12);
+            stepProgressBar1.MaximumSize = new Size(0, 50);
+            stepProgressBar1.MinimumSize = new Size(0, 50);
+            stepProgressBar1.Name = "stepProgressBar1";
+            stepProgressBar1.SelectedItemIndex = 0;
+            stepProgressBar1.Size = new Size(718, 50);
+            stepProgressBar1.StyleController = dataLayoutControl1;
+            stepProgressBar1.TabIndex = 0;
+            // 
+            // stepProgressBarItemPostion
+            // 
+            stepProgressBarItemPostion.ContentBlock2.Caption = "椤圭洰淇℃伅";
+            stepProgressBarItemPostion.Name = "stepProgressBarItemPostion";
+            stepProgressBarItemPostion.State = StepProgressBarItemState.Active;
+            // 
+            // stepProgressBarItem
+            // 
+            stepProgressBarItem.ContentBlock2.Caption = "浣嶇疆閫夋嫨";
+            stepProgressBarItem.Name = "stepProgressBarItem";
+            // 
+            // btnNextStep
+            // 
+            btnNextStep.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Primary;
+            btnNextStep.Appearance.Options.UseBackColor = true;
+            btnNextStep.Location = new Point(536, 366);
+            btnNextStep.Name = "btnNextStep";
+            btnNextStep.Size = new Size(95, 22);
+            btnNextStep.StyleController = dataLayoutControl1;
+            btnNextStep.TabIndex = 5;
+            btnNextStep.Text = "涓嬩竴姝�>";
+            btnNextStep.Click += btnNextStep_Click;
+            // 
+            // btnCancel
+            // 
+            btnCancel.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Danger;
+            btnCancel.Appearance.Options.UseBackColor = true;
+            btnCancel.DialogResult = DialogResult.Cancel;
+            btnCancel.Location = new Point(635, 366);
+            btnCancel.Name = "btnCancel";
+            btnCancel.Size = new Size(95, 22);
+            btnCancel.StyleController = dataLayoutControl1;
+            btnCancel.TabIndex = 6;
+            btnCancel.Text = "鍙栨秷";
+            // 
+            // BtnBack
+            // 
+            BtnBack.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Warning;
+            BtnBack.Appearance.Options.UseBackColor = true;
+            BtnBack.Location = new Point(447, 366);
+            BtnBack.Name = "BtnBack";
+            BtnBack.Size = new Size(85, 22);
+            BtnBack.StyleController = dataLayoutControl1;
+            BtnBack.TabIndex = 4;
+            BtnBack.Text = "<涓婁竴姝�";
+            BtnBack.Click += BtnBack_Click;
+            // 
+            // textEditAddress
+            // 
+            textEditAddress.Location = new Point(76, 342);
+            textEditAddress.Name = "textEditAddress";
+            textEditAddress.Size = new Size(654, 20);
+            textEditAddress.StyleController = dataLayoutControl1;
+            textEditAddress.TabIndex = 3;
+            // 
+            // Root
+            // 
+            Root.AppearanceItemCaption.Options.UseTextOptions = true;
+            Root.AppearanceItemCaption.TextOptions.HAlignment = HorzAlignment.Far;
+            Root.EnableIndentsWithoutBorders = DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1 });
+            Root.Name = "Root";
+            Root.Size = new Size(742, 400);
+            Root.TextVisible = false;
+            // 
+            // layoutControlGroup1
+            // 
+            layoutControlGroup1.AllowDrawBackground = false;
+            layoutControlGroup1.GroupBordersVisible = false;
+            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2, emptySpaceItem1, layoutControlItem3, layoutControlItem4, layoutControlItemBack, layoutControlItemAddress });
+            layoutControlGroup1.Location = new Point(0, 0);
+            layoutControlGroup1.Name = "autoGeneratedGroup0";
+            layoutControlGroup1.Size = new Size(722, 380);
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = btnCancel;
+            layoutControlItem1.Location = new Point(623, 354);
+            layoutControlItem1.MaxSize = new Size(99, 26);
+            layoutControlItem1.MinSize = new Size(99, 26);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(99, 26);
+            layoutControlItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = btnNextStep;
+            layoutControlItem2.Location = new Point(524, 354);
+            layoutControlItem2.MaxSize = new Size(99, 26);
+            layoutControlItem2.MinSize = new Size(99, 26);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Size = new Size(99, 26);
+            layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // emptySpaceItem1
+            // 
+            emptySpaceItem1.AllowHotTrack = false;
+            emptySpaceItem1.Location = new Point(0, 354);
+            emptySpaceItem1.Name = "emptySpaceItem1";
+            emptySpaceItem1.Size = new Size(435, 26);
+            emptySpaceItem1.TextSize = new Size(0, 0);
+            // 
+            // layoutControlItem3
+            // 
+            layoutControlItem3.Control = stepProgressBar1;
+            layoutControlItem3.Location = new Point(0, 0);
+            layoutControlItem3.Name = "layoutControlItem3";
+            layoutControlItem3.Size = new Size(722, 54);
+            layoutControlItem3.TextSize = new Size(0, 0);
+            layoutControlItem3.TextVisible = false;
+            // 
+            // layoutControlItem4
+            // 
+            layoutControlItem4.Control = navigationFrame;
+            layoutControlItem4.Location = new Point(0, 54);
+            layoutControlItem4.Name = "layoutControlItem4";
+            layoutControlItem4.Size = new Size(722, 276);
+            layoutControlItem4.TextSize = new Size(0, 0);
+            layoutControlItem4.TextVisible = false;
+            // 
+            // layoutControlItemBack
+            // 
+            layoutControlItemBack.Control = BtnBack;
+            layoutControlItemBack.Location = new Point(435, 354);
+            layoutControlItemBack.MaxSize = new Size(89, 26);
+            layoutControlItemBack.MinSize = new Size(89, 26);
+            layoutControlItemBack.Name = "layoutControlItemBack";
+            layoutControlItemBack.Size = new Size(89, 26);
+            layoutControlItemBack.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            layoutControlItemBack.TextSize = new Size(0, 0);
+            layoutControlItemBack.TextVisible = false;
+            // 
+            // layoutControlItemAddress
+            // 
+            layoutControlItemAddress.Control = textEditAddress;
+            layoutControlItemAddress.Location = new Point(0, 330);
+            layoutControlItemAddress.Name = "layoutControlItemAddress";
+            layoutControlItemAddress.Size = new Size(722, 24);
+            layoutControlItemAddress.Text = "璇︾粏鍦板潃:";
+            layoutControlItemAddress.TextSize = new Size(52, 14);
+            // 
+            // dxErrorProvider1
+            // 
+            dxErrorProvider1.ContainerControl = this;
+            // 
+            // AddXhsProjectDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(742, 400);
+            Controls.Add(dataLayoutControl1);
+            Name = "AddXhsProjectDlg";
+            StartPosition = FormStartPosition.CenterParent;
+            Text = "瀵煎叆椤圭洰";
+            Load += AddProjectDlg_Load;
+            ((ISupportInitialize)dataLayoutControl1).EndInit();
+            dataLayoutControl1.ResumeLayout(false);
+            ((ISupportInitialize)navigationFrame).EndInit();
+            navigationFrame.ResumeLayout(false);
+            navigationPageForm.ResumeLayout(false);
+            navigationPageMapSelect.ResumeLayout(false);
+            ((ISupportInitialize)webView21).EndInit();
+            ((ISupportInitialize)stepProgressBar1).EndInit();
+            ((ISupportInitialize)textEditAddress.Properties).EndInit();
+            ((ISupportInitialize)Root).EndInit();
+            ((ISupportInitialize)layoutControlGroup1).EndInit();
+            ((ISupportInitialize)layoutControlItem1).EndInit();
+            ((ISupportInitialize)layoutControlItem2).EndInit();
+            ((ISupportInitialize)emptySpaceItem1).EndInit();
+            ((ISupportInitialize)layoutControlItem3).EndInit();
+            ((ISupportInitialize)layoutControlItem4).EndInit();
+            ((ISupportInitialize)layoutControlItemBack).EndInit();
+            ((ISupportInitialize)layoutControlItemAddress).EndInit();
+            ((ISupportInitialize)dxErrorProvider1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraDataLayout.DataLayoutControl dataLayoutControl1;
+        private SimpleButton btnNextStep;
+        private SimpleButton btnCancel;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
+        private DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider dxErrorProvider1;
+        private StepProgressBar stepProgressBar1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraBars.Navigation.NavigationFrame navigationFrame;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private StepProgressBarItem stepProgressBarItemPostion;
+        private StepProgressBarItem stepProgressBarItem;
+        private SimpleButton BtnBack;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItemBack;
+        private DevExpress.XtraBars.Navigation.NavigationPage navigationPageForm;
+        private DevExpress.XtraBars.Navigation.NavigationPage navigationPageMapSelect;
+        private TextEdit textEditAddress;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItemAddress;
+        private HStation.WinFrmUI.Xhs.PumpProject.XhsProjectUserControl projectUserControl1;
+        private Microsoft.Web.WebView2.WinForms.WebView2 webView21;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.resx
new file mode 100644
index 0000000..a8695bc
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AddXhsProjectDlg.resx
@@ -0,0 +1,141 @@
+锘�<?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.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="stepProgressBar1.ItemOptions.Indicator.ActiveStateImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAFUCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
+        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
+        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
+        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBvbHlnb24gcG9pbnRzPSIyNyw0
+        IDExLDIwIDUsMTQgMiwxNyAxMSwyNiAzMCw3ICIgY2xhc3M9IkdyZWVuIiAvPg0KPC9zdmc+Cw==
+</value>
+  </data>
+  <metadata name="dxErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AmapLocationViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AmapLocationViewModel.cs
new file mode 100644
index 0000000..acef709
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/AmapLocationViewModel.cs
@@ -0,0 +1,26 @@
+锘縩amespace HStation.WinFrmUI.Xhs.Core
+{
+    public class AmapLocationViewModel
+    {
+        public AmapLocationViewModel()
+        {
+            location = new Location();
+        }
+
+        public string id { get; set; }
+        public string name { get; set; }
+        public string address { get; set; }
+        public Location location { get; set; }
+
+        public long BuildTypeID { get; set; }
+
+        public string NorthEast { get; set; }
+        public string SouthWest { get; set; }
+    }
+
+    public class Location
+    {
+        public float lng { get; set; }
+        public float lat { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/FixationReceivedViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/FixationReceivedViewModel.cs
new file mode 100644
index 0000000..8c8054f
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/FixationReceivedViewModel.cs
@@ -0,0 +1,9 @@
+锘縩amespace HStation.WinFrmUI.Xhs.Core
+{
+    public class FixationReceivedViewModel
+    {
+        public string Oper { get; set; }
+
+        public string Json { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
index a82c90f..1b03c1c 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
@@ -30,11 +30,40 @@
   </ItemGroup>
 
   <ItemGroup>
+    <Folder Include="map\gaode\css\" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\BLL\HStation.BLL.Xhs.Core\HStation.BLL.Xhs.Core.csproj" />
+    <ProjectReference Include="..\Hstation.WinFrmUI.Core\HStation.WinFrmUI.Core.csproj" />
     <ProjectReference Include="..\Yw.WinFrmUI.Map.Core\Yw.WinFrmUI.Map.Core.csproj" />
   </ItemGroup>
 
   <ItemGroup>
-    <Folder Include="map\gaode\css\" />
+    <Compile Update="AddXhsProjectDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Update="MainPanel.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="Properties\Resources.Designer.cs">
+      <DesignTime>True</DesignTime>
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <Compile Update="XhsProjectTreeList.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="XhsProjectUserControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Update="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
   </ItemGroup>
 
 </Project>
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.Designer.cs
new file mode 100644
index 0000000..4b8add9
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.Designer.cs
@@ -0,0 +1,166 @@
+锘縩amespace HStation.WinFrmUI.Xhs.Core
+{
+    partial class MainPanel
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            xhsProjectTreeList1 = new XhsProjectTreeList();
+            panelControl1 = new DevExpress.XtraEditors.PanelControl();
+            mapViewProjectListContainer1 = new MapViewProjectListContainer();
+            propertyGridControl1 = new DevExpress.XtraVerticalGrid.PropertyGridControl();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)panelControl1).BeginInit();
+            panelControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)propertyGridControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)Root).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem3).BeginInit();
+            SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(xhsProjectTreeList1);
+            layoutControl1.Controls.Add(panelControl1);
+            layoutControl1.Controls.Add(propertyGridControl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(957, 518);
+            layoutControl1.TabIndex = 0;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // xhsProjectTreeList1
+            // 
+            xhsProjectTreeList1.Location = new Point(2, 2);
+            xhsProjectTreeList1.Name = "xhsProjectTreeList1";
+            xhsProjectTreeList1.Size = new Size(146, 514);
+            xhsProjectTreeList1.TabIndex = 6;
+            // 
+            // panelControl1
+            // 
+            panelControl1.Controls.Add(mapViewProjectListContainer1);
+            panelControl1.Location = new Point(152, 2);
+            panelControl1.Name = "panelControl1";
+            panelControl1.Size = new Size(633, 514);
+            panelControl1.TabIndex = 5;
+            // 
+            // mapViewProjectListContainer1
+            // 
+            mapViewProjectListContainer1.Dock = DockStyle.Fill;
+            mapViewProjectListContainer1.Location = new Point(2, 2);
+            mapViewProjectListContainer1.Margin = new Padding(3, 2, 3, 2);
+            mapViewProjectListContainer1.Name = "mapViewProjectListContainer1";
+            mapViewProjectListContainer1.Size = new Size(629, 510);
+            mapViewProjectListContainer1.TabIndex = 0;
+            // 
+            // propertyGridControl1
+            // 
+            propertyGridControl1.Location = new Point(789, 2);
+            propertyGridControl1.Name = "propertyGridControl1";
+            propertyGridControl1.OptionsView.AllowReadOnlyRowAppearance = DevExpress.Utils.DefaultBoolean.True;
+            propertyGridControl1.Size = new Size(166, 514);
+            propertyGridControl1.TabIndex = 4;
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2, layoutControlItem3 });
+            Root.Name = "Root";
+            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            Root.Size = new Size(957, 518);
+            Root.TextVisible = false;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = propertyGridControl1;
+            layoutControlItem1.Location = new Point(787, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(170, 518);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = panelControl1;
+            layoutControlItem2.Location = new Point(150, 0);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Size = new Size(637, 518);
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // layoutControlItem3
+            // 
+            layoutControlItem3.Control = xhsProjectTreeList1;
+            layoutControlItem3.Location = new Point(0, 0);
+            layoutControlItem3.Name = "layoutControlItem3";
+            layoutControlItem3.Size = new Size(150, 518);
+            layoutControlItem3.TextSize = new Size(0, 0);
+            layoutControlItem3.TextVisible = false;
+            // 
+            // MainPanel
+            // 
+            Appearance.BackColor = SystemColors.Control;
+            Appearance.Options.UseBackColor = true;
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(layoutControl1);
+            Name = "MainPanel";
+            Size = new Size(957, 518);
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)panelControl1).EndInit();
+            panelControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)propertyGridControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)Root).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem3).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private Core.XhsProjectTreeList xhsProjectTreeList1;
+        private DevExpress.XtraEditors.PanelControl panelControl1;
+        private DevExpress.XtraVerticalGrid.PropertyGridControl propertyGridControl1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private MapViewProjectListContainer mapViewProjectListContainer1;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.cs
new file mode 100644
index 0000000..c455786
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.cs
@@ -0,0 +1,55 @@
+锘縰sing HStation.WinFrmUI.Core;
+
+namespace HStation.WinFrmUI.Xhs.Core
+{
+    public partial class MainPanel : DocumentPage
+    {
+        public MainPanel()
+        {
+            InitializeComponent();
+            this.xhsProjectTreeList1.SelectProject += XhsProjectTreeList1_SelectProjectAsync;
+        }
+
+        private BLL.XhsProject _bll = null;
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public override void InitialDataSource()
+        {
+            _bll = new BLL.XhsProject();
+            this.xhsProjectTreeList1.SetBindingData();
+            SetBindingData();
+        }
+
+        private async void SetBindingData()
+        {
+            this.mapViewProjectListContainer1.LoadCompletedEvent += MapViewProjectListContainer1_LoadCompletedEvent;
+            await this.mapViewProjectListContainer1.InitialContainer();
+        }
+
+        //鑱氱劍鍦板浘鍒囨崲浜嬩欢
+        private async void XhsProjectTreeList1_SelectProjectAsync(string PrjID)
+        {
+            await mapViewProjectListContainer1.SelectProject(PrjID);
+            var selectchage = await _bll.GetByID(Convert.ToInt64(PrjID));
+            if (selectchage != null)
+            {
+                propertyGridControl1.SelectedObject = new ProjectViewModel(selectchage);
+            }
+        }
+
+        //鍒濆鍖栧湴鍥炬拻鐐�
+        private async void MapViewProjectListContainer1_LoadCompletedEvent()
+        {
+            var list = new List<MapProjectViewModel>();
+            var alllist = await _bll.GetAll();
+            foreach (var item in alllist)
+            {
+                var postionchar = item.MapPosition.Split(',');
+                list.Add(new MapProjectViewModel() { Id = item.ID.ToString(), Name = item.Name, Description = item.Description, Point = new Yw.Model.Map.Point(Convert.ToDouble(postionchar[0]), Convert.ToDouble(postionchar[1])) });
+            }
+            await mapViewProjectListContainer1.SetProjectList(list);
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/MainPanel.resx
@@ -0,0 +1,120 @@
+锘�<?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>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..25a864a
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.Designer.cs
@@ -0,0 +1,63 @@
+锘�//------------------------------------------------------------------------------
+// <auto-generated>
+//     姝や唬鐮佺敱宸ュ叿鐢熸垚銆�
+//     杩愯鏃剁増鏈�:4.0.30319.42000
+//
+//     瀵规鏂囦欢鐨勬洿鏀瑰彲鑳戒細瀵艰嚧涓嶆纭殑琛屼负锛屽苟涓斿鏋�
+//     閲嶆柊鐢熸垚浠g爜锛岃繖浜涙洿鏀瑰皢浼氫涪澶便��
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace HStation.WinFrmUI.Xhs.Core.Properties {
+    using System;
+    
+    
+    /// <summary>
+    ///   涓�涓己绫诲瀷鐨勮祫婧愮被锛岀敤浜庢煡鎵炬湰鍦板寲鐨勫瓧绗︿覆绛夈��
+    /// </summary>
+    // 姝ょ被鏄敱 StronglyTypedResourceBuilder
+    // 绫婚�氳繃绫讳技浜� ResGen 鎴� Visual Studio 鐨勫伐鍏疯嚜鍔ㄧ敓鎴愮殑銆�
+    // 鑻ヨ娣诲姞鎴栫Щ闄ゆ垚鍛橈紝璇风紪杈� .ResX 鏂囦欢锛岀劧鍚庨噸鏂拌繍琛� ResGen
+    // (浠� /str 浣滀负鍛戒护閫夐」)锛屾垨閲嶆柊鐢熸垚 VS 椤圭洰銆�
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class Resources {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal Resources() {
+        }
+        
+        /// <summary>
+        ///   杩斿洖姝ょ被浣跨敤鐨勭紦瀛樼殑 ResourceManager 瀹炰緥銆�
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HStation.WinFrmUI.Xhs.Core.Properties.Resources", typeof(Resources).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   閲嶅啓褰撳墠绾跨▼鐨� CurrentUICulture 灞炴�э紝瀵�
+        ///   浣跨敤姝ゅ己绫诲瀷璧勬簮绫荤殑鎵�鏈夎祫婧愭煡鎵炬墽琛岄噸鍐欍��
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/Resources.resx
@@ -0,0 +1,120 @@
+锘�<?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>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/PropertySorter.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/PropertySorter.cs
new file mode 100644
index 0000000..9e56d01
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/PropertySorter.cs
@@ -0,0 +1,135 @@
+锘縰sing System;
+using System.Collections;
+using System.ComponentModel;
+
+namespace HStation.WinFrmUI.Core
+{
+    public class PropertySorter : ExpandableObjectConverter
+    {
+        #region Methods
+
+        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
+        {
+            return true;
+        }
+
+        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
+        {
+            //
+            // This override returns a list of properties in order
+            //
+            PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(value, attributes);
+            ArrayList orderedProperties = new ArrayList();
+            foreach (PropertyDescriptor pd in pdc)
+            {
+                Attribute attribute = pd.Attributes[typeof(PropertyOrderAttribute)];
+                if (attribute != null)
+                {
+                    //
+                    // If the attribute is found, then create an pair object to hold it
+                    //
+                    PropertyOrderAttribute poa = (PropertyOrderAttribute)attribute;
+                    orderedProperties.Add(new PropertyOrderPair(pd.Name, poa.Order));
+                }
+                else
+                {
+                    //
+                    // If no order attribute is specifed then given it an order of 0
+                    //
+                    orderedProperties.Add(new PropertyOrderPair(pd.Name, 0));
+                }
+            }
+            //
+            // Perform the actual order using the value PropertyOrderPair classes
+            // implementation of IComparable to sort
+            //
+            orderedProperties.Sort();
+            //
+            // Build a string list of the ordered names
+            //
+            ArrayList propertyNames = new ArrayList();
+            foreach (PropertyOrderPair pop in orderedProperties)
+            {
+                propertyNames.Add(pop.Name);
+            }
+            //
+            // Pass in the ordered list for the PropertyDescriptorCollection to sort by
+            //
+            return pdc.Sort((string[])propertyNames.ToArray(typeof(string)));
+        }
+
+        #endregion Methods
+    }
+
+    #region Helper Class - PropertyOrderAttribute
+
+    [AttributeUsage(AttributeTargets.Property)]
+    public class PropertyOrderAttribute : Attribute
+    {
+        //
+        // Simple attribute to allow the order of a property to be specified
+        //
+        private int _order;
+
+        public PropertyOrderAttribute(int order)
+        {
+            _order = order;
+        }
+
+        public int Order
+        {
+            get
+            {
+                return _order;
+            }
+        }
+    }
+
+    #endregion Helper Class - PropertyOrderAttribute
+
+    #region Helper Class - PropertyOrderPair
+
+    public class PropertyOrderPair : IComparable
+    {
+        private int _order;
+        private string _name;
+
+        public string Name
+        {
+            get
+            {
+                return _name;
+            }
+        }
+
+        public PropertyOrderPair(string name, int order)
+        {
+            _order = order;
+            _name = name;
+        }
+
+        public int CompareTo(object obj)
+        {
+            //
+            // Sort the pair objects by ordering by order value
+            // Equal values get the same rank
+            //
+            int otherOrder = ((PropertyOrderPair)obj)._order;
+            if (otherOrder == _order)
+            {
+                //
+                // If order not specified, sort by name
+                //
+                string otherName = ((PropertyOrderPair)obj)._name;
+                return string.Compare(_name, otherName);
+            }
+            else if (otherOrder > _order)
+            {
+                return -1;
+            }
+            return 1;
+        }
+    }
+
+    #endregion Helper Class - PropertyOrderPair
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/ViewModelHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/ViewModelHelper.cs
new file mode 100644
index 0000000..690138c
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/ViewModelHelper.cs
@@ -0,0 +1,73 @@
+锘縰sing HStation.Dto;
+using System.ComponentModel;
+
+namespace HStation.WinFrmUI.Core
+{
+    public class ProjectViewModel
+    {
+        [TypeConverter(typeof(PropertySorter))]
+        public ProjectViewModel(XhsProjectDto rhs)
+        {
+            this.Address = rhs.Address;
+            this.Name = rhs.Name;
+            this.ProjectNumber = rhs.PrjNumber;
+            this.CreateTime = rhs.CreateTime;
+            this.Description = rhs.Description;
+            this.CreateName = rhs.CreateUserDisplayName;
+        }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        [DisplayName("鍚嶇О")]
+        [Category("鍩烘湰淇℃伅")]
+        [PropertyOrder(11)]
+        [Browsable(true)]
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 椤圭洰缂栧彿
+        /// </summary>
+        [DisplayName("椤圭洰缂栧彿")]
+        [Category("鍩烘湰淇℃伅")]
+        [Browsable(true)]
+        [PropertyOrder(-9)]
+        public string ProjectNumber { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓鏃堕棿
+        /// </summary>
+        [DisplayName("鍒涘缓鏃堕棿")]
+        [Category("鍩烘湰淇℃伅")]
+        [PropertyOrder(-10)]
+        [Browsable(true)]
+        public DateTime CreateTime { get; set; }
+
+        /// <summary>
+        /// 鍒涘缓浜�
+        /// </summary>
+        [DisplayName("鍒涘缓浜�")]
+        [Category("鍩烘湰淇℃伅")]
+        [PropertyOrder(-11)]
+        [Browsable(true)]
+        public string CreateName { get; set; }
+
+        /// <summary>
+        /// 璇存槑
+        /// </summary>
+        [DisplayName("璇存槑")]
+        [Category("鍩烘湰淇℃伅")]
+        [PropertyOrder(-12)]
+        [Browsable(true)]
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 鍦板潃
+        /// </summary>
+        [DisplayName("鍦板潃")]
+        [Category("鍩烘湰淇℃伅")]
+        [PropertyOrder(-13)]
+        [Browsable(true)]
+        public string Address { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.Designer.cs
new file mode 100644
index 0000000..d3051d6
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.Designer.cs
@@ -0,0 +1,157 @@
+锘縩amespace HStation.WinFrmUI.Xhs.Core
+{
+    partial class XhsProjectTreeList
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(XhsProjectTreeList));
+            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            treeList1 = new DevExpress.XtraTreeList.TreeList();
+            treeListColumn1 = new DevExpress.XtraTreeList.Columns.TreeListColumn();
+            BtnImportProject = new DevExpress.XtraEditors.SimpleButton();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            bindingSource1 = new BindingSource(components);
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)treeList1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)Root).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)bindingSource1).BeginInit();
+            SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(treeList1);
+            layoutControl1.Controls.Add(BtnImportProject);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(264, 519);
+            layoutControl1.TabIndex = 0;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // treeList1
+            // 
+            treeList1.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] { treeListColumn1 });
+            treeList1.Location = new Point(2, 2);
+            treeList1.Name = "treeList1";
+            treeList1.OptionsBehavior.Editable = false;
+            treeList1.OptionsFind.AlwaysVisible = true;
+            treeList1.OptionsFind.FindNullPrompt = "杈撳叆鎼滅储鍏抽敭璇嶏細";
+            treeList1.Size = new Size(260, 475);
+            treeList1.TabIndex = 0;
+            treeList1.ViewStyle = DevExpress.XtraTreeList.TreeListViewStyle.TreeView;
+            treeList1.FocusedNodeChanged += treeList1_FocusedNodeChanged;
+            treeList1.DoubleClick += treeList1_DoubleClick;
+            // 
+            // treeListColumn1
+            // 
+            treeListColumn1.Caption = "treeListColumn1";
+            treeListColumn1.FieldName = "Name";
+            treeListColumn1.Name = "treeListColumn1";
+            treeListColumn1.Visible = true;
+            treeListColumn1.VisibleIndex = 0;
+            // 
+            // BtnImportProject
+            // 
+            BtnImportProject.Appearance.BackColor = Color.MediumTurquoise;
+            BtnImportProject.Appearance.Font = new Font("Tahoma", 15F, FontStyle.Bold, GraphicsUnit.Point);
+            BtnImportProject.Appearance.Options.UseBackColor = true;
+            BtnImportProject.Appearance.Options.UseFont = true;
+            BtnImportProject.Appearance.Options.UseTextOptions = true;
+            BtnImportProject.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            BtnImportProject.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("BtnImportProject.ImageOptions.SvgImage");
+            BtnImportProject.Location = new Point(2, 481);
+            BtnImportProject.Name = "BtnImportProject";
+            BtnImportProject.Size = new Size(260, 36);
+            BtnImportProject.StyleController = layoutControl1;
+            BtnImportProject.TabIndex = 2;
+            BtnImportProject.Text = "瀵煎叆椤圭洰";
+            BtnImportProject.Click += BtnImportProject_Click;
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2 });
+            Root.Name = "Root";
+            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            Root.Size = new Size(264, 519);
+            Root.TextVisible = false;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = treeList1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(264, 479);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = BtnImportProject;
+            layoutControlItem2.Location = new Point(0, 479);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Size = new Size(264, 40);
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // XhsProjectTreeList
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(layoutControl1);
+            Name = "XhsProjectTreeList";
+            Size = new Size(264, 519);
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)treeList1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)Root).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)bindingSource1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraTreeList.TreeList treeList1;
+        private DevExpress.XtraEditors.SimpleButton BtnImportProject;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private BindingSource bindingSource1;
+        private DevExpress.XtraTreeList.Columns.TreeListColumn treeListColumn1;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.cs
new file mode 100644
index 0000000..7508f24
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.cs
@@ -0,0 +1,61 @@
+锘縰sing HStation.Dto;
+
+namespace HStation.WinFrmUI.Xhs.Core
+{
+    public partial class XhsProjectTreeList : DevExpress.XtraEditors.XtraUserControl
+    {
+        public XhsProjectTreeList()
+        {
+            InitializeComponent();
+        }
+
+        private List<XhsProjectDto> _allBindingList = null;
+
+        private BLL.XhsProject _bll;
+
+        public async void SetBindingData()
+        {
+            _bll = new BLL.XhsProject();
+            var alllist = await _bll.GetAll();
+            _allBindingList = alllist;
+            this.treeList1.DataSource = _allBindingList;
+            this.treeList1.RefreshDataSource();
+        }
+
+        public event Action<string> SelectProject;
+
+        //鍙屽嚮杩涘叆椤圭洰璇︽儏浜嬩欢
+        private void treeList1_DoubleClick(object sender, EventArgs e)
+        {
+        }
+
+        //鑱氱劍鍒囨崲
+        private void treeList1_FocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e)
+        {
+            var vm = this.treeList1.GetCurrentViewModel(_allBindingList);
+            if (vm != null)
+            {
+                SelectProject.Invoke(vm.ID.ToString());
+            }
+        }
+
+        //瀵煎叆椤圭洰
+        private void BtnImportProject_Click(object sender, EventArgs e)
+        {
+            var dlg = new AddXhsProjectDlg();
+            dlg.ReloadEvent += async (project, item, model, map) =>
+            {
+                var id = await _bll.InsertEx(project, item, model, map);
+                if (id > 0)
+                {
+                    var vmmodel = await _bll.GetByID(id);
+                    _allBindingList.Add(vmmodel);
+                    this.treeList1.RefreshDataSource();
+                    return true;
+                }
+                return false;
+            };
+            dlg.ShowDialog();
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.resx
new file mode 100644
index 0000000..2cb3a90
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectTreeList.resx
@@ -0,0 +1,144 @@
+锘�<?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.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="BtnImportProject.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAOsCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJs
+        YWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMy
+        Mzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQo8L3N0eWxl
+        Pg0KICA8ZyBpZD0iSW1wb3J0Ij4NCiAgICA8cGF0aCBkPSJNMTAsMTJINlY2aDRWMTJ6IE0yMiwxN3Yx
+        djljMCwwLjYtMC40LDEtMSwxSDFjLTAuNiwwLTEtMC40LTEtMVY3YzAtMC42LDAuNC0xLDEtMWgzdjho
+        MTRMMjIsMTd6IE0xOCwxOEg0ICAgdjZoMTRWMTh6IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBvbHln
+        b24gcG9pbnRzPSIzMCw2IDIyLDYgMjIsMiAxNCw4IDIyLDE0IDIyLDEwIDMwLDEwICAiIGNsYXNzPSJH
+        cmVlbiIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
+</value>
+  </data>
+  <metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.Designer.cs
new file mode 100644
index 0000000..2b768bb
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.Designer.cs
@@ -0,0 +1,373 @@
+锘縩amespace HStation.WinFrmUI.Xhs.PumpProject
+{
+    partial class XhsProjectUserControl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            TagName = new DevExpress.XtraEditors.TextEdit();
+            CustomerNameTextEdit = new DevExpress.XtraEditors.TextEdit();
+            NameTextEdit = new DevExpress.XtraEditors.TextEdit();
+            BtnFileChoice = new DevExpress.XtraEditors.ButtonEdit();
+            DescriptionTextEdit = new DevExpress.XtraEditors.MemoEdit();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem13 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem11 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem12 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem16 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem14 = new DevExpress.XtraLayout.LayoutControlItem();
+            ItemForName = new DevExpress.XtraLayout.LayoutControlItem();
+            ItemForConstructionYear = new DevExpress.XtraLayout.LayoutControlItem();
+            ItemForTagName = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem7 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem8 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem9 = new DevExpress.XtraLayout.LayoutControlItem();
+            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)TagName.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)CustomerNameTextEdit.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)NameTextEdit.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)BtnFileChoice.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)DescriptionTextEdit.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)Root).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem13).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem11).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem12).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem16).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem14).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)ItemForName).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)ItemForConstructionYear).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)ItemForTagName).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem6).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem4).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem5).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem3).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem7).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem8).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem9).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)dxErrorProvider1).BeginInit();
+            SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(TagName);
+            layoutControl1.Controls.Add(CustomerNameTextEdit);
+            layoutControl1.Controls.Add(NameTextEdit);
+            layoutControl1.Controls.Add(BtnFileChoice);
+            layoutControl1.Controls.Add(DescriptionTextEdit);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(967, 0, 650, 400);
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(709, 196);
+            layoutControl1.TabIndex = 0;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // TagName
+            // 
+            TagName.Location = new Point(420, 36);
+            TagName.Name = "TagName";
+            TagName.Size = new Size(277, 20);
+            TagName.StyleController = layoutControl1;
+            TagName.TabIndex = 5;
+            // 
+            // CustomerNameTextEdit
+            // 
+            CustomerNameTextEdit.Location = new Point(420, 12);
+            CustomerNameTextEdit.Margin = new Padding(2);
+            CustomerNameTextEdit.Name = "CustomerNameTextEdit";
+            CustomerNameTextEdit.Size = new Size(277, 20);
+            CustomerNameTextEdit.StyleController = layoutControl1;
+            CustomerNameTextEdit.TabIndex = 2;
+            // 
+            // NameTextEdit
+            // 
+            NameTextEdit.Location = new Point(76, 12);
+            NameTextEdit.Name = "NameTextEdit";
+            NameTextEdit.Size = new Size(276, 20);
+            NameTextEdit.StyleController = layoutControl1;
+            NameTextEdit.TabIndex = 0;
+            // 
+            // 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.Properties.ReadOnly = true;
+            BtnFileChoice.Size = new Size(276, 20);
+            BtnFileChoice.StyleController = layoutControl1;
+            BtnFileChoice.TabIndex = 4;
+            BtnFileChoice.Click += BtnFileChoice_Click;
+            // 
+            // DescriptionTextEdit
+            // 
+            DescriptionTextEdit.Location = new Point(76, 60);
+            DescriptionTextEdit.Name = "DescriptionTextEdit";
+            DescriptionTextEdit.Size = new Size(621, 124);
+            DescriptionTextEdit.StyleController = layoutControl1;
+            DescriptionTextEdit.TabIndex = 7;
+            // 
+            // Root
+            // 
+            Root.AppearanceItemCaption.Options.UseTextOptions = true;
+            Root.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
+            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem13, layoutControlItem11, layoutControlItem12, layoutControlItem16, layoutControlItem14 });
+            Root.Name = "Root";
+            Root.Size = new Size(709, 196);
+            Root.TextVisible = false;
+            // 
+            // layoutControlItem13
+            // 
+            layoutControlItem13.Control = CustomerNameTextEdit;
+            layoutControlItem13.Location = new Point(344, 0);
+            layoutControlItem13.Name = "layoutControlItem13";
+            layoutControlItem13.Size = new Size(345, 24);
+            layoutControlItem13.Text = "瀹㈡埛鍚嶇О:";
+            layoutControlItem13.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem11
+            // 
+            layoutControlItem11.AllowHtmlStringInCaption = true;
+            layoutControlItem11.Control = NameTextEdit;
+            layoutControlItem11.Location = new Point(0, 0);
+            layoutControlItem11.Name = "layoutControlItem11";
+            layoutControlItem11.Size = new Size(344, 24);
+            layoutControlItem11.Text = "<color=red>*</color>鍚嶇О:";
+            layoutControlItem11.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem12
+            // 
+            layoutControlItem12.Control = BtnFileChoice;
+            layoutControlItem12.Location = new Point(0, 24);
+            layoutControlItem12.Name = "layoutControlItem12";
+            layoutControlItem12.Size = new Size(344, 24);
+            layoutControlItem12.Text = "妯″瀷閫夋嫨:";
+            layoutControlItem12.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem16
+            // 
+            layoutControlItem16.Control = DescriptionTextEdit;
+            layoutControlItem16.Location = new Point(0, 48);
+            layoutControlItem16.Name = "layoutControlItem16";
+            layoutControlItem16.Size = new Size(689, 128);
+            layoutControlItem16.Text = "璇存槑";
+            layoutControlItem16.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem14
+            // 
+            layoutControlItem14.Control = TagName;
+            layoutControlItem14.Location = new Point(344, 24);
+            layoutControlItem14.Name = "layoutControlItem14";
+            layoutControlItem14.Size = new Size(345, 24);
+            layoutControlItem14.Text = "鏍囩:";
+            layoutControlItem14.TextSize = new Size(52, 14);
+            // 
+            // ItemForName
+            // 
+            ItemForName.AllowHtmlStringInCaption = true;
+            ItemForName.Location = new Point(0, 74);
+            ItemForName.Name = "ItemForName";
+            ItemForName.Size = new Size(413, 24);
+            ItemForName.Text = "<color=red>*</color>鍚嶇О:";
+            ItemForName.TextSize = new Size(52, 14);
+            // 
+            // ItemForConstructionYear
+            // 
+            ItemForConstructionYear.Location = new Point(0, 98);
+            ItemForConstructionYear.Name = "ItemForConstructionYear";
+            ItemForConstructionYear.Size = new Size(413, 24);
+            ItemForConstructionYear.Text = "閫夋嫨鏂囦欢:";
+            ItemForConstructionYear.TextSize = new Size(52, 14);
+            // 
+            // ItemForTagName
+            // 
+            ItemForTagName.AppearanceItemCaption.Options.UseTextOptions = true;
+            ItemForTagName.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
+            ItemForTagName.Location = new Point(0, 122);
+            ItemForTagName.Name = "ItemForTagName";
+            ItemForTagName.Size = new Size(827, 24);
+            ItemForTagName.Text = "涓夌淮妯″瀷:";
+            ItemForTagName.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem6
+            // 
+            layoutControlItem6.Location = new Point(0, 146);
+            layoutControlItem6.Name = "layoutControlItem6";
+            layoutControlItem6.Size = new Size(827, 24);
+            layoutControlItem6.Text = "璇︾粏鍦板潃:";
+            layoutControlItem6.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem4
+            // 
+            layoutControlItem4.Location = new Point(413, 98);
+            layoutControlItem4.Name = "layoutControlItem4";
+            layoutControlItem4.Size = new Size(414, 24);
+            layoutControlItem4.Text = "鏍囩:";
+            layoutControlItem4.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem5
+            // 
+            layoutControlItem5.Location = new Point(413, 74);
+            layoutControlItem5.Name = "layoutControlItem5";
+            layoutControlItem5.Size = new Size(414, 24);
+            layoutControlItem5.Text = "瀹㈡埛鍚嶇О:";
+            layoutControlItem5.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Location = new Point(0, 146);
+            layoutControlItem1.Name = "layoutControlItem6";
+            layoutControlItem1.Size = new Size(827, 24);
+            layoutControlItem1.Text = "璇︾粏鍦板潃:";
+            layoutControlItem1.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.AppearanceItemCaption.Options.UseTextOptions = true;
+            layoutControlItem2.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
+            layoutControlItem2.Location = new Point(0, 122);
+            layoutControlItem2.Name = "ItemForTagName";
+            layoutControlItem2.Size = new Size(827, 24);
+            layoutControlItem2.Text = "涓夌淮妯″瀷:";
+            layoutControlItem2.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem3
+            // 
+            layoutControlItem3.Location = new Point(0, 98);
+            layoutControlItem3.Name = "ItemForConstructionYear";
+            layoutControlItem3.Size = new Size(413, 24);
+            layoutControlItem3.Text = "閫夋嫨鏂囦欢:";
+            layoutControlItem3.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem7
+            // 
+            layoutControlItem7.AllowHtmlStringInCaption = true;
+            layoutControlItem7.Location = new Point(0, 74);
+            layoutControlItem7.Name = "ItemForName";
+            layoutControlItem7.Size = new Size(413, 24);
+            layoutControlItem7.Text = "<color=red>*</color>鍚嶇О:";
+            layoutControlItem7.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem8
+            // 
+            layoutControlItem8.Location = new Point(413, 98);
+            layoutControlItem8.Name = "layoutControlItem4";
+            layoutControlItem8.Size = new Size(414, 24);
+            layoutControlItem8.Text = "鏍囩:";
+            layoutControlItem8.TextSize = new Size(52, 14);
+            // 
+            // layoutControlItem9
+            // 
+            layoutControlItem9.Location = new Point(413, 74);
+            layoutControlItem9.Name = "layoutControlItem5";
+            layoutControlItem9.Size = new Size(414, 24);
+            layoutControlItem9.Text = "瀹㈡埛鍚嶇О:";
+            layoutControlItem9.TextSize = new Size(52, 14);
+            // 
+            // dxErrorProvider1
+            // 
+            dxErrorProvider1.ContainerControl = this;
+            // 
+            // ProjectUserControl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(layoutControl1);
+            Name = "ProjectUserControl";
+            Size = new Size(709, 196);
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)TagName.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)CustomerNameTextEdit.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)NameTextEdit.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)BtnFileChoice.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)DescriptionTextEdit.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)Root).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem13).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem11).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem12).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem16).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem14).EndInit();
+            ((System.ComponentModel.ISupportInitialize)ItemForName).EndInit();
+            ((System.ComponentModel.ISupportInitialize)ItemForConstructionYear).EndInit();
+            ((System.ComponentModel.ISupportInitialize)ItemForTagName).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem6).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem4).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem5).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem3).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem7).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem8).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem9).EndInit();
+            ((System.ComponentModel.ISupportInitialize)dxErrorProvider1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraLayout.LayoutControlItem ItemForName;
+        private DevExpress.XtraLayout.LayoutControlItem ItemForConstructionYear;
+        private DevExpress.XtraLayout.LayoutControlItem ItemForTagName;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem6;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem5;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem7;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem8;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem9;
+        private DevExpress.XtraEditors.TextEdit TagName;
+        private DevExpress.XtraEditors.TextEdit CustomerNameTextEdit;
+        private DevExpress.XtraEditors.TextEdit NameTextEdit;
+        private DevExpress.XtraEditors.ButtonEdit BtnFileChoice;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem11;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem12;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem13;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem14;
+        private DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider dxErrorProvider1;
+        private DevExpress.XtraEditors.MemoEdit DescriptionTextEdit;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem16;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.cs
new file mode 100644
index 0000000..3f12d2a
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.cs
@@ -0,0 +1,56 @@
+锘縰sing HStation.Dto;
+
+namespace HStation.WinFrmUI.Xhs.PumpProject
+{
+    public partial class XhsProjectUserControl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public XhsProjectUserControl()
+        {
+            InitializeComponent();
+        }
+
+        private AddXhsProjectInput _AddXhsProjectInput = null;
+
+        //楠岃瘉
+        public bool Valid()
+        {
+            this.dxErrorProvider1.ClearErrors();
+            if (string.IsNullOrEmpty(this.NameTextEdit.Text.Trim()))
+            {
+                this.dxErrorProvider1.SetError(this.NameTextEdit, "蹇呭~椤�");
+                return false;
+            }
+            return true;
+        }
+
+        public AddXhsProjectInput GetData(AddXhsProjectInput model)
+        {
+            model.Name = this.NameTextEdit.Text.Trim();
+            model.CustomerName = this.CustomerNameTextEdit.Text.Trim();
+            model.CreateTime = DateTime.Now;
+            model.TagName = this.TagName.Text.Trim();
+            model.GID = Guid.NewGuid().ToString();
+            model.Description = this.DescriptionTextEdit.Text.Trim();
+            return model;
+        }
+
+        //閫夋嫨鏂囦欢
+        private void BtnFileChoice_Click(object sender, EventArgs e)
+        {
+            OpenFileDialog openFileDialog = new OpenFileDialog();
+            openFileDialog.Filter = "ZIP Files (*.zip)|*.zip";
+            openFileDialog.FilterIndex = 1;
+            string selectedFilePath = null;
+            if (openFileDialog.ShowDialog() == DialogResult.OK)
+            {
+                selectedFilePath = openFileDialog.FileName;
+                string newFileName = selectedFilePath.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)
+       ? selectedFilePath.Substring(0, selectedFilePath.Length - 4) + ".hsr"
+       : selectedFilePath;
+                this.BtnFileChoice.Text = newFileName;
+                //瑙e帇鏂囦欢
+                // ExtractHelper.ExractFile(selectedFilePath);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.resx
new file mode 100644
index 0000000..d438392
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/XhsProjectUserControl.resx
@@ -0,0 +1,123 @@
+锘�<?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>
+  <metadata name="dxErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj b/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj
index 275f16d..f969340 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj
@@ -11,11 +11,13 @@
   </ItemGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\Dto\Hstation.Dto.Core\Hstation.Dto.Core.csproj" />
     <ProjectReference Include="..\Hstation.WinFrmUI.Core\HStation.WinFrmUI.Core.csproj" />
   </ItemGroup>
 
   <ItemGroup>
+    <Compile Update="XhsProjectUserControl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Update="XhsPumpCurveMainPanel.cs">
       <SubType>UserControl</SubType>
     </Compile>
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj.user b/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj.user
index 88a5509..b5309f2 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj.user
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/HStation.WinFrmUI.Xhs.Curve.csproj.user
@@ -1,4 +1,5 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup />
+  <ItemGroup />
 </Project>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/XhsPumpCurveMainPanel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/XhsPumpCurveMainPanel.cs
index 8ed69dd..545d6db 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/XhsPumpCurveMainPanel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Curve/XhsPumpCurveMainPanel.cs
@@ -1,6 +1,4 @@
-锘縰sing HStation.Dto;
-
-namespace HStation.WinFrmUI.Xhs
+锘縩amespace HStation.WinFrmUI.Xhs
 {
     public partial class XhsPumpCurveMainPanel : DocumentPage
     {
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/00-PumpProductManage/AddPumpProductMainDlg.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/00-PumpProductManage/AddPumpProductMainDlg.Designer.cs
index 7652c35..626e8ea 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/00-PumpProductManage/AddPumpProductMainDlg.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/00-PumpProductManage/AddPumpProductMainDlg.Designer.cs
@@ -57,10 +57,14 @@
             layoutControlItem11 = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControlItem12 = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControlItem13 = new DevExpress.XtraLayout.LayoutControlItem();
-            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
             tabbedControlGroup1 = new DevExpress.XtraLayout.TabbedControlGroup();
             layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
+            dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(components);
+            layoutControlGroup2 = new DevExpress.XtraLayout.LayoutControlGroup();
+            gridControl1 = new DevExpress.XtraGrid.GridControl();
+            gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            layoutControlItem14 = new DevExpress.XtraLayout.LayoutControlItem();
             ((System.ComponentModel.ISupportInitialize)layoutControl1).BeginInit();
             layoutControl1.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)TextEditName.Properties).BeginInit();
@@ -88,14 +92,19 @@
             ((System.ComponentModel.ISupportInitialize)layoutControlItem11).BeginInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlItem12).BeginInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlItem13).BeginInit();
-            ((System.ComponentModel.ISupportInitialize)dxErrorProvider1).BeginInit();
             ((System.ComponentModel.ISupportInitialize)tabbedControlGroup1).BeginInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlGroup1).BeginInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlItem5).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)dxErrorProvider1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)gridControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem14).BeginInit();
             SuspendLayout();
             // 
             // layoutControl1
             // 
+            layoutControl1.Controls.Add(gridControl1);
             layoutControl1.Controls.Add(BtnOk);
             layoutControl1.Controls.Add(simpleButton1);
             layoutControl1.Controls.Add(TextEditName);
@@ -363,17 +372,13 @@
             layoutControlItem13.Text = "閫夋嫨鍒嗙被";
             layoutControlItem13.TextSize = new Size(59, 14);
             // 
-            // dxErrorProvider1
-            // 
-            dxErrorProvider1.ContainerControl = this;
-            // 
             // tabbedControlGroup1
             // 
             tabbedControlGroup1.Location = new Point(0, 144);
             tabbedControlGroup1.Name = "tabbedControlGroup1";
-            tabbedControlGroup1.SelectedTabPage = layoutControlGroup1;
+            tabbedControlGroup1.SelectedTabPage = layoutControlGroup2;
             tabbedControlGroup1.Size = new Size(575, 241);
-            tabbedControlGroup1.TabPages.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1 });
+            tabbedControlGroup1.TabPages.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1, layoutControlGroup2 });
             tabbedControlGroup1.Text = "璇存槑";
             // 
             // layoutControlGroup1
@@ -382,6 +387,7 @@
             layoutControlGroup1.Location = new Point(0, 0);
             layoutControlGroup1.Name = "layoutControlGroup1";
             layoutControlGroup1.Size = new Size(551, 193);
+            layoutControlGroup1.Text = "璇存槑";
             // 
             // layoutControlItem5
             // 
@@ -391,6 +397,41 @@
             layoutControlItem5.Size = new Size(551, 193);
             layoutControlItem5.Text = "璇存槑:";
             layoutControlItem5.TextSize = new Size(59, 14);
+            // 
+            // dxErrorProvider1
+            // 
+            dxErrorProvider1.ContainerControl = this;
+            // 
+            // layoutControlGroup2
+            // 
+            layoutControlGroup2.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem14 });
+            layoutControlGroup2.Location = new Point(0, 0);
+            layoutControlGroup2.Name = "layoutControlGroup2";
+            layoutControlGroup2.Size = new Size(551, 193);
+            layoutControlGroup2.Text = "灞炴��";
+            // 
+            // gridControl1
+            // 
+            gridControl1.Location = new Point(20, 188);
+            gridControl1.MainView = gridView1;
+            gridControl1.Name = "gridControl1";
+            gridControl1.Size = new Size(547, 189);
+            gridControl1.TabIndex = 14;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 });
+            // 
+            // gridView1
+            // 
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            // 
+            // layoutControlItem14
+            // 
+            layoutControlItem14.Control = gridControl1;
+            layoutControlItem14.Location = new Point(0, 0);
+            layoutControlItem14.Name = "layoutControlItem14";
+            layoutControlItem14.Size = new Size(551, 193);
+            layoutControlItem14.TextSize = new Size(0, 0);
+            layoutControlItem14.TextVisible = false;
             // 
             // AddPumpProductMainDlg
             // 
@@ -428,10 +469,14 @@
             ((System.ComponentModel.ISupportInitialize)layoutControlItem11).EndInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlItem12).EndInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlItem13).EndInit();
-            ((System.ComponentModel.ISupportInitialize)dxErrorProvider1).EndInit();
             ((System.ComponentModel.ISupportInitialize)tabbedControlGroup1).EndInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlGroup1).EndInit();
             ((System.ComponentModel.ISupportInitialize)layoutControlItem5).EndInit();
+            ((System.ComponentModel.ISupportInitialize)dxErrorProvider1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)gridControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem14).EndInit();
             ResumeLayout(false);
         }
 
@@ -469,5 +514,9 @@
         private DevExpress.XtraLayout.TabbedControlGroup tabbedControlGroup1;
         private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem5;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup2;
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem14;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.PumpProduct.csproj b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.PumpProduct.csproj
index ede781e..27b0282 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.PumpProduct.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Project/HStation.WinFrmUI.Xhs.PumpProduct.csproj
@@ -22,7 +22,6 @@
   <ItemGroup>
     <ProjectReference Include="..\..\BLL\HStation.BLL.Xhs.Core\HStation.BLL.Xhs.Core.csproj" />
     <ProjectReference Include="..\..\Model\HStation.Model.Xhs.PumpProduct\HStation.Model.Xhs.PumpProduct.csproj" />
-    <ProjectReference Include="..\..\Setting\Hstation.Hxs.Setting\Hstation.Setting.Xhs.Core.csproj" />
     <ProjectReference Include="..\HStation.WinFrmUI.Basic\HStation.WinFrmUI.Basic.csproj" />
     <ProjectReference Include="..\Hstation.WinFrmUI.Core\HStation.WinFrmUI.Core.csproj" />
   </ItemGroup>
diff --git a/WinFrmUI/Hstation.WinFrmUI.Core/Hstation.WinFrmUI.Core.csproj b/WinFrmUI/Hstation.WinFrmUI.Core/Hstation.WinFrmUI.Core.csproj
index 40ac53b..d79ddb8 100644
--- a/WinFrmUI/Hstation.WinFrmUI.Core/Hstation.WinFrmUI.Core.csproj
+++ b/WinFrmUI/Hstation.WinFrmUI.Core/Hstation.WinFrmUI.Core.csproj
@@ -13,6 +13,7 @@
 
   <ItemGroup>
     <PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
+    <PackageReference Include="Yw.BLL.Auth.Core" Version="3.0.7" />
   </ItemGroup>
 
   <ItemGroup>

--
Gitblit v1.9.3