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 { [CommandOption("connection", 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; [CommandOption("script", Description = "是否生成执行脚本")] public bool Script { get; set; } public ValueTask ExecuteAsync(IConsole console) { Print = (text) => console.Output.WriteLine($"{DateTime.Now.ToLongTimeString()} {text}"); var starMonth = DateTime.Now.AddMonths(-12).ToString("yyyyMM"); SqlMapper.Settings.CommandTimeout = 60 * Timeout; var executeType = "copy"; if (RemoveBackup) { executeType = "rm_bak"; console.Output.WriteLine("删除备份表"); } else if (Restore) { executeType = "restore"; console.Output.WriteLine("还原备份表"); } else { console.Output.WriteLine($"拷贝"+( Legacy ? "旧" :"新")+"版表数据"+(Replace?"并替换":"")); } try { if (this.Connection.Length > 0) { var connBuilder = new MySqlConnectionStringBuilder(this.Connection); connBuilder.SslMode = MySqlSslMode.None; connBuilder.CharacterSet = "utf8"; Db = new MySqlConnection(connBuilder.ConnectionString); } Db?.Open(); if (Legacy) { TableQueryHelper.MesLegacyTables(this,starMonth); } else { TableQueryHelper.MesTables(this,starMonth); } if (Script) { if (Directory.Exists("./scripts")==false) { Directory.CreateDirectory("./scripts"); } using (var file = File.OpenWrite($"./scripts/mes{(Legacy?"-legacy":"")}-table-{executeType}.sql")) { using (var writer = new StreamWriter(file)) { writer.Write(sqlScripts); } } } Print("操作成功"); } catch (Exception ex) { console.Output.WriteLine(ex.ToString()); } finally { Db?.Close(); } return default; } public void ExecuteData(string table, string where, object param) { ExecuteSql($"INSERT INTO `{TableDic[table]}` SELECT * FROM `{table}` WHERE {where}", param); } public void ExecuteChildData(string table, string parentTable, string condition) { ExecuteSql($"INSERT INTO `{TableDic[table]}` SELECT child.* FROM `{TableDic[parentTable]}` parent join `{table}` child on {condition} "); } private StringBuilder sqlScripts = new StringBuilder(); private void ExecuteSql(string sql, object param = null) { Db?.Execute(sql,param); if (Script) { var fullSql = sql + ";"; if(param != null) { foreach (var property in param.GetType().GetProperties()) { var val = property.GetValue(param)?.ToString(); fullSql =fullSql.Replace("@" + property.Name, val); } } sqlScripts.AppendLine(fullSql); } } 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) { ExecuteSql($"DROP TABLE IF EXISTS `{item.Table}_bak`"); } else if (Restore) { ExecuteSql($"DROP TABLE IF EXISTS `{item.Table}`"); ExecuteSql($"RENAME TABLE `{item.Table}_bak` TO `{item.Table}`"); } else { TableDic[item.Table] = item.NewTable; ExecuteSql($"DROP TABLE IF EXISTS `{item.NewTable}`"); ExecuteSql($"CREATE TABLE `{item.NewTable}` LIKE `{item.Table}`"); // IF NOT EXISTS Print(item.NewTable + " 创建完成"); action(item.Table); Print(item.NewTable + " 拷贝完成"); if (Replace) { ExecuteSql($"RENAME TABLE `{item.Table}` TO `{item.Table}_bak`"); ExecuteSql($"RENAME TABLE `{item.NewTable}` TO `{item.Table}`"); } } } } } }