using Models; using Models.ModelItems; using Models.View; using MySqlConnector; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Pkcs; using Org.BouncyCastle.Ocsp; using Services.Cache; using Services.Tool; using SqlSugar; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.Entity; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; using UH_CENTER; using UtilsSharp; using static Services.Cache.CacheHelp; namespace Services.Manager { //从HotelService工程复制过来,目标是合并两个同步功能。 public class SyncAllFromOutterDB { public class SQLSERVER_Helper { public static String StrConnSqlServer = "Data Source=boonlive-rcu.com;Initial Catalog=CRICS;Persist Security Info=True;User ID=blw;Password=blw@#$;"; public static DataTable GetDatatable(string con, string sql, params SqlParameter[] par) { using (SqlConnection connection = new SqlConnection(con)) { using (SqlDataAdapter sda = new SqlDataAdapter(sql, connection)) { if (par != null && par.Length > 0) { sda.SelectCommand.Parameters.AddRange(par); } DataTable dt = new DataTable(); sda.Fill(dt); sda.SelectCommand.Parameters.Clear(); return dt; } } } public static int ExecuteSql(string con, string SQLString) { using (SqlConnection connection = new SqlConnection(con)) { using (SqlCommand cmd = new SqlCommand(SQLString, connection)) { try { connection.Open(); int rows = cmd.ExecuteNonQuery(); return rows; } catch (SqlException e) { connection.Close(); throw e; } } } } } public static class GlobalSyncLockTest { public static bool isInProcessing = false; public static object testLock = new object(); public static string recentErrMsg = ""; public static int gSyncSeq = 1; public static DateTime lastStartTime = new DateTime(); } public static class SYNC_DATA { public static DateTime? SX = null; //上一次同步时间 public static bool SYNC_DATA_ALL(int stepid = 0) { if (SYNC_DATA.SX != null && DateTime.Now - SYNC_DATA.SX <= TimeSpan.FromMinutes(0)) { GlobalSyncLockTest.recentErrMsg = "同步失败,同步任务忙"; return false; } //排队测试,并抢flag. //只有第一个能通过测试,并抢到。 //后面的都不能通过测试。 lock (GlobalSyncLockTest.testLock) { if (GlobalSyncLockTest.isInProcessing) { GlobalSyncLockTest.recentErrMsg = "同步失败,同步任务忙"; return false; } GlobalSyncLockTest.isInProcessing = true; } GlobalSyncLockTest.gSyncSeq++; DateTime startTime = DateTime.Now; GlobalSyncLockTest.lastStartTime = startTime; try { SYNC_DATA.SX = DateTime.Now; DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 0/10 同步开始"); //获取连接字符串 var db = SqlSugarBase.RcuDb; DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 1/10 取到mysql的SqlSugarDB"); SyncHotelAll(db, startTime, true); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 2/10 同步酒店表完成"); SyncHotelGroupAll(db, startTime, true); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 3/10 同步酒店组表完成"); SyncRoomTypeAll(db, startTime); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 4/10 同步房型表完成"); SyncMainDeviceAll(db, startTime); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 5/10 同步主机表完成"); SyncSeasonAll(db, startTime); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 6/10 同步季度表完成"); SyncHotelSeasonAll(db, startTime); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 7/10 同步酒店季度表完成"); //同步用户 SyncUserInfoAll(db, startTime); SyncOrgUserInfoAll(db, startTime); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 8/10 同步人员信息完成"); //删除不存在的酒店的无效授权 ClearNotExistHotelAuto(db, startTime); //重新生成所有用户的 用户酒店json数据到用户表的 Hotel_Data 字段 UH_CENTER_Help.Sel_Hotel_All();//更新到正确的酒店,但是自动授权的用户新增的酒店没有正确的统计次数 DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 9/10 重新生成所有人员的用户酒店json数据完成"); //使用授权表再次更新自动授权的用户的jsondata,更新到正确的统计次数 // UH_CENTER_Help.Sel_Hotel_JSON_All_ByAutoAutho(); //清除redis缓存 //重新生成 redis 缓存字段 //重新授权到授权表 RecreateUserCache(); //重新刷新redis cache //CacheHelp.Removesys(CacheHelp.syskey.sysUserInfoListKey); //List usrViewList = CacheHelp.cacheSysUserInfo; DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 10/10 自动授权人员信息完成"); GlobalSyncLockTest.isInProcessing = false; GlobalSyncLockTest.recentErrMsg = "同步成功"; return true; } catch (Exception ex) { GlobalSyncLockTest.isInProcessing = false; GlobalSyncLockTest.recentErrMsg = "同步失败,触发异常:" + ex.ToString(); DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}]数据。。。异常{ex.ToString()}"); return false; } }//end of SYNC_DATA_ALL() #region 同步巫工数据库:酒店表,酒店组表,房型表,主机表,季度表和酒店季度表。 public static void SyncHotelAll(SqlSugarScope db, DateTime stTime, bool isSyncToAuthDB = false) { //0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间 string lastRecTime = "2023-10-08"; //使用数据库阿里云服务器 blv_rcu_db 数据库 new_table_update_time_mark表 List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "TBL_HOTEL_BASIC_INFO") .ToList(); if (itList.Count > 0) { if (itList[0].LAST_LATESTREC_TIME == null) { lastRecTime = "2023-10-08"; } else { var timeRec = Convert.ToDateTime(itList[0].LAST_LATESTREC_TIME); if (timeRec.Year < 2023) { lastRecTime = "2023-10-08"; } else { lastRecTime = timeRec.ToString("yyyy-MM-dd HH:mm:ss.fff"); } } } //1. 取到巫工数据库最新记录 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select IDOLD = b.id, LOG_IMAGE = b.LogoPath, HOTEL_NAME_CN = b.[name], SORT = b.sort, HOTEL_NAME_EN = b.ename, KEY_IN_DATETIME = b.createddate, [IsApprove] = b.IsApprove, VALID_DATETIME = b.ValidateDate, PROJECT_NUMBER = b.[code], [STATUS] = b.[STATUS], [KEY_Name] = CreatedBy, DETAIL_ADD = b.[Address], HOTEL_CONTACT_PHONE = b.[Phone], HOTEL_OLD_GROUP = b.SysHotelGroupID, REMARK = b.Remark, IsDel = b.IsDeleted, UPDATE_TIMEMARK = GETDATE(), APPROVE_DATE = b.Last_Modified_Time from tb_Sys_Hotels b where Last_Modified_Time > '{lastRecTime}' order by Last_Modified_Time asc;") ); //APPROVE_DATE 是为了取到最后一条记录的时间。不要更新到新表去。 //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //从SQL server数据库取到的最新记录的记录时间 //冲掉 //从时间戳表里面取的上次记录的时间 DateTime dtLastRecTime = Convert.ToDateTime(hoteldata[0].APPROVE_DATE); //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].IDOLD + "名字:" + hoteldata[i].HOTEL_NAME_CN; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 酒店表如下记录有更新:" + retStr); //找出更新,插入的记录 List updatelist = new List(); List insertlist = new List(); //联系键: //那边的主键b.id == 这边的IDOLD //使用数据库阿里云服务器 blv_rcu_db 数据库 tbl_hotel_basic_info表 var listIds = db.Queryable() .Select(it => new { mainID = it.HOTEL_ID, outerMainID = it.IDOLD }) .ToList().GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); //.ToDictionary(p => p.outerMainID); //表名实体 ,动态条件 foreach (var p in hoteldata) { if (listIds.ContainsKey(p.IDOLD)) { p.HOTEL_ID = listIds[p.IDOLD].mainID;//SQL sugar默认是按主键更新,所以主键要正确赋值 updatelist.Add(p); } else insertlist.Add(p); } //更新指定列。 只更新取到的那些列 //"HOTEL_OLD_GROUP", "LOG_IMAGE", "HOTEL_NAME_CN", "SORT", "HOTEL_NAME_EN", "KEY_IN_DATETIME", "IsApprove", "VALID_DATETIME", //"PROJECT_NUMBER", "STATUS", "KEY_Name", "DETAIL_ADD", "HOTEL_CONTACT_PHONE", "HOTEL_GROUP", "UPDATE_TIMEMARK" var affectResult = db.Updateable(updatelist).UpdateColumns(it => new { //it.IDOLD, //不用更新,这个再老表里面已经有正确的值了, it.HOTEL_OLD_GROUP, it.LOG_IMAGE, it.HOTEL_NAME_CN, it.SORT, it.HOTEL_NAME_EN, it.KEY_IN_DATETIME, it.IsApprove, it.VALID_DATETIME, it.PROJECT_NUMBER, it.STATUS, it.KEY_Name, it.DETAIL_ADD, it.HOTEL_CONTACT_PHONE, it.HOTEL_GROUP, it.IsDel, it.UPDATE_TIMEMARK }) .ExecuteCommand(); //插入 var iAffectResult = db.Insertable(insertlist).ExecuteCommand(); if (isSyncToAuthDB) { List updateauthlist = new List(); List insertauthlist = new List(); //联系键: //那边的主键b.id == 这边的IDOLD var listauthIds = SqlSugarBase.Db.Queryable() .Select(it => it.Id) .ToList(); //SqlSugarBase.Db is AuthorityDB foreach (var p in hoteldata) { Hotels tmpAuthObj = new Hotels(); tmpAuthObj.Id = p.IDOLD; tmpAuthObj.Name = p.HOTEL_NAME_CN; tmpAuthObj.Status = p.STATUS; tmpAuthObj.Desc = p.REMARK; tmpAuthObj.CreateTime = p.KEY_IN_DATETIME; tmpAuthObj.GroupId = p.HOTEL_OLD_GROUP; tmpAuthObj.IsApprove = p.IsApprove ? 1 : 0; tmpAuthObj.Code = p.PROJECT_NUMBER; if (listauthIds.Contains(p.IDOLD)) { updateauthlist.Add(tmpAuthObj); } else { insertauthlist.Add(tmpAuthObj); } } var affectauthResult = SqlSugarBase.Db.Updateable(updateauthlist).UpdateColumns(it => new { //it.Id, //不用更新,这个在老表里面已经有正确的值了, it.Name, it.Status, it.Desc, it.CreateTime, it.GroupId, it.IsApprove, it.Code }) .ExecuteCommand(); if (insertauthlist.Count > 0) { //因为在实体类里面声明了 Id 是主键,所以生成的insert没有 Id 列。 //但实际上数据表是没有主键的,Id 是一个普通列,所以我们必须插入的时候也要设定 Id 的值 //但是有因为sqlsugar内部生成机制,会检查实体类里面的主键,所以必须手写sql代码来实现插入。 string insSql = "INSERT INTO hotels (Id, `Name`, `Desc`, GroupId, `Code`, `Status`, IsApprove, CreateTime) VALUES "; int curPos = 0; int lastPos = insertauthlist.Count - 1; foreach (var it in insertauthlist) { insSql += String.Format("({0},{1},{2},{3},{4},{5},{6},{7})", it.Id, "'" + it.Name + "'", "'" + it.Desc + "'", it.GroupId, "'" + it.Code + "'", it.Status, it.IsApprove, "'" + it.CreateTime + "'" ); if (curPos == lastPos) insSql += " ;"; else insSql += ", "; curPos++; } SqlSugarBase.Db.Ado.ExecuteCommand(insSql); } } //更新成功,记录这次更新时间。 itList[0].LAST_UPDATE_TIME = stTime; itList[0].LAST_LATESTREC_TIME = dtLastRecTime; db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME, it.LAST_LATESTREC_TIME }).ExecuteCommand(); } } public static void SyncHotelGroupAll(SqlSugarScope db, DateTime stTime, bool isSyncToAuthDB = false) { //0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间 string lastRecTime = "2023-10-08"; //使用数据库阿里云服务器 blv_rcu_db 数据库 new_table_update_time_mark表 List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "TBL_HOTEL_GROUP_INFO") .ToList(); if (itList.Count > 0) { if (itList[0].LAST_LATESTREC_TIME == null) { lastRecTime = "2023-10-08"; } else { var timeRec = Convert.ToDateTime(itList[0].LAST_LATESTREC_TIME); if (timeRec.Year < 2023) { lastRecTime = "2023-10-08"; } else { lastRecTime = timeRec.ToString("yyyy-MM-dd HH:mm:ss.fff"); } } } //1. 取到巫工数据库最新记录 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select HOTEL_GROUP_OLD_ID = b.id, HOTEL_GROUP_NAME = b.[Name] , SORT = b.SORT, PARENT_OLD_ID = b.ParentID, KEY_IN_DATETIME = b.[Last_Modified_Time], IsDel = b.IsDeleted, UPDATE_TIMEMARK = GETDATE() from tb_Sys_HotelGroups b where Last_Modified_Time > '{lastRecTime}' order by Last_Modified_Time asc;") ); //DESC //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //从SQL server数据库取到的最新记录的记录时间 //冲掉 //从时间戳表里面取的上次记录的时间 DateTime dtLastRecTime = Convert.ToDateTime(hoteldata[0].KEY_IN_DATETIME); //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].HOTEL_GROUP_OLD_ID + "名字:" + hoteldata[i].HOTEL_GROUP_NAME; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 酒店组表如下记录有更新:" + retStr); List updatelist = new List(); List insertlist = new List(); //联系键: //那边的主键 b.id == 这边的 HOTEL_GROUP_OLD_ID //使用数据库阿里云服务器 blv_rcu_db 数据库 tbl_hotel_group_info表 var listIds = db.Queryable() .Select(it => new { mainID = it.HOTEL_GROUP_ID, outerMainID = it.HOTEL_GROUP_OLD_ID }) .ToList().GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); //.ToDictionary(p => p.outerMainID); //表名实体 ,动态条件 foreach (var p in hoteldata) { if (listIds.ContainsKey(p.HOTEL_GROUP_OLD_ID)) { p.HOTEL_GROUP_ID = listIds[p.HOTEL_GROUP_OLD_ID].mainID;//SQL sugar默认是按主键更新,所以主键要正确赋值 updatelist.Add(p); } else insertlist.Add(p); } //更新指定列。 只更新取到的那些列 var affectResult = db.Updateable(updatelist).UpdateColumns(it => new { //it.HOTEL_GROUP_OLD_ID, //不用更新,这个再老表里面已经有正确的值了, it.HOTEL_GROUP_NAME, it.PARENT_OLD_ID, it.PARENT_ID, it.SORT, it.IsDel, it.UPDATE_TIMEMARK }) .ExecuteCommand(); //插入所有列 var iAffectResult = db.Insertable(insertlist).ExecuteCommand(); if (isSyncToAuthDB) { List updateauthlist = new List(); List insertauthlist = new List(); //联系键: //那边的主键b.id == 这边的ID //阿里云服务器 AuthorityDB数据库 hotelgroups表 var listauthIds = SqlSugarBase.Db.Queryable() .Select(it => it.Id) .ToList(); //SqlSugarBase.Db is AuthorityDB foreach (var p in hoteldata) { HotelGroups tmpAuthObj = new HotelGroups(); tmpAuthObj.Id = p.HOTEL_GROUP_OLD_ID; tmpAuthObj.Name = p.HOTEL_GROUP_NAME; tmpAuthObj.ParentId = p.PARENT_OLD_ID; tmpAuthObj.Desc = ""; tmpAuthObj.CreateTime = p.KEY_IN_DATETIME; tmpAuthObj.IsDel = p.IsDel; if (listauthIds.Contains(p.HOTEL_GROUP_OLD_ID)) { updateauthlist.Add(tmpAuthObj); } else { insertauthlist.Add(tmpAuthObj); } } var affectauthResult = SqlSugarBase.Db.Updateable(updateauthlist).UpdateColumns(it => new { //it.Id, //不用更新,这个在老表里面已经有正确的值了, it.Name, it.ParentId, it.Desc, it.CreateTime, it.IsDel }) .ExecuteCommand(); if (insertauthlist.Count > 0) { //因为在实体类里面声明了 Id 是主键,所以生成的insert没有 Id 列。 //但实际上数据表是没有主键的,Id 是一个普通列,所以我们必须插入的时候也要设定 Id 的值 //但是有因为sqlsugar内部生成机制,会检查实体类里面的主键,所以必须手写sql代码来实现插入。 string insSql = "INSERT INTO hotelgroups (Id, `Name`, ParentId, `Desc`, CreateTime, IsDel) VALUES "; int curPos = 0; int lastPos = insertauthlist.Count - 1; foreach (var it in insertauthlist) { insSql += String.Format("({0},{1},{2},{3},{4},{5})", it.Id, "'" + it.Name + "'", it.ParentId, "'" + it.Desc + "'", "'" + it.CreateTime + "'", it.IsDel ); if (curPos == lastPos) insSql += " ;"; else insSql += ", "; curPos++; } SqlSugarBase.Db.Ado.ExecuteCommand(insSql); } } //更新成功,记录这次更新时间。 itList[0].LAST_UPDATE_TIME = stTime; itList[0].LAST_LATESTREC_TIME = dtLastRecTime; db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME, it.LAST_LATESTREC_TIME }).ExecuteCommand(); } } /// /// 同步房型 /// /// /// public static void SyncRoomTypeAll(SqlSugarScope db, DateTime stTime) { //0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间 string lastRecTime = "2023-10-08"; List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "TBL_ROOM_TYPE_LIST") .ToList(); if (itList.Count > 0) { if (itList[0].LAST_LATESTREC_TIME == null) { lastRecTime = "2023-10-08"; } else { var timeRec = Convert.ToDateTime(itList[0].LAST_LATESTREC_TIME); if (timeRec.Year < 2023) { lastRecTime = "2023-10-08"; } else { lastRecTime = timeRec.ToString("yyyy-MM-dd HH:mm:ss.fff"); } } } //1. 取到巫工数据库最新记录 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select ROOM_TYPE_OLD_ID = B.ID, HOTEL_OLD_ID = b.[HOTELID] , ROOM_TYPE_NAME = b.[NAME], IsDel = b.IsDeleted, UPDATE_TIMEMARK = b.Last_Modified_Time, Creation_Time = GETDATE() from TB_ROOMTYPE b where Last_Modified_Time > '{lastRecTime}' order by Last_Modified_Time asc;") ); //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //从SQL server数据库取到的最新记录的记录时间 //冲掉 //从时间戳表里面取的上次记录的时间 DateTime dtLastRecTime = Convert.ToDateTime(hoteldata[0].UPDATE_TIMEMARK); //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].ROOM_TYPE_OLD_ID + "名字:" + hoteldata[i].ROOM_TYPE_NAME; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 房型表如下记录有更新:" + retStr); List updatelist = new List(); List insertlist = new List(); //联系键: //那边的主键 b.id == 这边的 ROOM_TYPE_OLD_ID var listIds = db.Queryable() .Select(it => new { mainID = it.ROOM_TYPE_ID, outerMainID = it.ROOM_TYPE_OLD_ID }) .ToList().GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); //.ToDictionary(p => p.outerMainID); //表名实体 ,动态条件 foreach (var p in hoteldata) { if (listIds.ContainsKey(p.ROOM_TYPE_OLD_ID)) { p.ROOM_TYPE_ID = listIds[p.ROOM_TYPE_OLD_ID].mainID;//SQL sugar默认是按主键更新,所以主键要正确赋值 updatelist.Add(p); } else insertlist.Add(p); } //更新指定列。 只更新取到的那些列 var affectResult = db.Updateable(updatelist).UpdateColumns(it => new { //it.ROOM_TYPE_OLD_ID, //不用更新,这个再老表里面已经有正确的值了, it.HOTEL_OLD_ID, it.ROOM_TYPE_NAME, it.Creation_Time, it.IsDel, it.UPDATE_TIMEMARK }) .ExecuteCommand(); //插入所有列 var iAffectResult = db.Insertable(insertlist).ExecuteCommand(); //更新成功,记录这次更新时间。 itList[0].LAST_UPDATE_TIME = stTime; itList[0].LAST_LATESTREC_TIME = dtLastRecTime; db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME, it.LAST_LATESTREC_TIME }).ExecuteCommand(); } } //那边的主机表,,对应这边的房间,房间配置表和rcu表 /// /// 同步主机 /// /// /// public static void SyncMainDeviceAll(SqlSugarScope db, DateTime stTime) { // 主机表,对应这边房间表 //0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间 string lastRecTime = "2023-10-08"; List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "TBL_ROOM_BASIC_INFO") .ToList(); if (itList.Count > 0) { if (itList[0].LAST_LATESTREC_TIME == null) { lastRecTime = "2023-10-08"; } else { var timeRec = Convert.ToDateTime(itList[0].LAST_LATESTREC_TIME); if (timeRec.Year < 2023) { lastRecTime = "2023-10-08"; } else { lastRecTime = timeRec.ToString("yyyy-MM-dd HH:mm:ss.fff"); } } } //1. 取到巫工数据库最新记录 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select * from tb_Hosts b where LAST_MODIFIED_TIME > '{lastRecTime}' order by Last_Modified_Time asc;") ); //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //从SQL server数据库取到的最新记录的记录时间 //冲掉 //从时间戳表里面取的上次记录的时间 DateTime dtLastRecTime = Convert.ToDateTime(hoteldata[0].Last_Modified_Time); //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].ID + "酒店编号:" + hoteldata[i].HOTELID + "房间名字:" + hoteldata[i].RoomNumber; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 主机表如下记录有更新:" + retStr); #region 同步房间表数据 List updatelist = new List(); List insertlist = new List(); //联系键: //那边的主键 b.id == 这边的 ROOM_OLD_ID //var rooms var listIds = db.Queryable() .Select(it => new { mainID = it.ROOM_ID, outerMainID = it.ROOM_OLD_ID }) .ToList() .GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); //var listIds = rooms.ToDictionary(p => p.outerMainID); foreach (var p in hoteldata) { TBL_ROOM_BASIC_INFO tmpObj = new TBL_ROOM_BASIC_INFO(); tmpObj.ROOM_OLD_ID = p.ID; tmpObj.RoomStatusID = p.RoomStatusID; tmpObj.MAC = p.MAC; tmpObj.AUTH_DATETIME = p.ExpireTime; tmpObj.REMARK = p.Remark; tmpObj.ROOM_NUMBER = p.RoomNumber; tmpObj.ROOM_TYPE_OLD_ID = p.RoomTypeID; tmpObj.HOTEL_OLD_ID = p.HOTELID; tmpObj.IsDel = p.IsDeleted; tmpObj.UPDATE_TIMEMARK = DateTime.Now; if (listIds.ContainsKey(p.ID)) { tmpObj.ROOM_ID = listIds[p.ID].mainID;//SQL sugar默认是按主键更新,所以主键要正确赋值 updatelist.Add(tmpObj); } else { insertlist.Add(tmpObj); } } //更新指定列。 只更新取到的那些列 var affectResult = db.Updateable(updatelist).UpdateColumns(it => new { //it.ROOM_OLD_ID, //不用更新,这个在老表里面已经有正确的值了, it.RoomStatusID, it.MAC, it.AUTH_DATETIME, it.REMARK, it.ROOM_NUMBER, it.ROOM_TYPE_OLD_ID, it.HOTEL_OLD_ID, it.IsDel, it.UPDATE_TIMEMARK }) .ExecuteCommand(); //插入所有列 var iAffectResult = db.Insertable(insertlist).ExecuteCommand(); #endregion #region 同步配置表数据 List updatecfglist = new List(); List insertcfglist = new List(); //联系键: //那边的主键 b.id == 这边的 ROOM_OLD_ID //var listcfgidstupm var listcfgIds = db.Queryable() .Select(it => new { mainID = it.ID, outerMainID = it.ROOM_OLD_ID }) .ToList() .GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); //var listcfgIds = listcfgidstupm.ToDictionary(p => p.outerMainID); foreach (var p in hoteldata) { TBL_ROOM_SET_CONFIG tmpcfgObj = new TBL_ROOM_SET_CONFIG(); tmpcfgObj.ROOM_OLD_ID = p.ID; tmpcfgObj.RCU_ROOM = p.RoomNumber; tmpcfgObj.PRODUCT_CODE = p.HostNumber; tmpcfgObj.FW_VER = p.Version; tmpcfgObj.CONFIG_VER = p.ConfigVersion; tmpcfgObj.RCU_SUB_MASK = p.SubnetMask; tmpcfgObj.RCU_CLOUD_SVR_IP = p.ServerIP; tmpcfgObj.RCU_CLOUD_SVR_PORT_MODE = p.ServerPort.ToString(); tmpcfgObj.RCU_LOCAL_IP = p.LanIP; tmpcfgObj.RCU_LOCAL_PORT = p.LanPort.ToString(); tmpcfgObj.RCU_GETWAY = p.Gateway; tmpcfgObj.RCU_DNS_SERVER = p.DNS; tmpcfgObj.REMARK = p.Remark; tmpcfgObj.IPType = p.IPType; tmpcfgObj.RCU_CLOUD_SVR_PORT = p.ServerPort.ToString(); tmpcfgObj.IsDel = p.IsDeleted; tmpcfgObj.UPDATE_TIMEMARK = DateTime.Now; if (listcfgIds.ContainsKey(p.ID)) { tmpcfgObj.ID = listcfgIds[p.ID].mainID;//SQL sugar默认是按主键更新,所以主键要正确赋值 updatecfglist.Add(tmpcfgObj); } else { insertcfglist.Add(tmpcfgObj); } } //更新指定列。 只更新取到的那些列 var affectcfgResult = db.Updateable(updatecfglist).UpdateColumns(it => new { //it.ROOM_OLD_ID, //不用更新,这个在老表里面已经有正确的值了, it.RCU_ROOM, it.PRODUCT_CODE, it.FW_VER, it.CONFIG_VER, it.RCU_SUB_MASK, it.RCU_CLOUD_SVR_IP, it.RCU_CLOUD_SVR_PORT_MODE, it.RCU_LOCAL_IP, it.RCU_LOCAL_PORT, it.RCU_GETWAY, it.RCU_DNS_SERVER, it.REMARK, it.IPType, it.RCU_CLOUD_SVR_PORT, it.IsDel, it.UPDATE_TIMEMARK }) .ExecuteCommand(); //插入所有列 var iAffectcfgResult = db.Insertable(insertcfglist).ExecuteCommand(); #endregion //更新成功,记录这次更新时间。 itList[0].LAST_UPDATE_TIME = stTime; itList[0].LAST_LATESTREC_TIME = dtLastRecTime; db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME, it.LAST_LATESTREC_TIME }).ExecuteCommand(); #region 同步过来的 将房间表的 mac 地址插入 主机表 或者更新 List updaterculist = new List(); List insertrculist = new List(); try { //处理没有mac地址的信息 foreach (var item in hoteldata) { if (item.MAC==null || item.MAC.Length < 0) { item.MAC= " "; } } var macdata = hoteldata.Select(x => new { MAC = x.MAC.ToUpper(), x.RegisterDate }); //联系键: //那边的主键 b.id == 这边的 ROOM_OLD_ID var listrcuIds = db.Queryable() .Where(x => x.IsImport == 1) .Select(it => new { mainID = it.RCU_ID, outerMainID = it.MAC.ToUpper() }) .ToList() .GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); foreach (var item in macdata) { if (item.MAC.Length < 0) continue; TBL_RCU_BASIC_INFO tmprcuObj = new TBL_RCU_BASIC_INFO(); tmprcuObj.MAC = item.MAC; tmprcuObj.REGISTER_DATE = item.RegisterDate; if (listrcuIds.ContainsKey(item.MAC)) { tmprcuObj.RCU_ID = listrcuIds[item.MAC].mainID; updaterculist.Add(tmprcuObj); } else { tmprcuObj.IsImport = 1; insertrculist.Add(tmprcuObj); } } } catch (Exception ex) { throw; } //更新指定列。 只更新取到的那些列 var affectrcuResult = db.Updateable(updaterculist).UpdateColumns(it => new { //it.MAC, //不用更新,这个在老表里面已经有正确的值了, //it.IsImport//不用更新,这个在老表里面已经有正确的值了, it.REGISTER_DATE }) .ExecuteCommand(); //插入所有列 var iAffectrcuResult = db.Insertable(insertrculist).ExecuteCommand(); #endregion } } /// /// 同步季度 /// /// /// public static void SyncSeasonAll(SqlSugarScope db, DateTime stTime) { //1. 取到巫工数据库最新记录 //暂时使用永远更新的方式,因为只有4条记录,并且两边记录,格式,个数完全一样。 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select * from tb_Season b") ); //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].ID + "名字:" + hoteldata[i].NAME; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 季度表总是更新所有记录:" + retStr); //两个表完全一致,包括主键 var affectResult = db.Updateable(hoteldata).ExecuteCommand(); //更新成功,记录这次更新时间。 List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "TBL_SEASON") .ToList(); if (itList.Count > 0) { itList[0].LAST_UPDATE_TIME = stTime; //itList[0].LAST_LATESTREC_TIME = stTime; //巫工那边没有last update date字段 db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME }).ExecuteCommand(); } } } /// /// 同步酒店季度 /// /// /// public static void SyncHotelSeasonAll(SqlSugarScope db, DateTime stTime) { //1. 取到巫工数据库最新记录 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select * from tb_HotelSeason b") ); //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].ID + "酒店id:" + hoteldata[i].HOTELID; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 酒店季度表总是更新所有记录:" + retStr); //找出更新,插入的记录 List updatelist = new List(); List insertlist = new List(); //联系键: //那边的主键 ID == 这边的 ID var listIds = db.Queryable().Select(it => it.ID).ToList(); //表名实体 ,动态条件 foreach (var p in hoteldata) { if (listIds.Contains(p.ID)) { //p.ID ;//SQL sugar默认是按主键更新,所以主键要正确赋值 updatelist.Add(p); } else insertlist.Add(p); } //更新指定列。 只更新取到的那些列 var affectResult = db.Updateable(updatelist).UpdateColumns(it => new { //it.ID, //不用更新,这个再老表里面已经有正确的值了, it.MONTH1, it.MONTH2, it.MONTH3, it.MONTH4, it.MONTH5, it.MONTH6, it.MONTH7, it.MONTH8, it.MONTH9, it.MONTH10, it.MONTH11, it.MONTH12 }) .ExecuteCommand(); //插入 var iAffectResult = db.Insertable(insertlist).ExecuteCommand(); //更新成功,记录这次更新时间。 List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "TBL_HOTEL_SEASON") .ToList(); if (itList.Count > 0) { itList[0].LAST_UPDATE_TIME = stTime; //itList[0].LAST_LATESTREC_TIME = stTime; //巫工那边没有last update date字段 db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME }).ExecuteCommand(); } } } /// /// 同步人员信息 /// /// /// public static void SyncUserInfoAll(SqlSugarScope db, DateTime stTime) { //0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间 string lastRecTime = "2023-10-08"; List itList = db.Queryable() .Where(it => it.NEW_DB_TABLE_NAME == "authoritydb.userinfo") .ToList(); if (itList.Count > 0) { if (itList[0].LAST_LATESTREC_TIME == null) { lastRecTime = "2023-10-08"; } else { var timeRec = Convert.ToDateTime(itList[0].LAST_LATESTREC_TIME); if (timeRec.Year < 2023) { lastRecTime = "2023-10-08"; } else { lastRecTime = timeRec.ToString("yyyy-MM-dd HH:mm:ss.fff"); } } } //1. 取到巫工数据库最新记录 List hoteldata = DataTableHelper.ToEntities( SQLSERVER_Helper.GetDatatable(SQLSERVER_Helper.StrConnSqlServer, $@"select OldId = b.ID, HotelID = b.[HotelID], Uid = b.[Account], Pwd = b.[Password], Sex = case when b.[Sex]='男' then 0 when b.[Sex]='女' then 1 else 2 end, [Desc] = b.[Remark], IsValid = case when b.[ActiveIndicator]=1 then 0 else 1 end , CreateTime = b.[CreatedDate], EndTime = DATEADD(month,2,b.CreatedDate), HotelGroupID = b.[SysHotelGroupID], IsImport = 1, SyncTime = b.[Last_Modified_Time], IsDel = b.IsDeleted from tb_Sys_Users b where Last_Modified_Time > '{lastRecTime}' order by Last_Modified_Time asc;") ); //2. 从巫工数据库更新到我们的数据库 if (hoteldata.Count > 0) { //从SQL server数据库取到的最新记录的记录时间 //冲掉 //从时间戳表里面取的上次记录的时间 DateTime dtLastRecTime = Convert.ToDateTime(hoteldata[0].SyncTime); //记日志 string retStr = ""; for (int i = 0; i < hoteldata.Count; i++) { retStr += "编号:" + hoteldata[i].OldId + "名字:" + hoteldata[i].Uid; } DbLogServer.WriteDbLog($"同步[{GlobalSyncLockTest.gSyncSeq}], 用户表如下记录有更新:" + retStr); List updatelist = new List(); List insertlist = new List(); //联系键: //那边的主键 b.id == 这边的 OldId //var listidstump var listIds = SqlSugarBase.Db.Queryable() .Where(it => it.OldId != 0) .Select(it => new { mainID = it.Id, outerMainID = it.OldId }).ToList().GroupBy(X => X.outerMainID).Select(X => X.First()).ToDictionary(p => p.outerMainID); //.ToList(); //var listIds = listidstump.ToDictionary(p => p.outerMainID); foreach (var p in hoteldata) { if (listIds.ContainsKey(p.OldId)) { p.Id = listIds[p.OldId].mainID;//SQL sugar默认是按主键更新,所以主键要正确赋值 p.EndTime = DateTime.Now.AddYears(200); updatelist.Add(p); } else { p.Autho = 0; p.EndTime = DateTime.Now.AddYears(200); insertlist.Add(p); } } //更新指定列。 只更新取到的那些列 var affectResult = SqlSugarBase.Db.Updateable(updatelist).UpdateColumns(it => new { //it.OldId, //不用更新,这个再老表里面已经有正确的值了, it.HotelGroupID, it.HotelID, it.CreateTime, it.Desc, it.Sex, it.Uid, it.Pwd }) .ExecuteCommand(); //插入所有列 var iAffectResult = SqlSugarBase.Db.Insertable(insertlist).ExecuteCommand(); //更新成功,记录这次更新时间。 itList[0].LAST_UPDATE_TIME = stTime; itList[0].LAST_LATESTREC_TIME = dtLastRecTime; db.Updateable(itList[0]).UpdateColumns(it => new { it.LAST_UPDATE_TIME, it.LAST_LATESTREC_TIME }).ExecuteCommand(); } } public static void SyncOrgUserInfoAll(SqlSugarScope db, DateTime stTime) { //把这些记录值插入到组用户表里面 insert into OrgUsers (OrgId,UserId,CreateTime,CreatedBy) // 使用组1作为这些记录的组 select 1,Id,CURTIME(),'系统' // 用户表中那些不属于任何一组的用户。 where id not in // (用户属于某一组。select UserId from OrgUsers) //也就是将没有组的用户,都归拢到 组1 去。 string sqlorg = @"insert into OrgUsers (OrgId,UserId,CreateTime,CreatedBy) select 1,Id,CURTIME(),'系统' from UserInfo where id not in ( select UserId from OrgUsers )"; SqlSugarBase.Db.Ado.ExecuteCommand(sqlorg); } public static void ClearNotExistHotelAuto(SqlSugarScope db, DateTime stTime) { //如果酒店不存在了, string sqlRemove = "DELETE FROM UserAuthoes b WHERE b.HotelId not in (SELECT id from hotels )"; SqlSugarBase.Db.Ado.ExecuteCommand(sqlRemove); } public static void RecreateUserCache() { //清除所有 //清除redis里面下列的key: /* authority_autho_sysAuthorityListKey, authority_autho_sysHotelsListKey, authority_autho_sysGsInfoListKey, authority_autho_sysAuthoStatusTypeListKey, authority_autho_sysOrganizationListKey, authority_autho_sysOrgAuthorityListKey, authority_autho_sysOrgUserListKey, authority_autho_sysErrorInfoListKey, authority_autho_sysUserAuthoListKey, authority_autho_sysAppsListKey, authority_autho_sysUserInfoListKey, authority_autho_sysAppAuthoListKey, authority_autho_sysHoteldGroupsListKey, authority_autho_sysView_UOAListKey, authority_autho_sysView_UAListKey, authority_autho_sysDbLogListKey, authority_autho_sysHostsListKey, authority_autho_Appversions, authority_autho_sysMACLogs, authority_autho_sysALLqxListKey, authority_autho_sysQxIfoListKey, authority_autho_sysView_AppAuthoListKey */ // 清除缓存 CacheHelp.Removesys(null); //自动授权 SyncHotelServer.SyncAuthoOptimized(); } #endregion #region 同步用工具函数 #endregion } } public static class GlobalTest { public static bool isInProcessing = false; public static object testLock = new object(); public static DateTime lastStartTime = new DateTime(); } public class SyncHotelServer { //键值对存储酒店的最高就酒店组 如果存在就不需要查找 public static Dictionary> keyValues = new Dictionary>(); static object lockstr = ""; static DateTime? oldtime = null; /// /// 同步酒店组信息 /// public static bool SyncHotelGroups(string CreatedBy = "系统") { try { if (oldtime != null && DateTime.Now - oldtime < TimeSpan.FromSeconds(20)) return false; //排队测试,并抢flag. //只有第一个能通过测试,并抢到。 //后面的都不能通过测试。 lock (GlobalTest.testLock) { if (GlobalTest.isInProcessing) return false; GlobalTest.isInProcessing = true; } //20s只能刷新一次 if (oldtime != null && DateTime.Now - oldtime < TimeSpan.FromSeconds(20)) return false; GlobalTest.lastStartTime = DateTime.Now; oldtime = GlobalTest.lastStartTime; DbLogServer.WriteDbLog($"同步数据。。。开始{oldtime}"); string sql = "CALL porc_user ('{{table}}','{{table}}New')"; #region 同步酒店开始 //获取酒店的信息 var HotelList = HttpRequestHelp.GetHotelList(); //创建 临时表 string sqlclear = "drop table if exists HotelsNew;Create table HotelsNew(Select * from Hotels); truncate table HotelsNew;"; //db.Database.ExecuteSqlCommand(sqlclear); SqlSugarBase.Db.Ado.ExecuteCommand(sqlclear); oldtime = DateTime.Now; var datatable = GetTableSchema(HotelList.ToArray());//将传入的 Hotels 集合转换成 DataTable 返回 if (BulkToDB("HotelsNew", datatable)) //将 DataTable 写入数据库表 HotelsNew { var newsql = sql.Replace("{{table}}", "Hotels"); //调用存储过程porc_user,使用 HotelsNew 数据重新生成 Hotels 表 //db.Database.ExecuteSqlCommand(newsql); SqlSugarBase.Db.Ado.ExecuteCommand(newsql); }; #endregion 同步酒店结束 DbLogServer.WriteDbLog($"同步数据。。。1/4酒店同步完成"); #region 同步酒店组信息 var HotelGroups = HttpRequestHelp.GetHotelGroups(); //创建 临时表 // string sqlHotelGroups = "IF EXISTS(Select 1 From Sysobjects Where Name='HotelGroupsNew') begin DROP table HotelGroupsNew end ; select * into HotelGroupsNew from HotelGroups;"; // sqlHotelGroups += @" //truncate table HotelGroupsNew"; //db.Database.ExecuteSqlCommand(sqlHotelGroups); string sqlHotelGroups = "drop table if exists HotelGroupsNew;Create table HotelGroupsNew (Select * from HotelGroups);truncate table HotelGroupsNew;"; SqlSugarBase.Db.Ado.ExecuteCommand(sqlHotelGroups); oldtime = DateTime.Now; var datatableHotelGroups = GetTableSchema(HotelGroups.ToArray()); if (BulkToDB("HotelGroupsNew", datatableHotelGroups)) { //db.Database.ExecuteSqlCommand(sql.Replace("{{table}}", "HotelGroups")); SqlSugarBase.Db.Ado.ExecuteCommand(sql.Replace("{{table}}", "HotelGroups")); }; #endregion 同步酒店组信息完毕 DbLogServer.WriteDbLog($"同步数据。。。2/4酒店组同步完成"); #region 同步人员信息 var userinfodata = HttpRequestHelp.GetUserList(); //var OldId = db.UserInfos.Where(x => x.OldId != null || x.OldId > 0).Select(x => x.OldId).ToArray(); //更新数据 //var updata = userinfodata.Where(x => OldId.Contains(x.OldId)).ToList(); foreach (var userInfo in userinfodata) { UserInfo item = userInfo; //UserInfo userinfo = db1.UserInfos.FirstOrDefault(x => x.OldId == item.OldId || x.Uid == item.Uid); UserInfo userinfo = SqlSugarBase.Db.Queryable().First(x => x.OldId == item.OldId || x.Uid == item.Uid); try { if (userinfo != null) { userinfo.OldId = item.OldId; //userinfo.IsValid = item.IsValid; userinfo.HotelGroupID = item.HotelGroupID; userinfo.HotelID = item.HotelID; userinfo.CreateTime = item.CreateTime; userinfo.Desc = item.Desc; userinfo.Sex = item.Sex; userinfo.Uid = item.Uid; if (userinfo.Uid != item.Uid) { userinfo.Uid = item.Uid; } userinfo.Pwd = item.Pwd; //db1.Entry(userinfo).State = EntityState.Modified; SqlSugarBase.Db.Updateable(userinfo).ExecuteCommand(); } else { userinfo = item; //db.UserInfos.Add(userinfo); //db1.Entry(userinfo).State = EntityState.Added; SqlSugarBase.Db.Insertable(userinfo).ExecuteCommand(); } //db1.SaveChanges(); } catch (Exception ex) { Logs.WriteTimingUDPLog(ex.Message); Logs.WriteTimingUDPLog("" + userinfo.Id + userinfo.Uid); Logs.WriteTimingUDPLog("" + item.OldId + item.Uid); } //userinfo.EndTime = item.EndTime; } //添加数据 //var adddata = userinfodata.Where(x => !OldId.Contains(x.OldId)).ToList(); //db.UserInfos.AddRange(adddata); //db.SaveChanges(); string sqlorg = "insert into OrgUsers (OrgId,UserId,CreateTime,CreatedBy) select 1,Id,CURTIME(),'系统' from UserInfo where id not in (select UserId from OrgUsers)"; //db.Database.ExecuteSqlCommand(sqlorg); SqlSugarBase.Db.Ado.ExecuteCommand(sqlorg); #endregion 同步人员信息完毕 DbLogServer.WriteDbLog($"同步数据。。。3/4人员同步完成"); //清除所有 CacheHelp.Removesys(null); SyncHotelServer.SyncAutho(); DbLogServer.WriteDbLog($"同步数据。。。3.5/4清除缓存完成"); // 刷新权限信息数据 /*foreach (var item in cacheSysUserInfo) { UH_CENTER_Help.Sel_Hotel(item.Id, true); }*/ UH_CENTER_Help.Sel_Hotel_All(); DbLogServer.WriteDbLog($"同步数据。。。4/4UH_CENTER_Help.Sel_Hotel完成"); SqlSugarBase.Db.Ado.ExecuteCommand("DELETE FROM UserAuthoes b WHERE b.HotelId not in (SELECT id from hotels )"); oldtime = DateTime.Now; DbLogServer.WriteDbLog($"同步数据。。。完成{oldtime}"); //前面排队测试,并抢flag. //只有第一个能通过测试,并抢到。 //后面的都不能通过测试。 //所以只有一个能到这里。不用加锁。 if (GlobalTest.isInProcessing) GlobalTest.isInProcessing = false; } catch (Exception ex) { //触发异常在排队测试之后的,说明已经抢到flag,那么reset //前面排队测试,并抢flag. //只有第一个能通过测试,并抢到。 //后面的都不能通过测试。 //所以只有一个能到这里。不用加锁。 if (GlobalTest.isInProcessing) GlobalTest.isInProcessing = false; LogHelp.WriteExceptionLog(ex); return false; } finally { CacheHelp.Removesys(null); } return true; } /// /// 自动授权 /// public static void SyncAutho() { try { //取到Autho是1的人员(只有很少几个,也不少,有37个) var userinfo = CacheHelp.cacheSysUserInfo.Where(x => x.Autho == 1); //取到所有定义的权限 var appautho = CacheHelp.cacheSysAutho; List RES = new List(); List RES_ = new List(); foreach (var item in userinfo) { //得到这个用户的所有所属酒店。(递归所有酒店组) //结构如下: //用户在某个酒店上有几项权限 /* * [ * {"uid":812,"id":706,"sum":8}, * {"uid":812,"id":720,"sum":8}, * {"uid":812,"id":727,"sum":8} * ] * 用户812在酒店706有8项权限 * 用户812在酒店720有8项权限 * 用户812在酒店727有8项权限 */ RES_ = UH_CENTER_Help.Sel_Hotel(item.Id, true); //用户权限表里面,当前用户的权限。可能有好几条权限 var ua = CacheHelp.cacheSysUserAutho.Where(X => X.UserId == item.Id).ToList(); foreach (var tupm in RES_)//当前用户有权限的每一个酒店 { foreach (var tupm_ in appautho)//所有定义过的权限功能 { //在权限表里面找这样的用户,权限的酒店,功能 if (ua.FirstOrDefault(X => X.HotelId == tupm.id && X.AuthorityId == tupm_.Id) == null) { var tp = 5; int.TryParse(tupm_.AuthoStatusTypeId.Split(',').Where(x => x != "6" && x != "1").Last(), out tp); RES.Add(new UserAuthoes() { AuthorityId = tupm_.Id, CreatedBy = "自动授权", UserId = item.Id, HotelId = tupm.id, AuthotypeId = tp }); } } } } BulkToDB("UserAuthoes", GetTableSchema(RES.ToArray())); } catch (Exception ex) { //db.Database.ExecuteSqlCommand("drop table #TEMP"); Logs.WriteTimingUDPLog($"授权失败~{ex.Message}"); } } public static void SyncAuthoOptimized() { try { //1. 取到备用数据 Dictionary authDic = CacheHelp.cacheSysAutho.ToDictionary(p => p.Id); //Authority 取到权限的定义表 //View_UserInfo视图取到Autho是1的人员(只有很少几个,也不少,有37个) List usrViewList = CacheHelp.cacheSysUserInfo.Where(x => x.Autho == 1).ToList(); List uidList = usrViewList.Select(x => x.Id).ToList(); //UserAuthoes 取到授权表 List authList = SqlSugarBase.Db.Queryable() .Where(it => uidList.Contains(it.UserId)).ToList(); //酒店信息 List hotelList = SqlSugarBase.Db.Queryable().ToList(); //分成全权限,部分权限两种方式处理。 List superUserViewList = usrViewList.Where(it => it.HotelGroupID == 1 && it.IsImport != 0).ToList();// 导入的酒店组用户 List normalUserViewList = usrViewList.Where(it => it.HotelGroupID != 1 || it.IsImport == 0).ToList();// 非酒店组用户或者非导入用户 //2. 对每一个用户,每一个酒店,每一项权限,如果有漏的,收集。 //收集的权限插入到权限关系表里面去。 List insertAuth = new List(); //2.1. 全权限用户的处理 int curUsrID = -1; int curHotelId = -1; int curAuthId = -1; List fullHotelId = hotelList.Select(x => x.Id).ToList(); List existHotelId = new List(); List shouldAddId = new List();//shouldAddId = fullHotelId.Except(existHotelId).ToList(); //循环导入的酒店组用户 foreach (var dicUsritem in superUserViewList)//每一个用户 { curUsrID = dicUsritem.Id; //循环权限 foreach (var authDicItem in authDic)//每一项功能 { curAuthId = authDicItem.Key; List matchedHtlList = authList .Where(it => it.UserId == curUsrID && it.AuthorityId == curAuthId) .ToList(); existHotelId = matchedHtlList.Select(x => x.HotelId).ToList(); shouldAddId = fullHotelId.Except(existHotelId).ToList(); foreach (int htlid in shouldAddId) { var tp = 5; //权限取值 1禁止 2 只读 3读写 4管理 5允许 6拒绝 authostatustype 权限数值选项 表 //authority 权限表 AuthoStatusTypeId 权限数值选项 多个用逗号分隔 自动授权时排除 6 1 拒绝选项 给予 最大的权限 int.TryParse(authDicItem.Value.AuthoStatusTypeId.Split(',').Where(x => x != "6" && x != "1").Last(), out tp); insertAuth.Add(new UserAuthoes() { AuthorityId = curAuthId, CreatedBy = "自动授权", UserId = curUsrID, HotelId = htlid, AuthotypeId = tp }); } } } //2.2. 部分权限用户的处理 // 1.取到权限信息 // 2. 对每一个用户,每一项功能,检查是否分配到每一个酒店上 curUsrID = -1; curHotelId = -1; curAuthId = -1; fullHotelId = new List(); existHotelId = new List(); shouldAddId = new List(); Dictionary> normalUsrResult = UH_CENTER_Help.Sel_HotelOptimized(normalUserViewList); //非酒店组用户或者非导入用户 foreach (var dicUsritem in normalUsrResult)//每一个用户 { curUsrID = dicUsritem.Key; List curUsrHotelList = dicUsritem.Value; foreach (var authDicItem in authDic)//每一项功能 { curAuthId = authDicItem.Key; List matchedHtlList = authList .Where(it => it.UserId == curUsrID && it.AuthorityId == curAuthId) .ToList(); fullHotelId = curUsrHotelList.Select(x => x.id).ToList(); existHotelId = matchedHtlList.Select(x => x.HotelId).ToList(); shouldAddId = fullHotelId.Except(existHotelId).ToList(); foreach (int htlid in shouldAddId) { var tp = 5; int.TryParse(authDicItem.Value.AuthoStatusTypeId.Split(',').Where(x => x != "6" && x != "1").Last(), out tp); insertAuth.Add(new UserAuthoes() { AuthorityId = curAuthId, CreatedBy = "自动授权", UserId = curUsrID, HotelId = htlid, AuthotypeId = tp }); } }//每一项功能 }//每一个用户 // 3. 批量插入到用户权限表 UserAuthoes int insertRowCount = SqlSugarBase.Db.Insertable(insertAuth).ExecuteCommand(); //BulkToDB("UserAuthoes", GetTableSchema(RES.ToArray())); } catch (Exception ex) { //db.Database.ExecuteSqlCommand("drop table #TEMP"); Logs.WriteTimingUDPLog($"授权失败~{ex.Message}"); } finally { //清楚缓存 CacheHelp.Removesys(syskey.sysUserInfoListKey); CacheHelp.Removesys(syskey.sysAuthorityListKey); } } /// /// 根据酒店组查找下面所有酒店 /// /// /// public static List FindHotel(int? Groups = 1) { var key = int.Parse(Groups.ToString()); if (keyValues.ContainsKey(key)) { return keyValues[key]; } List res = new List(); //查找下面的直属酒店 res.AddRange(CacheHelp.cacheHotels.Where(x => x.GroupId == Groups).Select(x => x.Id)); //查找下面的酒店组 var Groupslist = CacheHelp.cacheHoteldGroups.Where(x => x.ParentId == Groups); foreach (var item in Groupslist) { res.AddRange(FindHotel(item.Id)); } keyValues.Add(key, res); return res; } /// /// 组织酒店 /// /// /// public static List FindGroup(Organization org) { return CacheHelp.cacheSysOrgAuthority.Where(x => x.OrgId == org.Id).Select(x => x.HotelId).Distinct().ToList(); } /// /// 酒店权限信息 酒店 权限数 /// /// /// public static List FindUHotelInfo(View_UserInfo Id) { try { return UH_CENTER_Help.Sel_Hotel(Id); } catch (Exception ex) { return new List(); } finally { if (Id != null && string.IsNullOrEmpty(Id.Hotel_Data)) CacheHelp.Removesys(CacheHelp.syskey.sysUserInfoListKey); } } /// /// 复制数据到表 /// /// 表名 /// 数据 private static bool BulkToDB(string Name, DataTable dt) { try { MySqlConnection sqlConn = new MySqlConnection(SqlSugarBase.sql); MySqlBulkCopy bulkCopy = new MySqlBulkCopy(sqlConn); bulkCopy.DestinationTableName = Name; //bulkCopy.BatchSize = dt.Rows.Count; try { sqlConn.Open(); if (dt != null && dt.Rows.Count != 0) bulkCopy.WriteToServer(dt); } catch (Exception ex) { LogHelp.WriteExceptionLog(ex); return false; } finally { sqlConn.Close(); //if (bulkCopy != null) //bulkCopy.Close(); } return true; } catch (Exception ex) { LogHelp.WriteExceptionLog(ex); return false; } } private static DataTable GetTableSchema(params T[] data) { DataTable dt = new DataTable(); T t = System.Activator.CreateInstance(); var Info = t.GetType().GetProperties(); foreach (var item in Info) { dt.Columns.AddRange(new DataColumn[]{ new DataColumn(item.Name,item.PropertyType)}); } foreach (var item in data) { var newrow = dt.NewRow(); foreach (var cel in Info) { newrow[cel.Name] = cel.GetValue(item); } dt.Rows.Add(newrow); } return dt; } } }