Selaa lähdekoodia

添加项目文件。

Joey 5 päivää sitten
vanhempi
commit
9234ebfda0
17 muutettua tiedostoa jossa 2061 lisäystä ja 0 poistoa
  1. 28 0
      App.config
  2. 373 0
      DDQ.Designer.cs
  3. 75 0
      DDQ.cs
  4. 120 0
      DDQ.resx
  5. 193 0
      DataAccess.cs
  6. 561 0
      FundQ.Designer.cs
  7. 106 0
      FundQ.cs
  8. 120 0
      FundQ.resx
  9. 22 0
      Program.cs
  10. 36 0
      Properties/AssemblyInfo.cs
  11. 71 0
      Properties/Resources.Designer.cs
  12. 117 0
      Properties/Resources.resx
  13. 30 0
      Properties/Settings.Designer.cs
  14. 7 0
      Properties/Settings.settings
  15. 155 0
      ddq.csproj
  16. 25 0
      ddq.sln
  17. 22 0
      packages.config

+ 28 - 0
App.config

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+    <startup> 
+        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
+    </startup>
+	<connectionStrings>
+		<add name="MySQL" connectionString="server=funditdb-dev.mysql.rds.aliyuncs.com;user id=pf_user;password=MzBlMDA0OG;database=pfdb" />
+	</connectionStrings>
+	<appSettings>
+		<add key="bypassLogin" value="true" />
+	</appSettings>
+  <runtime>
+    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+      <dependentAssembly>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
+      </dependentAssembly>
+      <dependentAssembly>
+        <assemblyIdentity name="System.IO.Pipelines" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-9.0.0.10" newVersion="9.0.0.10" />
+      </dependentAssembly>
+    </assemblyBinding>
+  </runtime>
+</configuration>

+ 373 - 0
DDQ.Designer.cs

