diff --git a/Chenfeng.MES.Archiver/Chenfeng.MES.Archiver.csproj b/Chenfeng.MES.Archiver/Chenfeng.MES.Archiver.csproj
new file mode 100644
index 0000000..5d82381
--- /dev/null
+++ b/Chenfeng.MES.Archiver/Chenfeng.MES.Archiver.csproj
@@ -0,0 +1,24 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+ PreserveNewest
+
+
+
+
diff --git a/Chenfeng.MES.Archiver/Commands/MysqlCommand.cs b/Chenfeng.MES.Archiver/Commands/MysqlCommand.cs
new file mode 100644
index 0000000..c063537
--- /dev/null
+++ b/Chenfeng.MES.Archiver/Commands/MysqlCommand.cs
@@ -0,0 +1,202 @@
+using MySqlConnector;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Dapper;
+using CliFx;
+using CliFx.Infrastructure;
+using CliFx.Attributes;
+using System.Data;
+using System.Data.Common;
+
+namespace Chenfeng.MES.Archiver.Commands
+{
+ [Command()]
+ public class MysqlCommand : ICommand
+ {
+ [CommandParameter(0, Description = "数据库连接")]
+ public string Connection { get; set; } = "";
+
+ public string TableSuffix { get; set; } = "new";
+
+ public DbConnection? Db { get; private set; }
+
+ public Action Print { get; set; } = (text) => { };
+
+ [CommandOption("legacy", Description = "旧版MES")]
+ public bool Legacy { get; set; } = false;
+
+ [CommandOption("replace", Description = "替换表")]
+ public bool Replace { get; set; } = false;
+
+ [CommandOption("restore", Description = "回复表")]
+ public bool Restore { get; set; } = false;
+
+ [CommandOption("timeout", Description = "sql命令超时时间")]
+ public int Timeout { get; set; } = 3;
+
+
+
+ public ValueTask ExecuteAsync(IConsole console)
+ {
+ Print = (text) => console.Output.WriteLine($"{DateTime.Now.ToLongTimeString()} {text}");
+
+ var connBuilder = new MySqlConnectionStringBuilder(this.Connection);
+ connBuilder.SslMode = MySqlSslMode.None;
+ connBuilder.CharacterSet = "utf8";
+
+ var starMonth = DateTime.Now.AddMonths(-12).ToString("yyyyMM");
+
+ SqlMapper.Settings.CommandTimeout = 60 * Timeout;
+
+ if (Restore)
+ {
+ console.Output.WriteLine("还原备份表");
+ }
+ else
+ {
+ console.Output.WriteLine($"拷贝"+( Legacy ? "旧" :"新")+"版表数据"+(Replace?"并替换":""));
+ }
+
+ try
+ {
+ Db = new MySqlConnection(connBuilder.ConnectionString);
+
+ Db.Open();
+ if (Legacy)
+ {
+ CopyMesLegacyTables(starMonth);
+ }
+ else
+ {
+ CopyMesTables(starMonth);
+ }
+
+
+ Print("操作成功");
+
+ }
+ catch (Exception ex)
+ {
+ console.Output.WriteLine(ex.ToString());
+ }
+ finally
+ {
+ Db?.Close();
+ }
+
+ return default;
+ }
+
+ private void CopyMesTables(string starMonth)
+ {
+ CopyStep((table, newTable) =>
+ {
+ CopyData(table, newTable, "LEFT(orderno,6) >= @starMonth", new { starMonth });
+ }, "order", "order_box_block", "order_data_block", "order_data_goods", "order_data_parts", "order_item", "order_module_extra", "order_module_item", "order_package");
+
+
+ CopyStep((tProcess, newProcess) =>
+ {
+ CopyData(tProcess, newProcess, "LEFT(orderno,6) >= @starMonth", new { starMonth });
+ CopyStep((table, newTable) =>
+ {
+ CopyChildData(table, newTable, newProcess, "parent.ID = child.OrderProcessID");
+ }, "order_process_step_item", "order_process_step");
+ }, "order_process");
+
+
+
+ CopyStep((table, newTable) =>
+ {
+ CopyData(table, newTable, "LEFT(DATE_FORMAT(CreateTime,'%Y%m'),6) >= @starMonth", new { starMonth });
+ }, "simple_plan_order");
+
+
+ CopyStep((parent, newParent) =>
+ {
+ CopyData(parent, newParent, "LEFT(DATE_FORMAT(CreateTime,'%Y%m'),6) >= @starMonth", new { starMonth });
+ CopyStep((child, newChild) =>
+ {
+ CopyChildData(child, newChild, newParent, "parent.ID = child.ID");
+ }, "order_block_plan_result");
+ }, "order_block_plan");
+
+ //CopyStep((table, newTable) =>
+ //{
+ // CopyData(table, newTable, "concat('20',left(id,4)) >= @starMonth ", new { starMonth });
+ //}, "order_scrap_board");
+ }
+
+ private void CopyMesLegacyTables(string starMonth)
+ {
+ CopyStep((order, newOrder) =>
+ {
+ CopyData(order, newOrder, "LEFT(DATE_FORMAT(SaleDate,'%Y%m'),6) >= @starMonth", new { starMonth });
+
+ CopyStep((child, newChild) =>
+ {
+ CopyChildData(child, newChild, newOrder, "parent.orderno=child.orderno");
+ }, "SaleOrderItem", "saleblock", "saleobject", "saleorderobject", "saleorderoffer", "saleorderpackage", "saleblockobjids", "saleobjectobjids", "saleorder_block_cadmodelinfo", "saleorderblockbaseposition",
+ "saleordergoodsinfo", "saleorder_block_point", "saleorder_block_pointinfo", "orderprocess", "orderprocessstep", "orderprocessstepitem");
+
+ }, "saleorder");
+
+
+ CopyStep((plan, newPlan) =>
+ {
+ CopyData(plan, newPlan, "LEFT(DATE_FORMAT(createtime,'%Y%m'),6) >= @starMonth", new { starMonth });
+
+ CopyStep((child, newChild) =>
+ {
+ CopyChildData(child, newChild, newPlan, "parent.id=child.id");
+ }, "orderblockprocessplanplaceresult");
+ }, "orderblockprocessplan");
+ }
+
+ private void CopyData(string table, string newTable, string where, object param)
+ {
+ Db.Execute($"INSERT INTO `{newTable}` SELECT * FROM `{table}` WHERE {where}", param);
+ }
+ private void CopyChildData(string table, string newTable, string parentTable, string condition)
+ {
+ Db.Execute($"INSERT INTO `{newTable}` SELECT child.* FROM `{parentTable}` parent join `{table}` child on {condition} ");
+ }
+
+ private void CopyStep(Action step, params string[] tables)
+ {
+ var list = tables.Select(table => new
+ {
+ Table = table,
+ NewTable = table + "_" + this.TableSuffix
+ });
+
+ foreach (var item in list)
+ {
+ if (Restore)
+ {
+ Db.Execute($"DROP TABLE IF EXISTS `{item.Table}`");
+ Db.Execute($"RENAME TABLE `{item.Table}_bak` TO `{item.Table}`");
+ }
+ else
+ {
+ Db.Execute($"DROP TABLE IF EXISTS `{item.NewTable}`");
+ Db.Execute($"CREATE TABLE `{item.NewTable}` LIKE `{item.Table}`"); // IF NOT EXISTS
+
+ Print(item.NewTable + " 创建完成");
+ step(item.Table, item.NewTable);
+ Print(item.NewTable + " 拷贝完成");
+
+ if (Replace)
+ {
+ Db.Execute($"RENAME TABLE `{item.Table}` TO `{item.Table}_bak`");
+ Db.Execute($"RENAME TABLE `{item.NewTable}` TO `{item.Table}`");
+ }
+ }
+ }
+
+ }
+ }
+}
diff --git a/Chenfeng.MES.Archiver/Program.cs b/Chenfeng.MES.Archiver/Program.cs
new file mode 100644
index 0000000..1cac7e9
--- /dev/null
+++ b/Chenfeng.MES.Archiver/Program.cs
@@ -0,0 +1,11 @@
+// See https://aka.ms/new-console-template for more information
+
+
+using CliFx;
+
+//Console.WriteLine("Hello, World!");
+
+await new CliApplicationBuilder()
+ .AddCommandsFromThisAssembly()
+ .Build()
+ .RunAsync(args);
\ No newline at end of file
diff --git a/Chenfeng.MES.Archiver/Properties/launchSettings.json b/Chenfeng.MES.Archiver/Properties/launchSettings.json
new file mode 100644
index 0000000..5eaed58
--- /dev/null
+++ b/Chenfeng.MES.Archiver/Properties/launchSettings.json
@@ -0,0 +1,13 @@
+{
+ "profiles": {
+ "WSL": {
+ "commandName": "WSL2",
+ "environmentVariables": {},
+ "distributionName": ""
+ },
+ "copy-table": {
+ "commandName": "Project",
+ "commandLineArgs": "Server=192.168.1.127;UserId=root;Password=ruixinjie!@#123;Database=cferp_test;Port=3306;"
+ }
+ }
+}
\ No newline at end of file
diff --git a/Chenfeng.MES.MysqlArchiver/Chenfeng.MES.MysqlArchiver.csproj b/Chenfeng.MES.MysqlArchiver/Chenfeng.MES.MysqlArchiver.csproj
new file mode 100644
index 0000000..132c02c
--- /dev/null
+++ b/Chenfeng.MES.MysqlArchiver/Chenfeng.MES.MysqlArchiver.csproj
@@ -0,0 +1,9 @@
+
+
+
+ net6.0
+ enable
+ enable
+
+
+
diff --git a/Chenfeng.MES.MysqlArchiver/DbContext.cs b/Chenfeng.MES.MysqlArchiver/DbContext.cs
new file mode 100644
index 0000000..02d73fc
--- /dev/null
+++ b/Chenfeng.MES.MysqlArchiver/DbContext.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Chenfeng.MES.MysqlArchiver
+{
+ internal class DbContext
+ {
+ }
+}
diff --git a/MES-Shell/Chenfeng.MES.Shell.csproj b/MES-Shell/Chenfeng.MES.Shell.csproj
new file mode 100644
index 0000000..01c11a8
--- /dev/null
+++ b/MES-Shell/Chenfeng.MES.Shell.csproj
@@ -0,0 +1,11 @@
+
+
+
+ Exe
+ net6.0
+ Chenfeng.MES.Shell
+ enable
+ enable
+
+
+
diff --git a/MES-Shell/Program.cs b/MES-Shell/Program.cs
new file mode 100644
index 0000000..3751555
--- /dev/null
+++ b/MES-Shell/Program.cs
@@ -0,0 +1,2 @@
+// See https://aka.ms/new-console-template for more information
+Console.WriteLine("Hello, World!");
diff --git a/MES-Toolkit.sln b/MES-Toolkit.sln
new file mode 100644
index 0000000..2bc1bd2
--- /dev/null
+++ b/MES-Toolkit.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.32014.148
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chenfeng.MES.Archiver", "Chenfeng.MES.Archiver\Chenfeng.MES.Archiver.csproj", "{D42E639F-0E4D-4CE3-9793-230D6B07C3FE}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D42E639F-0E4D-4CE3-9793-230D6B07C3FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D42E639F-0E4D-4CE3-9793-230D6B07C3FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D42E639F-0E4D-4CE3-9793-230D6B07C3FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D42E639F-0E4D-4CE3-9793-230D6B07C3FE}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {98DE2A94-0D14-4190-810A-75DE119C7113}
+ EndGlobalSection
+EndGlobal