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; using Chenfeng.MES.Archiver.Core; using Chenfeng.MES.Archiver.Data; namespace Chenfeng.MES.Archiver.Commands { [Command("copy")] public class CopyTableCommand : ICommand,IArchiveReader { [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("rm-backup", Description = "删除备份表")] public bool RemoveBackup { get; set; } [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 (RemoveBackup) { console.Output.WriteLine("删除备份表"); } else if (Restore) { console.Output.WriteLine("还原备份表"); } else { console.Output.WriteLine($"拷贝"+( Legacy ? "旧" :"新")+"版表数据"+(Replace?"并替换":"")); } try { Db = new MySqlConnection(connBuilder.ConnectionString); Db.Open(); if (Legacy) { TableQueryHelper.MesLegacyTables(this,starMonth); } else { TableQueryHelper.MesTables(this,starMonth); } Print("操作成功"); } catch (Exception ex) { console.Output.WriteLine(ex.ToString()); } finally { Db?.Close(); } return default; } public void ExecuteData(string table, string where, object param) { Db.Execute($"INSERT INTO `{TableDic[table]}` SELECT * FROM `{table}` WHERE {where}", param); } public void ExecuteChildData(string table, string parentTable, string condition) { Db.Execute($"INSERT INTO `{TableDic[table]}` SELECT child.* FROM `{TableDic[parentTable]}` parent join `{table}` child on {condition} "); } public Dictionary TableDic { get; set; } = new Dictionary(); public void Step(Action action, params string[] tables) { var list = tables.Select(table => new { Table = table, NewTable = table + "_" + this.TableSuffix }); foreach (var item in list) { if (RemoveBackup) { Db.Execute($"DROP TABLE IF EXISTS `{item.Table}_bak`"); } else if (Restore) { Db.Execute($"DROP TABLE IF EXISTS `{item.Table}`"); Db.Execute($"RENAME TABLE `{item.Table}_bak` TO `{item.Table}`"); } else { TableDic[item.Table] = item.NewTable; Db.Execute($"DROP TABLE IF EXISTS `{item.NewTable}`"); Db.Execute($"CREATE TABLE `{item.NewTable}` LIKE `{item.Table}`"); // IF NOT EXISTS Print(item.NewTable + " 创建完成"); action(item.Table); Print(item.NewTable + " 拷贝完成"); if (Replace) { Db.Execute($"RENAME TABLE `{item.Table}` TO `{item.Table}_bak`"); Db.Execute($"RENAME TABLE `{item.NewTable}` TO `{item.Table}`"); } } } } } }