@@ -0,0 +1,373 @@
+namespace ddq
+{
+    partial class frmMain
+    {
+        /// <summary>
+        /// 必需的设计器变量。
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// 清理所有正在使用的资源。
+        /// </summary>
+        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows 窗体设计器生成的代码
+
+        /// <summary>
+        /// 设计器支持所需的方法 - 不要修改
+        /// 使用代码编辑器修改此方法的内容。
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.tbcMain = new System.Windows.Forms.TabControl();
+            this.tabRequests = new System.Windows.Forms.TabPage();
+            this.panRequests = new System.Windows.Forms.Panel();
+            this.panRequestList = new System.Windows.Forms.Panel();
+            this.dataGridView1 = new System.Windows.Forms.DataGridView();
+            this.panRequestsTool = new System.Windows.Forms.Panel();
+            this.cmbRequestAction = new System.Windows.Forms.ComboBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.btnSearchRequest = new System.Windows.Forms.Button();
+            this.txtSearchRequest = new System.Windows.Forms.TextBox();
+            this.tabData = new System.Windows.Forms.TabPage();
+            this.tbcData = new System.Windows.Forms.TabControl();
+            this.tabFunds = new System.Windows.Forms.TabPage();
+            this.panFundList = new System.Windows.Forms.Panel();
+            this.grdFundList = new System.Windows.Forms.DataGridView();
+            this.panFundsTool = new System.Windows.Forms.Panel();
+            this.cmbFundCategory = new System.Windows.Forms.ComboBox();
+            this.label2 = new System.Windows.Forms.Label();
+            this.btnSearchFund = new System.Windows.Forms.Button();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.tabPeople = new System.Windows.Forms.TabPage();
+            this.tabCompany = new System.Windows.Forms.TabPage();
+            this.tabSettings = new System.Windows.Forms.TabPage();
+            this.tbcMain.SuspendLayout();
+            this.tabRequests.SuspendLayout();
+            this.panRequests.SuspendLayout();
+            this.panRequestList.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
+            this.panRequestsTool.SuspendLayout();
+            this.tabData.SuspendLayout();
+            this.tbcData.SuspendLayout();
+            this.tabFunds.SuspendLayout();
+            this.panFundList.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdFundList)).BeginInit();
+            this.panFundsTool.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // tbcMain
+            // 
+            this.tbcMain.Controls.Add(this.tabRequests);
+            this.tbcMain.Controls.Add(this.tabData);
+            this.tbcMain.Controls.Add(this.tabSettings);
+            this.tbcMain.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tbcMain.Font = new System.Drawing.Font("Calibri", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.tbcMain.ItemSize = new System.Drawing.Size(76, 30);
+            this.tbcMain.Location = new System.Drawing.Point(0, 0);
+            this.tbcMain.Name = "tbcMain";
+            this.tbcMain.SelectedIndex = 0;
+            this.tbcMain.Size = new System.Drawing.Size(800, 525);
+            this.tbcMain.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
+            this.tbcMain.TabIndex = 0;
+            this.tbcMain.SelectedIndexChanged += new System.EventHandler(this.tbcMain_SelectedIndexChanged);
+            // 
+            // tabRequests
+            // 
+            this.tabRequests.Controls.Add(this.panRequests);
+            this.tabRequests.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.tabRequests.Location = new System.Drawing.Point(4, 34);
+            this.tabRequests.Name = "tabRequests";
+            this.tabRequests.Padding = new System.Windows.Forms.Padding(3);
+            this.tabRequests.Size = new System.Drawing.Size(792, 487);
+            this.tabRequests.TabIndex = 0;
+            this.tabRequests.Text = "Requests";
+            this.tabRequests.UseVisualStyleBackColor = true;
+            // 
+            // panRequests
+            // 
+            this.panRequests.Controls.Add(this.panRequestList);
+            this.panRequests.Controls.Add(this.panRequestsTool);
+            this.panRequests.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panRequests.Location = new System.Drawing.Point(3, 3);
+            this.panRequests.Name = "panRequests";
+            this.panRequests.Size = new System.Drawing.Size(786, 481);
+            this.panRequests.TabIndex = 0;
+            // 
+            // panRequestList
+            // 
+            this.panRequestList.Controls.Add(this.dataGridView1);
+            this.panRequestList.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panRequestList.Location = new System.Drawing.Point(0, 55);
+            this.panRequestList.Name = "panRequestList";
+            this.panRequestList.Size = new System.Drawing.Size(786, 426);
+            this.panRequestList.TabIndex = 1;
+            // 
+            // dataGridView1
+            // 
+            this.dataGridView1.AllowUserToAddRows = false;
+            this.dataGridView1.AllowUserToDeleteRows = false;
+            this.dataGridView1.AllowUserToOrderColumns = true;
+            this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.dataGridView1.Location = new System.Drawing.Point(0, 0);
+            this.dataGridView1.Name = "dataGridView1";
+            this.dataGridView1.ReadOnly = true;
+            this.dataGridView1.RowTemplate.Height = 23;
+            this.dataGridView1.Size = new System.Drawing.Size(786, 426);
+            this.dataGridView1.TabIndex = 0;
+            // 
+            // panRequestsTool
+            // 
+            this.panRequestsTool.Controls.Add(this.cmbRequestAction);
+            this.panRequestsTool.Controls.Add(this.label1);
+            this.panRequestsTool.Controls.Add(this.btnSearchRequest);
+            this.panRequestsTool.Controls.Add(this.txtSearchRequest);
+            this.panRequestsTool.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panRequestsTool.Location = new System.Drawing.Point(0, 0);
+            this.panRequestsTool.Name = "panRequestsTool";
+            this.panRequestsTool.Size = new System.Drawing.Size(786, 55);
+            this.panRequestsTool.TabIndex = 0;
+            // 
+            // cmbRequestAction
+            // 
+            this.cmbRequestAction.FormattingEnabled = true;
+            this.cmbRequestAction.Location = new System.Drawing.Point(594, 13);
+            this.cmbRequestAction.Name = "cmbRequestAction";
+            this.cmbRequestAction.Size = new System.Drawing.Size(175, 26);
+            this.cmbRequestAction.TabIndex = 3;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(541, 17);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(47, 18);
+            this.label1.TabIndex = 2;
+            this.label1.Text = "Action";
+            // 
+            // btnSearchRequest
+            // 
+            this.btnSearchRequest.Location = new System.Drawing.Point(302, 13);
+            this.btnSearchRequest.Name = "btnSearchRequest";
+            this.btnSearchRequest.Size = new System.Drawing.Size(75, 26);
+            this.btnSearchRequest.TabIndex = 1;
+            this.btnSearchRequest.Text = "Search";
+            this.btnSearchRequest.UseVisualStyleBackColor = true;
+            // 
+            // txtSearchRequest
+            // 
+            this.txtSearchRequest.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.txtSearchRequest.ForeColor = System.Drawing.SystemColors.GrayText;
+            this.txtSearchRequest.Location = new System.Drawing.Point(16, 13);
+            this.txtSearchRequest.Name = "txtSearchRequest";
+            this.txtSearchRequest.Size = new System.Drawing.Size(279, 26);
+            this.txtSearchRequest.TabIndex = 0;
+            this.txtSearchRequest.Text = "Type in name of fund or requestor";
+            // 
+            // tabData
+            // 
+            this.tabData.Controls.Add(this.tbcData);
+            this.tabData.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.tabData.Location = new System.Drawing.Point(4, 34);
+            this.tabData.Name = "tabData";
+            this.tabData.Padding = new System.Windows.Forms.Padding(3);
+            this.tabData.Size = new System.Drawing.Size(792, 487);
+            this.tabData.TabIndex = 1;
+            this.tabData.Text = "Data";
+            this.tabData.UseVisualStyleBackColor = true;
+            // 
+            // tbcData
+            // 
+            this.tbcData.Alignment = System.Windows.Forms.TabAlignment.Bottom;
+            this.tbcData.Controls.Add(this.tabFunds);
+            this.tbcData.Controls.Add(this.tabPeople);
+            this.tbcData.Controls.Add(this.tabCompany);
+            this.tbcData.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tbcData.ItemSize = new System.Drawing.Size(70, 23);
+            this.tbcData.Location = new System.Drawing.Point(3, 3);
+            this.tbcData.Multiline = true;
+            this.tbcData.Name = "tbcData";
+            this.tbcData.SelectedIndex = 0;
+            this.tbcData.Size = new System.Drawing.Size(786, 481);
+            this.tbcData.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
+            this.tbcData.TabIndex = 0;
+            // 
+            // tabFunds
+            // 
+            this.tabFunds.Controls.Add(this.panFundList);
+            this.tabFunds.Controls.Add(this.panFundsTool);
+            this.tabFunds.Location = new System.Drawing.Point(4, 4);
+            this.tabFunds.Name = "tabFunds";
+            this.tabFunds.Padding = new System.Windows.Forms.Padding(3);
+            this.tabFunds.Size = new System.Drawing.Size(778, 450);
+            this.tabFunds.TabIndex = 0;
+            this.tabFunds.Text = "Funds";
+            this.tabFunds.UseVisualStyleBackColor = true;
+            // 
+            // panFundList
+            // 
+            this.panFundList.Controls.Add(this.grdFundList);
+            this.panFundList.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panFundList.Location = new System.Drawing.Point(3, 64);
+            this.panFundList.Name = "panFundList";
+            this.panFundList.Size = new System.Drawing.Size(772, 383);
+            this.panFundList.TabIndex = 1;
+            // 
+            // grdFundList
+            // 
+            this.grdFundList.AllowUserToAddRows = false;
+            this.grdFundList.AllowUserToDeleteRows = false;
+            this.grdFundList.AllowUserToOrderColumns = true;
+            this.grdFundList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdFundList.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.grdFundList.Location = new System.Drawing.Point(0, 0);
+            this.grdFundList.Name = "grdFundList";
+            this.grdFundList.ReadOnly = true;
+            this.grdFundList.RowTemplate.Height = 23;
+            this.grdFundList.Size = new System.Drawing.Size(772, 383);
+            this.grdFundList.TabIndex = 0;
+            this.grdFundList.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.grdFundList_CellContentClick);
+            // 
+            // panFundsTool
+            // 
+            this.panFundsTool.Controls.Add(this.cmbFundCategory);
+            this.panFundsTool.Controls.Add(this.label2);
+            this.panFundsTool.Controls.Add(this.btnSearchFund);
+            this.panFundsTool.Controls.Add(this.textBox1);
+            this.panFundsTool.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panFundsTool.Location = new System.Drawing.Point(3, 3);
+            this.panFundsTool.Name = "panFundsTool";
+            this.panFundsTool.Size = new System.Drawing.Size(772, 61);
+            this.panFundsTool.TabIndex = 0;
+            // 
+            // cmbFundCategory
+            // 
+            this.cmbFundCategory.FormattingEnabled = true;
+            this.cmbFundCategory.Location = new System.Drawing.Point(562, 18);
+            this.cmbFundCategory.Name = "cmbFundCategory";
+            this.cmbFundCategory.Size = new System.Drawing.Size(196, 26);
+            this.cmbFundCategory.TabIndex = 3;
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(493, 22);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(63, 18);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "Category";
+            // 
+            // btnSearchFund
+            // 
+            this.btnSearchFund.Location = new System.Drawing.Point(281, 18);
+            this.btnSearchFund.Name = "btnSearchFund";
+            this.btnSearchFund.Size = new System.Drawing.Size(75, 26);
+            this.btnSearchFund.TabIndex = 1;
+            this.btnSearchFund.Text = "Search";
+            this.btnSearchFund.UseVisualStyleBackColor = true;
+            // 
+            // textBox1
+            // 
+            this.textBox1.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.textBox1.ForeColor = System.Drawing.SystemColors.GrayText;
+            this.textBox1.Location = new System.Drawing.Point(20, 18);
+            this.textBox1.Name = "textBox1";
+            this.textBox1.Size = new System.Drawing.Size(255, 26);
+            this.textBox1.TabIndex = 0;
+            this.textBox1.Text = "Type in fund name";
+            // 
+            // tabPeople
+            // 
+            this.tabPeople.Location = new System.Drawing.Point(4, 4);
+            this.tabPeople.Name = "tabPeople";
+            this.tabPeople.Padding = new System.Windows.Forms.Padding(3);
+            this.tabPeople.Size = new System.Drawing.Size(778, 450);
+            this.tabPeople.TabIndex = 1;
+            this.tabPeople.Text = "People";
+            this.tabPeople.UseVisualStyleBackColor = true;
+            // 
+            // tabCompany
+            // 
+            this.tabCompany.Location = new System.Drawing.Point(4, 4);
+            this.tabCompany.Name = "tabCompany";
+            this.tabCompany.Size = new System.Drawing.Size(778, 450);
+            this.tabCompany.TabIndex = 2;
+            this.tabCompany.Text = "Company";
+            this.tabCompany.UseVisualStyleBackColor = true;
+            // 
+            // tabSettings
+            // 
+            this.tabSettings.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.tabSettings.Location = new System.Drawing.Point(4, 34);
+            this.tabSettings.Name = "tabSettings";
+            this.tabSettings.Size = new System.Drawing.Size(792, 487);
+            this.tabSettings.TabIndex = 2;
+            this.tabSettings.Text = "Settings";
+            this.tabSettings.UseVisualStyleBackColor = true;
+            // 
+            // frmMain
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 14F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(800, 525);
+            this.Controls.Add(this.tbcMain);
+            this.Font = new System.Drawing.Font("Calibri", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
+            this.Name = "frmMain";
+            this.Text = "Fundit DDQ";
+            this.tbcMain.ResumeLayout(false);
+            this.tabRequests.ResumeLayout(false);
+            this.panRequests.ResumeLayout(false);
+            this.panRequestList.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
+            this.panRequestsTool.ResumeLayout(false);
+            this.panRequestsTool.PerformLayout();
+            this.tabData.ResumeLayout(false);
+            this.tbcData.ResumeLayout(false);
+            this.tabFunds.ResumeLayout(false);
+            this.panFundList.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.grdFundList)).EndInit();
+            this.panFundsTool.ResumeLayout(false);
+            this.panFundsTool.PerformLayout();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TabControl tbcMain;
+        private System.Windows.Forms.TabPage tabRequests;
+        private System.Windows.Forms.TabPage tabData;
+        private System.Windows.Forms.TabPage tabSettings;
+        private System.Windows.Forms.Panel panRequests;
+        private System.Windows.Forms.Panel panRequestList;
+        private System.Windows.Forms.Panel panRequestsTool;
+        private System.Windows.Forms.TextBox txtSearchRequest;
+        private System.Windows.Forms.DataGridView dataGridView1;
+        private System.Windows.Forms.ComboBox cmbRequestAction;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.Button btnSearchRequest;
+        private System.Windows.Forms.TabControl tbcData;
+        private System.Windows.Forms.TabPage tabFunds;
+        private System.Windows.Forms.TabPage tabPeople;
+        private System.Windows.Forms.Panel panFundList;
+        private System.Windows.Forms.Panel panFundsTool;
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.TabPage tabCompany;
+        private System.Windows.Forms.DataGridView grdFundList;
+        private System.Windows.Forms.ComboBox cmbFundCategory;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.Button btnSearchFund;
+    }
+}
+

