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