+ 75 - 0
DDQ.cs

@@ -0,0 +1,75 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ddq
+{
+    public partial class frmMain : Form
+    {
+
+        // 先hard-code公司ID,以后要按照登录用户来判断它的公司归属
+        private string companyId = "CO000201PR";
+
+        private DataTable fundDataTable;
+
+        public frmMain()
+        {
+            InitializeComponent();
+
+            InitializeData();
+        }
+
+        private void InitializeData()
+        {
+
+        }
+
+        private void tbcMain_SelectedIndexChanged(object sender, EventArgs e)
+        {
+            if (tbcMain.SelectedIndex == 0) { }
+            else if (tbcMain.SelectedIndex == 1) {
+
+                LoadFundList(companyId);
+            }
+            else { };
+        }
+
+
+        private void LoadFundList(string companyId)
+        {
+            if (fundDataTable == null)
+            {
+                fundDataTable = DataAccess.Get_fund_list_by_company(companyId, 1, 1000);
+
+                this.grdFundList.DataSource = fundDataTable;
+            }
+        }
+
+        private void grdFundList_CellContentClick(object sender, DataGridViewCellEventArgs e)
+        {
+            int rowIndex = e.RowIndex;
+            int columnIndex = e.ColumnIndex;
+
+            if (columnIndex < 0 || rowIndex < 0) return;
+
+            DataRow row = fundDataTable.Rows[rowIndex];
+
+            // 弹出基金页面
+            string entityId = row["fund_id"].ToString();
+
+            if (entityId.Length == 10 && Regex.Match(entityId, "^[HM]F").Success)
+            {
+                FundQ fundQ = new FundQ(entityId);
+                fundQ.Show();
+            }
+
+        }
+    }
+}

+ 120 - 0
DDQ.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>

+ 193 - 0
DataAccess.cs

@@ -0,0 +1,193 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Text.Json;
+
+using MySql.Data.MySqlClient;
+
+namespace ddq
+{
+    public class DataAccess
+    {
+        private static String connectionString = ConfigurationManager.ConnectionStrings["MySQL"].ConnectionString;
+
+
+        /// <summary>
+        /// 取基金基本信息
+        /// </summary>
+        /// <param name="fundId"></param>
+        /// <returns></returns>
+        public static DataTable Get_fund_info(string fundIds, int? userId)
+        {
+            MySqlConnection connection = new MySqlConnection(connectionString);
+            MySqlDataAdapter ad = new MySqlDataAdapter("sp_tamp_get_fund_info", connection);
+
+            MySqlParameter i_fundIds = new MySqlParameter("i_fund_ids", fundIds);
+            MySqlParameter i_userId = new MySqlParameter("i_userid", userId);
+
+            ad.SelectCommand.Parameters.Add(i_fundIds);
+            ad.SelectCommand.Parameters.Add(i_userId);
+            ad.SelectCommand.CommandType = CommandType.StoredProcedure;
+
+            DataTable dt = new DataTable();
+            ad.Fill(dt);
+
+            connection.Close();
+
+            return dt;
+
+        }
+
+
+        /// <summary>
+        /// 根据公司搜索基金
+        /// </summary>
+        /// <param name="companyId"></param>
+        /// <param name="pageNum"></param>
+        /// <param name="pageSize"</param>
+        /// <returns></returns>
+        public static DataTable Get_fund_list_by_company(string companyId, int pageNum, int pageSize)
+        {
+            MySqlConnection connection = new MySqlConnection(connectionString);
+            MySqlDataAdapter ad = new MySqlDataAdapter("sp_tamp_get_fund_list_of_companay", connection);
+
+            MySqlParameter i_company_id = new MySqlParameter("i_company_id", companyId);
+            MySqlParameter i_page_num = new MySqlParameter("i_page_num", pageNum);
+            MySqlParameter i_page_size = new MySqlParameter("i_page_size", pageSize);
+
+            ad.SelectCommand.Parameters.Add(i_company_id);
+            ad.SelectCommand.Parameters.Add(i_page_num);
+            ad.SelectCommand.Parameters.Add(i_page_size);
+            ad.SelectCommand.CommandType = CommandType.StoredProcedure;
+
+            DataTable dt = new DataTable();
+            ad.Fill(dt);
+
+            connection.Close();
+
+            return dt;
+
+        }
+
+        /// <summary>
+        /// 从 mfdb 里取NAV
+        /// </summary>
+        /// <param name="fundId"></param>
+        /// <param name="startDate"></param>
+        /// <param name="endDate"></param>
+        /// <returns></returns>
+        public static DataTable Get_Nav(string fundId, DateTime? startDate, DateTime? endDate)
+        {
+            MySqlConnection connection = new MySqlConnection(connectionString);
+            MySqlDataAdapter ad = new MySqlDataAdapter("sp_get_nav", connection);
+
+            MySqlParameter i_fund_id = new MySqlParameter("i_fund_id", fundId);
+            MySqlParameter i_start_date = new MySqlParameter("i_start_date", startDate);
+            MySqlParameter i_end_date = new MySqlParameter("i_end_date", endDate);
+
+            ad.SelectCommand.Parameters.Add(i_fund_id);
+            ad.SelectCommand.Parameters.Add(i_start_date);
+            ad.SelectCommand.Parameters.Add(i_end_date);
+
+            ad.SelectCommand.CommandType = CommandType.StoredProcedure;
+
+            DataTable dt = new DataTable();
+            ad.Fill(dt);
+
+            connection.Close();
+
+            return dt;
+        }
+
+        /// <summary>
+        /// 取基金指数,benchmark_type: 0-主基准、1-分类平均
+        /// </summary>
+        /// <param name="fundId"></param>
+        /// <returns></returns>
+        public static DataTable Get_dm_fund_benchmark(string fundId)
+        {
+
+            MySqlConnection connection = new MySqlConnection(connectionString);
+            MySqlDataAdapter ad = new MySqlDataAdapter("sp_get_dm_fund_benchmark", connection);
+
+            MySqlParameter i_fund_id = new MySqlParameter("i_fund_id", fundId);
+
+            ad.SelectCommand.Parameters.Add(i_fund_id);
+
+            ad.SelectCommand.CommandType = CommandType.StoredProcedure;
+
+            DataTable dt = new DataTable();
+            ad.Fill(dt);
+
+            connection.Close();
+
+            return dt;
+        }
+
+
+        public static DataTable Get_dd_fund_info(string fundId, DateTime? effectiveDate, int isLatest)
+        {
+            MySqlConnection connection = new MySqlConnection(connectionString);
+            MySqlDataAdapter ad = new MySqlDataAdapter("sp_dd_get_fund_info", connection);
+
+            MySqlParameter i_fund_id = new MySqlParameter("i_fund_id", fundId);
+            MySqlParameter i_effective_date = new MySqlParameter("i_effective_date", effectiveDate);
+            MySqlParameter i_is_latest = new MySqlParameter("i_is_latest", isLatest);
+
+            ad.SelectCommand.Parameters.Add(i_fund_id);
+            ad.SelectCommand.Parameters.Add(i_effective_date);
+            ad.SelectCommand.Parameters.Add(i_is_latest);
+            ad.SelectCommand.CommandType = CommandType.StoredProcedure;
+
+            DataTable dt = new DataTable();
+            ad.Fill(dt);
+
+            connection.Close();
+
+            return dt;
+
+        }
+
+
+        public static int Set_dd_fund_info(string fundId, DateTime effectiveDate, string info, int status, int isValid, int userId)
+        {
+            int ret = -1;
+
+            using (MySqlConnection connection = new MySqlConnection(connectionString))
+            {
+
+                connection.Open();
+
+                MySqlCommand cmd = new MySqlCommand("sp_dd_set_fund_info", connection);
+
+                MySqlParameter i_fund_id = new MySqlParameter("i_fund_id", fundId);
+                MySqlParameter i_effective_date = new MySqlParameter("i_effective_date", effectiveDate);
+                MySqlParameter i_info = new MySqlParameter("i_info", info);
+                MySqlParameter i_status = new MySqlParameter("i_status", status);
+                MySqlParameter i_isvalid = new MySqlParameter("i_isvalid", isValid);
+                MySqlParameter i_userid = new MySqlParameter("i_userid", userId);
+
+                cmd.Parameters.Add(i_fund_id);
+                cmd.Parameters.Add(i_effective_date);
+                cmd.Parameters.Add(i_info);
+                cmd.Parameters.Add(i_status);
+                cmd.Parameters.Add(i_isvalid);
+                cmd.Parameters.Add(i_userid);
+
+                cmd.CommandType = CommandType.StoredProcedure;
+
+                cmd.Connection = connection;
+                cmd.ExecuteNonQuery();
+
+                ret = 1;
+            }
+
+            return ret;
+        }
+
+    }
+}

+ 561 - 0
FundQ.Designer.cs

@@ -0,0 +1,561 @@
+namespace ddq
+{
+    partial class FundQ
+    {
+        /// <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 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()
+        {
+            this.panStaticData = new System.Windows.Forms.Panel();
+            this.lblDomicile = new System.Windows.Forms.Label();
+            this.lblInceptionDate = new System.Windows.Forms.Label();
+            this.lblCategory = new System.Windows.Forms.Label();
+            this.lblMainCode = new System.Windows.Forms.Label();
+            this.lblFundName = new System.Windows.Forms.Label();
+            this.tbcFund = new System.Windows.Forms.TabControl();
+            this.tabGeneralInfo = new System.Windows.Forms.TabPage();
+            this.grdTER = new System.Windows.Forms.DataGridView();
+            this.grbFees = new System.Windows.Forms.GroupBox();
+            this.txtSubscriptionFee = new System.Windows.Forms.TextBox();
+            this.label8 = new System.Windows.Forms.Label();
+            this.txtRedemptionFee = new System.Windows.Forms.TextBox();
+            this.label7 = new System.Windows.Forms.Label();
+            this.txtManagementFee = new System.Windows.Forms.TextBox();
+            this.label6 = new System.Windows.Forms.Label();
+            this.label5 = new System.Windows.Forms.Label();
+            this.grdPortfolioManager = new System.Windows.Forms.DataGridView();
+            this.label4 = new System.Windows.Forms.Label();
+            this.txtInvestmentPhilosophy = new System.Windows.Forms.TextBox();
+            this.txtBenchmark = new System.Windows.Forms.TextBox();
+            this.label3 = new System.Windows.Forms.Label();
+            this.label2 = new System.Windows.Forms.Label();
+            this.txtInvestmentObjective = new System.Windows.Forms.TextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.tabProcess = new System.Windows.Forms.TabPage();
+            this.tabRisk = new System.Windows.Forms.TabPage();
+            this.tabOwnership = new System.Windows.Forms.TabPage();
+            this.tabPerformance = new System.Windows.Forms.TabPage();
+            this.txtAdministrationFee = new System.Windows.Forms.TextBox();
+            this.label9 = new System.Windows.Forms.Label();
+            this.txtTrusteeFee = new System.Windows.Forms.TextBox();
+            this.label11 = new System.Windows.Forms.Label();
+            this.txtPerformanceFee = new System.Windows.Forms.TextBox();
+            this.label12 = new System.Windows.Forms.Label();
+            this.txtSwitchingFee = new System.Windows.Forms.TextBox();
+            this.label13 = new System.Windows.Forms.Label();
+            this.label14 = new System.Windows.Forms.Label();
+            this.txtPolicyOfClosingFund = new System.Windows.Forms.TextBox();
+            this.panel1 = new System.Windows.Forms.Panel();
+            this.btnSaveGeneralInfo = new System.Windows.Forms.Button();
+            this.panStaticData.SuspendLayout();
+            this.tbcFund.SuspendLayout();
+            this.tabGeneralInfo.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdTER)).BeginInit();
+            this.grbFees.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdPortfolioManager)).BeginInit();
+            this.panel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // panStaticData
+            // 
+            this.panStaticData.Controls.Add(this.lblDomicile);
+            this.panStaticData.Controls.Add(this.lblInceptionDate);
+            this.panStaticData.Controls.Add(this.lblCategory);
+            this.panStaticData.Controls.Add(this.lblMainCode);
+            this.panStaticData.Controls.Add(this.lblFundName);
+            this.panStaticData.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panStaticData.Location = new System.Drawing.Point(0, 0);
+            this.panStaticData.Name = "panStaticData";
+            this.panStaticData.Size = new System.Drawing.Size(1067, 76);
+            this.panStaticData.TabIndex = 0;
+            // 
+            // lblDomicile
+            // 
+            this.lblDomicile.AutoSize = true;
+            this.lblDomicile.Font = new System.Drawing.Font("Calibri", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblDomicile.Location = new System.Drawing.Point(382, 49);
+            this.lblDomicile.Name = "lblDomicile";
+            this.lblDomicile.Size = new System.Drawing.Size(59, 14);
+            this.lblDomicile.TabIndex = 4;
+            this.lblDomicile.Text = "Domicile:";
+            // 
+            // lblInceptionDate
+            // 
+            this.lblInceptionDate.AutoSize = true;
+            this.lblInceptionDate.Font = new System.Drawing.Font("Calibri", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblInceptionDate.Location = new System.Drawing.Point(183, 49);
+            this.lblInceptionDate.Name = "lblInceptionDate";
+            this.lblInceptionDate.Size = new System.Drawing.Size(121, 14);
+            this.lblInceptionDate.TabIndex = 3;
+            this.lblInceptionDate.Text = "Launched: XXXX-XX-XX";
+            // 
+            // lblCategory
+            // 
+            this.lblCategory.AutoSize = true;
+            this.lblCategory.Font = new System.Drawing.Font("Calibri", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblCategory.Location = new System.Drawing.Point(546, 49);
+            this.lblCategory.Name = "lblCategory";
+            this.lblCategory.Size = new System.Drawing.Size(56, 14);
+            this.lblCategory.TabIndex = 2;
+            this.lblCategory.Text = "Category:";
+            // 
+            // lblMainCode
+            // 
+            this.lblMainCode.AutoSize = true;
+            this.lblMainCode.Font = new System.Drawing.Font("Calibri", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblMainCode.Location = new System.Drawing.Point(22, 49);
+            this.lblMainCode.Name = "lblMainCode";
+            this.lblMainCode.Size = new System.Drawing.Size(37, 14);
+            this.lblMainCode.TabIndex = 1;
+            this.lblMainCode.Text = "Code:";
+            // 
+            // lblFundName
+            // 
+            this.lblFundName.AutoSize = true;
+            this.lblFundName.Location = new System.Drawing.Point(22, 22);
+            this.lblFundName.Name = "lblFundName";
+            this.lblFundName.Size = new System.Drawing.Size(79, 18);
+            this.lblFundName.TabIndex = 0;
+            this.lblFundName.Text = "Fund Name";
+            // 
+            // tbcFund
+            // 
+            this.tbcFund.Controls.Add(this.tabGeneralInfo);
+            this.tbcFund.Controls.Add(this.tabProcess);
+            this.tbcFund.Controls.Add(this.tabRisk);
+            this.tbcFund.Controls.Add(this.tabOwnership);
+            this.tbcFund.Controls.Add(this.tabPerformance);
+            this.tbcFund.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.tbcFund.Location = new System.Drawing.Point(0, 76);
+            this.tbcFund.Name = "tbcFund";
+            this.tbcFund.SelectedIndex = 0;
+            this.tbcFund.Size = new System.Drawing.Size(1067, 599);
+            this.tbcFund.TabIndex = 1;
+            // 
+            // tabGeneralInfo
+            // 
+            this.tabGeneralInfo.AutoScroll = true;
+            this.tabGeneralInfo.Controls.Add(this.panel1);
+            this.tabGeneralInfo.Controls.Add(this.txtPolicyOfClosingFund);
+            this.tabGeneralInfo.Controls.Add(this.label14);
+            this.tabGeneralInfo.Controls.Add(this.grdTER);
+            this.tabGeneralInfo.Controls.Add(this.grbFees);
+            this.tabGeneralInfo.Controls.Add(this.label5);
+            this.tabGeneralInfo.Controls.Add(this.grdPortfolioManager);
+            this.tabGeneralInfo.Controls.Add(this.label4);
+            this.tabGeneralInfo.Controls.Add(this.txtInvestmentPhilosophy);
+            this.tabGeneralInfo.Controls.Add(this.txtBenchmark);
+            this.tabGeneralInfo.Controls.Add(this.label3);
+            this.tabGeneralInfo.Controls.Add(this.label2);
+            this.tabGeneralInfo.Controls.Add(this.txtInvestmentObjective);
+            this.tabGeneralInfo.Controls.Add(this.label1);
+            this.tabGeneralInfo.Location = new System.Drawing.Point(4, 27);
+            this.tabGeneralInfo.Name = "tabGeneralInfo";
+            this.tabGeneralInfo.Padding = new System.Windows.Forms.Padding(3);
+            this.tabGeneralInfo.Size = new System.Drawing.Size(1059, 568);
+            this.tabGeneralInfo.TabIndex = 0;
+            this.tabGeneralInfo.Text = "General Info";
+            this.tabGeneralInfo.UseVisualStyleBackColor = true;
+            // 
+            // grdTER
+            // 
+            this.grdTER.AllowUserToAddRows = false;
+            this.grdTER.AllowUserToDeleteRows = false;
+            this.grdTER.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdTER.Location = new System.Drawing.Point(24, 532);
+            this.grdTER.Name = "grdTER";
+            this.grdTER.RowTemplate.Height = 23;
+            this.grdTER.Size = new System.Drawing.Size(340, 210);
+            this.grdTER.TabIndex = 10;
+            // 
+            // grbFees
+            // 
+            this.grbFees.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.grbFees.Controls.Add(this.txtTrusteeFee);
+            this.grbFees.Controls.Add(this.label11);
+            this.grbFees.Controls.Add(this.txtPerformanceFee);
+            this.grbFees.Controls.Add(this.label12);
+            this.grbFees.Controls.Add(this.txtSwitchingFee);
+            this.grbFees.Controls.Add(this.label13);
+            this.grbFees.Controls.Add(this.txtAdministrationFee);
+            this.grbFees.Controls.Add(this.label9);
+            this.grbFees.Controls.Add(this.txtSubscriptionFee);
+            this.grbFees.Controls.Add(this.label8);
+            this.grbFees.Controls.Add(this.txtRedemptionFee);
+            this.grbFees.Controls.Add(this.label7);
+            this.grbFees.Controls.Add(this.txtManagementFee);
+            this.grbFees.Controls.Add(this.label6);
+            this.grbFees.Location = new System.Drawing.Point(370, 524);
+            this.grbFees.Name = "grbFees";
+            this.grbFees.Size = new System.Drawing.Size(661, 218);
+            this.grbFees.TabIndex = 9;
+            this.grbFees.TabStop = false;
+            this.grbFees.Text = "Current Fees";
+            // 
+            // txtSubscriptionFee
+            // 
+            this.txtSubscriptionFee.Location = new System.Drawing.Point(469, 22);
+            this.txtSubscriptionFee.Name = "txtSubscriptionFee";
+            this.txtSubscriptionFee.Size = new System.Drawing.Size(100, 26);
+            this.txtSubscriptionFee.TabIndex = 3;
+            // 
+            // label8
+            // 
+            this.label8.AutoSize = true;
+            this.label8.Location = new System.Drawing.Point(342, 25);
+            this.label8.Name = "label8";
+            this.label8.Size = new System.Drawing.Size(110, 18);
+            this.label8.TabIndex = 2;
+            this.label8.Text = "Subscription Fee";
+            // 
+            // txtRedemptionFee
+            // 
+            this.txtRedemptionFee.Location = new System.Drawing.Point(150, 58);
+            this.txtRedemptionFee.Name = "txtRedemptionFee";
+            this.txtRedemptionFee.Size = new System.Drawing.Size(100, 26);
+            this.txtRedemptionFee.TabIndex = 5;
+            // 
+            // label7
+            // 
+            this.label7.AutoSize = true;
+            this.label7.Location = new System.Drawing.Point(23, 61);
+            this.label7.Name = "label7";
+            this.label7.Size = new System.Drawing.Size(110, 18);
+            this.label7.TabIndex = 4;
+            this.label7.Text = "Redemption Fee";
+            // 
+            // txtManagementFee
+            // 
+            this.txtManagementFee.Location = new System.Drawing.Point(150, 22);
+            this.txtManagementFee.Name = "txtManagementFee";
+            this.txtManagementFee.Size = new System.Drawing.Size(100, 26);
+            this.txtManagementFee.TabIndex = 1;
+            // 
+            // label6
+            // 
+            this.label6.AutoSize = true;
+            this.label6.Location = new System.Drawing.Point(23, 25);
+            this.label6.Name = "label6";
+            this.label6.Size = new System.Drawing.Size(116, 18);
+            this.label6.TabIndex = 0;
+            this.label6.Text = "Management Fee";
+            // 
+            // label5
+            // 
+            this.label5.AutoSize = true;
+            this.label5.Location = new System.Drawing.Point(21, 510);
+            this.label5.Name = "label5";
+            this.label5.Size = new System.Drawing.Size(86, 18);
+            this.label5.TabIndex = 8;
+            this.label5.Text = "Fee & Charges";
+            // 
+            // grdPortfolioManager
+            // 
+            this.grdPortfolioManager.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.grdPortfolioManager.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            this.grdPortfolioManager.Location = new System.Drawing.Point(24, 398);
+            this.grdPortfolioManager.Name = "grdPortfolioManager";
+            this.grdPortfolioManager.RowTemplate.Height = 23;
+            this.grdPortfolioManager.Size = new System.Drawing.Size(1007, 85);
+            this.grdPortfolioManager.TabIndex = 7;
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Location = new System.Drawing.Point(21, 377);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(119, 18);
+            this.label4.TabIndex = 6;
+            this.label4.Text = "Portfolio Manager";
+            // 
+            // txtInvestmentPhilosophy
+            // 
+            this.txtInvestmentPhilosophy.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtInvestmentPhilosophy.Location = new System.Drawing.Point(24, 255);
+            this.txtInvestmentPhilosophy.Multiline = true;
+            this.txtInvestmentPhilosophy.Name = "txtInvestmentPhilosophy";
+            this.txtInvestmentPhilosophy.Size = new System.Drawing.Size(1007, 95);
+            this.txtInvestmentPhilosophy.TabIndex = 5;
+            // 
+            // txtBenchmark
+            // 
+            this.txtBenchmark.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtBenchmark.Location = new System.Drawing.Point(24, 179);
+            this.txtBenchmark.Name = "txtBenchmark";
+            this.txtBenchmark.Size = new System.Drawing.Size(1007, 26);
+            this.txtBenchmark.TabIndex = 4;
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Location = new System.Drawing.Point(21, 158);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(77, 18);
+            this.label3.TabIndex = 3;
+            this.label3.Text = "Benchmark";
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Location = new System.Drawing.Point(21, 234);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(151, 18);
+            this.label2.TabIndex = 2;
+            this.label2.Text = "Investment Philosophy";
+            // 
+            // txtInvestmentObjective
+            // 
+            this.txtInvestmentObjective.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtInvestmentObjective.Location = new System.Drawing.Point(24, 39);
+            this.txtInvestmentObjective.Multiline = true;
+            this.txtInvestmentObjective.Name = "txtInvestmentObjective";
+            this.txtInvestmentObjective.Size = new System.Drawing.Size(1007, 95);
+            this.txtInvestmentObjective.TabIndex = 1;
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Location = new System.Drawing.Point(21, 18);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(141, 18);
+            this.label1.TabIndex = 0;
+            this.label1.Text = "Investment Objective";
+            // 
+            // tabProcess
+            // 
+            this.tabProcess.Location = new System.Drawing.Point(4, 27);
+            this.tabProcess.Name = "tabProcess";
+            this.tabProcess.Padding = new System.Windows.Forms.Padding(3);
+            this.tabProcess.Size = new System.Drawing.Size(1059, 568);
+            this.tabProcess.TabIndex = 1;
+            this.tabProcess.Text = "Process";
+            this.tabProcess.UseVisualStyleBackColor = true;
+            // 
+            // tabRisk
+            // 
+            this.tabRisk.Location = new System.Drawing.Point(4, 27);
+            this.tabRisk.Name = "tabRisk";
+            this.tabRisk.Size = new System.Drawing.Size(1059, 568);
+            this.tabRisk.TabIndex = 2;
+            this.tabRisk.Text = "Risk & Compliance";
+            this.tabRisk.UseVisualStyleBackColor = true;
+            // 
+            // tabOwnership
+            // 
+            this.tabOwnership.Location = new System.Drawing.Point(4, 27);
+            this.tabOwnership.Name = "tabOwnership";
+            this.tabOwnership.Size = new System.Drawing.Size(1059, 568);
+            this.tabOwnership.TabIndex = 3;
+            this.tabOwnership.Text = "Ownership";
+            this.tabOwnership.UseVisualStyleBackColor = true;
+            // 
+            // tabPerformance
+            // 
+            this.tabPerformance.Location = new System.Drawing.Point(4, 27);
+            this.tabPerformance.Name = "tabPerformance";
+            this.tabPerformance.Size = new System.Drawing.Size(1059, 568);
+            this.tabPerformance.TabIndex = 4;
+            this.tabPerformance.Text = "Performance";
+            this.tabPerformance.UseVisualStyleBackColor = true;
+            // 
+            // txtAdministrationFee
+            // 
+            this.txtAdministrationFee.Location = new System.Drawing.Point(469, 58);
+            this.txtAdministrationFee.Name = "txtAdministrationFee";
+            this.txtAdministrationFee.Size = new System.Drawing.Size(100, 26);
+            this.txtAdministrationFee.TabIndex = 7;
+            // 
+            // label9
+            // 
+            this.label9.AutoSize = true;
+            this.label9.Location = new System.Drawing.Point(342, 61);
+            this.label9.Name = "label9";
+            this.label9.Size = new System.Drawing.Size(126, 18);
+            this.label9.TabIndex = 6;
+            this.label9.Text = "Administration Fee";
+            // 
+            // txtTrusteeFee
+            // 
+            this.txtTrusteeFee.Location = new System.Drawing.Point(469, 90);
+            this.txtTrusteeFee.Name = "txtTrusteeFee";
+            this.txtTrusteeFee.Size = new System.Drawing.Size(100, 26);
+            this.txtTrusteeFee.TabIndex = 11;
+            // 
+            // label11
+            // 
+            this.label11.AutoSize = true;
+            this.label11.Location = new System.Drawing.Point(342, 93);
+            this.label11.Name = "label11";
+            this.label11.Size = new System.Drawing.Size(80, 18);
+            this.label11.TabIndex = 10;
+            this.label11.Text = "Trustee Fee";
+            // 
+            // txtPerformanceFee
+            // 
+            this.txtPerformanceFee.Location = new System.Drawing.Point(150, 126);
+            this.txtPerformanceFee.Multiline = true;
+            this.txtPerformanceFee.Name = "txtPerformanceFee";
+            this.txtPerformanceFee.Size = new System.Drawing.Size(419, 77);
+            this.txtPerformanceFee.TabIndex = 13;
+            // 
+            // label12
+            // 
+            this.label12.AutoSize = true;
+            this.label12.Location = new System.Drawing.Point(23, 129);
+            this.label12.Name = "label12";
+            this.label12.Size = new System.Drawing.Size(114, 18);
+            this.label12.TabIndex = 12;
+            this.label12.Text = "Performance Fee";
+            // 
+            // txtSwitchingFee
+            // 
+            this.txtSwitchingFee.Location = new System.Drawing.Point(150, 90);
+            this.txtSwitchingFee.Name = "txtSwitchingFee";
+            this.txtSwitchingFee.Size = new System.Drawing.Size(100, 26);
+            this.txtSwitchingFee.TabIndex = 9;
+            // 
+            // label13
+            // 
+            this.label13.AutoSize = true;
+            this.label13.Location = new System.Drawing.Point(23, 93);
+            this.label13.Name = "label13";
+            this.label13.Size = new System.Drawing.Size(94, 18);
+            this.label13.TabIndex = 8;
+            this.label13.Text = "Switching Fee";
+            // 
+            // label14
+            // 
+            this.label14.AutoSize = true;
+            this.label14.Location = new System.Drawing.Point(21, 757);
+            this.label14.Name = "label14";
+            this.label14.Size = new System.Drawing.Size(143, 18);
+            this.label14.TabIndex = 11;
+            this.label14.Text = "Policy of Closing Fund";
+            // 
+            // txtPolicyOfClosingFund
+            // 
+            this.txtPolicyOfClosingFund.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.txtPolicyOfClosingFund.Location = new System.Drawing.Point(24, 779);
+            this.txtPolicyOfClosingFund.Multiline = true;
+            this.txtPolicyOfClosingFund.Name = "txtPolicyOfClosingFund";
+            this.txtPolicyOfClosingFund.Size = new System.Drawing.Size(1007, 167);
+            this.txtPolicyOfClosingFund.TabIndex = 12;
+            // 
+            // panel1
+            // 
+            this.panel1.Controls.Add(this.btnSaveGeneralInfo);
+            this.panel1.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panel1.Location = new System.Drawing.Point(3, 946);
+            this.panel1.Name = "panel1";
+            this.panel1.Size = new System.Drawing.Size(1036, 50);
+            this.panel1.TabIndex = 13;
+            // 
+            // btnSaveGeneralInfo
+            // 
+            this.btnSaveGeneralInfo.Location = new System.Drawing.Point(936, 15);
+            this.btnSaveGeneralInfo.Name = "btnSaveGeneralInfo";
+            this.btnSaveGeneralInfo.Size = new System.Drawing.Size(75, 23);
+            this.btnSaveGeneralInfo.TabIndex = 0;
+            this.btnSaveGeneralInfo.Text = "Save";
+            this.btnSaveGeneralInfo.UseVisualStyleBackColor = true;
+            this.btnSaveGeneralInfo.Click += new System.EventHandler(this.btnSaveGeneralInfo_Click);
+            // 
+            // FundQ
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 18F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1067, 675);
+            this.Controls.Add(this.tbcFund);
+            this.Controls.Add(this.panStaticData);
+            this.Font = new System.Drawing.Font("Calibri", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.Margin = new System.Windows.Forms.Padding(4);
+            this.Name = "FundQ";
+            this.Text = "Fund Data";
+            this.Load += new System.EventHandler(this.FundQ_Load);
+            this.panStaticData.ResumeLayout(false);
+            this.panStaticData.PerformLayout();
+            this.tbcFund.ResumeLayout(false);
+            this.tabGeneralInfo.ResumeLayout(false);
+            this.tabGeneralInfo.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdTER)).EndInit();
+            this.grbFees.ResumeLayout(false);
+            this.grbFees.PerformLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.grdPortfolioManager)).EndInit();
+            this.panel1.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Panel panStaticData;
+        private System.Windows.Forms.Label lblMainCode;
+        private System.Windows.Forms.Label lblFundName;
+        private System.Windows.Forms.TabControl tbcFund;
+        private System.Windows.Forms.TabPage tabGeneralInfo;
+        private System.Windows.Forms.TabPage tabProcess;
+        private System.Windows.Forms.TabPage tabRisk;
+        private System.Windows.Forms.TabPage tabOwnership;
+        private System.Windows.Forms.TabPage tabPerformance;
+        private System.Windows.Forms.Label lblDomicile;
+        private System.Windows.Forms.Label lblInceptionDate;
+        private System.Windows.Forms.Label lblCategory;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.TextBox txtInvestmentObjective;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.DataGridView grdPortfolioManager;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.TextBox txtInvestmentPhilosophy;
+        private System.Windows.Forms.TextBox txtBenchmark;
+        private System.Windows.Forms.GroupBox grbFees;
+        private System.Windows.Forms.Label label5;
+        private System.Windows.Forms.DataGridView grdTER;
+        private System.Windows.Forms.TextBox txtManagementFee;
+        private System.Windows.Forms.Label label6;
+        private System.Windows.Forms.TextBox txtRedemptionFee;
+        private System.Windows.Forms.Label label7;
+        private System.Windows.Forms.TextBox txtSubscriptionFee;
+        private System.Windows.Forms.Label label8;
+        private System.Windows.Forms.TextBox txtAdministrationFee;
+        private System.Windows.Forms.Label label9;
+        private System.Windows.Forms.Label label14;
+        private System.Windows.Forms.TextBox txtTrusteeFee;
+        private System.Windows.Forms.Label label11;
+        private System.Windows.Forms.TextBox txtPerformanceFee;
+        private System.Windows.Forms.Label label12;
+        private System.Windows.Forms.TextBox txtSwitchingFee;
+        private System.Windows.Forms.Label label13;
+        private System.Windows.Forms.TextBox txtPolicyOfClosingFund;
+        private System.Windows.Forms.Panel panel1;
+        private System.Windows.Forms.Button btnSaveGeneralInfo;
+    }
+}

+ 106 - 0
FundQ.cs

@@ -0,0 +1,106 @@
+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;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+
+namespace ddq
+{
+    public partial class FundQ : Form
+    {
+
+        private string fundId;
+        private int userId = 123;
+        private DataTable fundInfoTable;
+
+
+        public FundQ(string fundId)
+        {
+            InitializeComponent();
+
+            this.fundId = fundId;
+
+            InitializeData();
+            
+        }
+
+
+        private void InitializeData()
+        {
+            DataTable dt = DataAccess.Get_fund_info(fundId, null);
+
+            if (dt == null || dt.Rows.Count <= 0) return;
+
+            this.lblFundName.Text = dt.Rows[0].Field<string>("fund_short_name");
+            this.lblMainCode.Text = "Code: " + dt.Rows[0].Field<string>("register_number");
+            this.lblCategory.Text = "Category: " + dt.Rows[0].Field<string>("strategy");
+            this.lblInceptionDate.Text = "Launched: " + dt.Rows[0].Field<DateTime?>("inception_date")?.ToString("yyyy-MM-dd");
+            this.lblDomicile.Text = "Domicile: ";
+
+            fundInfoTable = DataAccess.Get_dd_fund_info(fundId, null, 1);
+
+            if (fundInfoTable == null || fundInfoTable.Rows.Count <= 0) return;
+
+            string jsonString = fundInfoTable.Rows[0].Field<string>("info").Trim();
+
+            JsonDocument document = JsonDocument.Parse(jsonString);
+            JsonElement root = document.RootElement;
+
+            this.txtInvestmentObjective.Text = root.GetProperty("investmentObjective").ToString();
+            this.txtBenchmark.Text = root.GetProperty("benchmark").ToString();
+            this.txtInvestmentPhilosophy.Text = root.GetProperty("investmentPhilosophy").ToString();
+
+        }
+
+        private void FundQ_Load(object sender, EventArgs e)
+        {
+        }
+
+        private void btnSaveGeneralInfo_Click(object sender, EventArgs e)
+        {
+
+            try
+            {
+                // 数据对象
+                var textData = new
+                {
+                    FundId = this.fundId,
+                    InvestmentObjective = this.txtInvestmentObjective.Text,
+                    Benchmark = this.txtBenchmark.Text,
+                    InvestmentPhilosophy = this.txtInvestmentPhilosophy.Text,
+                    UpdateTime = DateTime.Now
+                };
+
+                // 序列化选项
+                var options = new JsonSerializerOptions
+                {
+                    WriteIndented = true,
+                    PropertyNamingPolicy = JsonNamingPolicy.CamelCase
+                };
+
+                string jsonString = JsonSerializer.Serialize(textData, options);
+
+                //MessageBox.Show($"Save JSON: \n{jsonString}", "Json Result");
+
+                int ret = DataAccess.Set_dd_fund_info(this.fundId, DateTime.Today, jsonString, 1, 1, userId);
+
+                if (ret == 1)
+                {
+                    this.Close();
+                }
+
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show($"Error: {ex.Message}", "Error");
+            }
+        }
+    }
+}

+ 120 - 0
FundQ.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>

+ 22 - 0
Program.cs

@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace ddq
+{
+    internal static class Program
+    {
+        /// <summary>
+        /// 应用程序的主入口点。
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new frmMain());
+        }
+    }
+}

+ 36 - 0
Properties/AssemblyInfo.cs

@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// 有关程序集的一般信息由以下
+// 控制。更改这些特性值可修改
+// 与程序集关联的信息。
+[assembly: AssemblyTitle("ddq")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("ddq")]
+[assembly: AssemblyCopyright("Copyright ©  2025")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// 将 ComVisible 设置为 false 会使此程序集中的类型
+//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
+//请将此类型的 ComVisible 特性设置为 true。
+[assembly: ComVisible(false)]
+
+// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
+[assembly: Guid("fc20ef9a-6382-4a78-a2f5-6404814455ec")]
+
+// 程序集的版本信息由下列四个值组成: 
+//
+//      主版本
+//      次版本
+//      生成号
+//      修订号
+//
+//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
+//通过使用 "*",如下所示:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]

+ 71 - 0
Properties/Resources.Designer.cs

@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     此代码由工具生成。
+//     运行时版本: 4.0.30319.42000
+//
+//     对此文件的更改可能导致不正确的行为,如果
+//     重新生成代码,则所做更改将丢失。
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ddq.Properties
+{
+
+
+    /// <summary>
+    ///   强类型资源类,用于查找本地化字符串等。
+    /// </summary>
+    // 此类是由 StronglyTypedResourceBuilder
+    // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
+    // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
+    // (以 /str 作为命令选项),或重新生成 VS 项目。
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.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 ((resourceMan == null))
+                {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ddq.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;
+            }
+        }
+    }
+}

+ 117 - 0
Properties/Resources.resx

@@ -0,0 +1,117 @@
+<?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.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: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" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+            </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" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+            </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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 30 - 0
Properties/Settings.Designer.cs

@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace ddq.Properties
+{
+
+
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+    {
+
+        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+        public static Settings Default
+        {
+            get
+            {
+                return defaultInstance;
+            }
+        }
+    }
+}

+ 7 - 0
Properties/Settings.settings

@@ -0,0 +1,7 @@
+<?xml version='1.0' encoding='utf-8'?>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
+  <Profiles>
+    <Profile Name="(Default)" />
+  </Profiles>
+  <Settings />
+</SettingsFile>

+ 155 - 0
ddq.csproj

@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProjectGuid>{FC20EF9A-6382-4A78-A2F5-6404814455EC}</ProjectGuid>
+    <OutputType>WinExe</OutputType>
+    <RootNamespace>ddq</RootNamespace>
+    <AssemblyName>ddq</AssemblyName>
+    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
+    <Deterministic>true</Deterministic>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
+      <HintPath>packages\BouncyCastle.Cryptography.2.5.1\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
+    </Reference>
+    <Reference Include="Google.Protobuf, Version=3.30.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
+      <HintPath>packages\Google.Protobuf.3.30.0\lib\net45\Google.Protobuf.dll</HintPath>
+    </Reference>
+    <Reference Include="K4os.Compression.LZ4, Version=1.3.8.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
+      <HintPath>packages\K4os.Compression.LZ4.1.3.8\lib\net462\K4os.Compression.LZ4.dll</HintPath>
+    </Reference>
+    <Reference Include="K4os.Compression.LZ4.Streams, Version=1.3.8.0, Culture=neutral, PublicKeyToken=2186fa9121ef231d, processorArchitecture=MSIL">
+      <HintPath>packages\K4os.Compression.LZ4.Streams.1.3.8\lib\net462\K4os.Compression.LZ4.Streams.dll</HintPath>
+    </Reference>
+    <Reference Include="K4os.Hash.xxHash, Version=1.0.8.0, Culture=neutral, PublicKeyToken=32cd54395057cec3, processorArchitecture=MSIL">
+      <HintPath>packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll</HintPath>
+    </Reference>
+    <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\Microsoft.Bcl.AsyncInterfaces.9.0.10\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="MySql.Data, Version=9.4.0.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL">
+      <HintPath>packages\MySql.Data.9.4.0\lib\net462\MySql.Data.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Configuration" />
+    <Reference Include="System.Configuration.ConfigurationManager, Version=8.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Configuration.ConfigurationManager.8.0.0\lib\net462\System.Configuration.ConfigurationManager.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Core" />
+    <Reference Include="System.Diagnostics.DiagnosticSource, Version=8.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll</HintPath>
+    </Reference>
+    <Reference Include="System.IO.Pipelines, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.IO.Pipelines.9.0.10\lib\net462\System.IO.Pipelines.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Management" />
+    <Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Numerics" />
+    <Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
+      <HintPath>packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Text.Encodings.Web, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Text.Encodings.Web.9.0.10\lib\net462\System.Text.Encodings.Web.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Text.Json, Version=9.0.0.10, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Text.Json.9.0.10\lib\net462\System.Text.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Transactions" />
+    <Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
+      <HintPath>packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Xml.Linq" />
+    <Reference Include="System.Data.DataSetExtensions" />
+    <Reference Include="Microsoft.CSharp" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Deployment" />
+    <Reference Include="System.Drawing" />
+    <Reference Include="System.Net.Http" />
+    <Reference Include="System.Windows.Forms" />
+    <Reference Include="System.Xml" />
+    <Reference Include="ZstdSharp, Version=0.8.5.0, Culture=neutral, PublicKeyToken=8d151af33a4ad5cf, processorArchitecture=MSIL">
+      <HintPath>packages\ZstdSharp.Port.0.8.5\lib\net462\ZstdSharp.dll</HintPath>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="DataAccess.cs" />
+    <Compile Include="DDQ.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DDQ.Designer.cs">
+      <DependentUpon>DDQ.cs</DependentUpon>
+    </Compile>
+    <Compile Include="FundQ.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="FundQ.Designer.cs">
+      <DependentUpon>FundQ.cs</DependentUpon>
+    </Compile>
+    <Compile Include="Program.cs" />
+    <Compile Include="Properties\AssemblyInfo.cs" />
+    <EmbeddedResource Include="DDQ.resx">
+      <DependentUpon>DDQ.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="FundQ.resx">
+      <DependentUpon>FundQ.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Properties\Resources.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>Resources.Designer.cs</LastGenOutput>
+      <SubType>Designer</SubType>
+    </EmbeddedResource>
+    <Compile Include="Properties\Resources.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Resources.resx</DependentUpon>
+    </Compile>
+    <None Include="packages.config" />
+    <None Include="Properties\Settings.settings">
+      <Generator>SettingsSingleFileGenerator</Generator>
+      <LastGenOutput>Settings.Designer.cs</LastGenOutput>
+    </None>
+    <Compile Include="Properties\Settings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DependentUpon>Settings.settings</DependentUpon>
+      <DesignTimeSharedInput>True</DesignTimeSharedInput>
+    </Compile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="App.config" />
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+</Project>

+ 25 - 0
ddq.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.10.35122.118
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ddq", "ddq.csproj", "{FC20EF9A-6382-4A78-A2F5-6404814455EC}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{FC20EF9A-6382-4A78-A2F5-6404814455EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{FC20EF9A-6382-4A78-A2F5-6404814455EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{FC20EF9A-6382-4A78-A2F5-6404814455EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{FC20EF9A-6382-4A78-A2F5-6404814455EC}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {606E4B7E-9E64-4BAD-B55C-1CBFFF9EA238}
+	EndGlobalSection
+EndGlobal

+ 22 - 0
packages.config

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="BouncyCastle.Cryptography" version="2.5.1" targetFramework="net472" />
+  <package id="Google.Protobuf" version="3.30.0" targetFramework="net472" />
+  <package id="K4os.Compression.LZ4" version="1.3.8" targetFramework="net472" />
+  <package id="K4os.Compression.LZ4.Streams" version="1.3.8" targetFramework="net472" />
+  <package id="K4os.Hash.xxHash" version="1.0.8" targetFramework="net472" />
+  <package id="Microsoft.Bcl.AsyncInterfaces" version="9.0.10" targetFramework="net472" />
+  <package id="MySql.Data" version="9.4.0" targetFramework="net472" />
+  <package id="System.Buffers" version="4.5.1" targetFramework="net472" />
+  <package id="System.Configuration.ConfigurationManager" version="8.0.0" targetFramework="net472" />
+  <package id="System.Diagnostics.DiagnosticSource" version="8.0.1" targetFramework="net472" />
+  <package id="System.IO.Pipelines" version="9.0.10" targetFramework="net472" />
+  <package id="System.Memory" version="4.5.5" targetFramework="net472" />
+  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net472" />
+  <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net472" />
+  <package id="System.Text.Encodings.Web" version="9.0.10" targetFramework="net472" />
+  <package id="System.Text.Json" version="9.0.10" targetFramework="net472" />
+  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net472" />
+  <package id="System.ValueTuple" version="4.5.0" targetFramework="net472" />
+  <package id="ZstdSharp.Port" version="0.8.5" targetFramework="net472" />
+</packages>