1753 lines
81 KiB
C#
1753 lines
81 KiB
C#
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<View_UserInfo> 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<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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<TBL_HOTEL_BASIC_INFO> hoteldata = DataTableHelper.ToEntities<TBL_HOTEL_BASIC_INFO>(
|
||
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<TBL_HOTEL_BASIC_INFO> updatelist = new List<TBL_HOTEL_BASIC_INFO>();
|
||
List<TBL_HOTEL_BASIC_INFO> insertlist = new List<TBL_HOTEL_BASIC_INFO>();
|
||
|
||
//联系键:
|
||
//那边的主键b.id == 这边的IDOLD
|
||
|
||
|
||
//使用数据库阿里云服务器 blv_rcu_db 数据库 tbl_hotel_basic_info表
|
||
var listIds = db.Queryable<TBL_HOTEL_BASIC_INFO>()
|
||
.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<Hotels> updateauthlist = new List<Hotels>();
|
||
List<Hotels> insertauthlist = new List<Hotels>();
|
||
|
||
//联系键:
|
||
//那边的主键b.id == 这边的IDOLD
|
||
var listauthIds = SqlSugarBase.Db.Queryable<Hotels>()
|
||
.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<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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<TBL_HOTEL_GROUP_INFO> hoteldata = DataTableHelper.ToEntities<TBL_HOTEL_GROUP_INFO>(
|
||
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<TBL_HOTEL_GROUP_INFO> updatelist = new List<TBL_HOTEL_GROUP_INFO>();
|
||
List<TBL_HOTEL_GROUP_INFO> insertlist = new List<TBL_HOTEL_GROUP_INFO>();
|
||
|
||
//联系键:
|
||
//那边的主键 b.id == 这边的 HOTEL_GROUP_OLD_ID
|
||
//使用数据库阿里云服务器 blv_rcu_db 数据库 tbl_hotel_group_info表
|
||
var listIds = db.Queryable<TBL_HOTEL_GROUP_INFO>()
|
||
.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<HotelGroups> updateauthlist = new List<HotelGroups>();
|
||
List<HotelGroups> insertauthlist = new List<HotelGroups>();
|
||
|
||
//联系键:
|
||
//那边的主键b.id == 这边的ID
|
||
|
||
//阿里云服务器 AuthorityDB数据库 hotelgroups表
|
||
var listauthIds = SqlSugarBase.Db.Queryable<HotelGroups>()
|
||
.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();
|
||
}
|
||
|
||
}
|
||
/// <summary>
|
||
/// 同步房型
|
||
/// </summary>
|
||
/// <param name="db"></param>
|
||
/// <param name="stTime"></param>
|
||
public static void SyncRoomTypeAll(SqlSugarScope db, DateTime stTime)
|
||
{
|
||
//0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间
|
||
string lastRecTime = "2023-10-08";
|
||
List<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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<TBL_ROOM_TYPE_LIST> hoteldata = DataTableHelper.ToEntities<TBL_ROOM_TYPE_LIST>(
|
||
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<TBL_ROOM_TYPE_LIST> updatelist = new List<TBL_ROOM_TYPE_LIST>();
|
||
List<TBL_ROOM_TYPE_LIST> insertlist = new List<TBL_ROOM_TYPE_LIST>();
|
||
|
||
//联系键:
|
||
//那边的主键 b.id == 这边的 ROOM_TYPE_OLD_ID
|
||
var listIds = db.Queryable<TBL_ROOM_TYPE_LIST>()
|
||
.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表
|
||
/// <summary>
|
||
/// 同步主机
|
||
/// </summary>
|
||
/// <param name="db"></param>
|
||
/// <param name="stTime"></param>
|
||
public static void SyncMainDeviceAll(SqlSugarScope db, DateTime stTime)
|
||
{
|
||
// 主机表,对应这边房间表
|
||
//0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间
|
||
string lastRecTime = "2023-10-08";
|
||
List<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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<Host_> hoteldata = DataTableHelper.ToEntities<Host_>(
|
||
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<TBL_ROOM_BASIC_INFO> updatelist = new List<TBL_ROOM_BASIC_INFO>();
|
||
List<TBL_ROOM_BASIC_INFO> insertlist = new List<TBL_ROOM_BASIC_INFO>();
|
||
//联系键:
|
||
//那边的主键 b.id == 这边的 ROOM_OLD_ID
|
||
|
||
//var rooms
|
||
|
||
|
||
var listIds = db.Queryable<TBL_ROOM_BASIC_INFO>()
|
||
.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<TBL_ROOM_SET_CONFIG> updatecfglist = new List<TBL_ROOM_SET_CONFIG>();
|
||
List<TBL_ROOM_SET_CONFIG> insertcfglist = new List<TBL_ROOM_SET_CONFIG>();
|
||
//联系键:
|
||
//那边的主键 b.id == 这边的 ROOM_OLD_ID
|
||
//var listcfgidstupm
|
||
var listcfgIds = db.Queryable<TBL_ROOM_SET_CONFIG>()
|
||
.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<TBL_RCU_BASIC_INFO> updaterculist = new List<TBL_RCU_BASIC_INFO>();
|
||
List<TBL_RCU_BASIC_INFO> insertrculist = new List<TBL_RCU_BASIC_INFO>();
|
||
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<TBL_RCU_BASIC_INFO>()
|
||
.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
|
||
|
||
}
|
||
|
||
}
|
||
/// <summary>
|
||
/// 同步季度
|
||
/// </summary>
|
||
/// <param name="db"></param>
|
||
/// <param name="stTime"></param>
|
||
public static void SyncSeasonAll(SqlSugarScope db, DateTime stTime)
|
||
{
|
||
//1. 取到巫工数据库最新记录
|
||
//暂时使用永远更新的方式,因为只有4条记录,并且两边记录,格式,个数完全一样。
|
||
List<TBL_SEASON> hoteldata = DataTableHelper.ToEntities<TBL_SEASON>(
|
||
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<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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();
|
||
}
|
||
}
|
||
|
||
}
|
||
/// <summary>
|
||
/// 同步酒店季度
|
||
/// </summary>
|
||
/// <param name="db"></param>
|
||
/// <param name="stTime"></param>
|
||
public static void SyncHotelSeasonAll(SqlSugarScope db, DateTime stTime)
|
||
{
|
||
//1. 取到巫工数据库最新记录
|
||
List<TBL_HOTEL_SEASON> hoteldata = DataTableHelper.ToEntities<TBL_HOTEL_SEASON>(
|
||
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<TBL_HOTEL_SEASON> updatelist = new List<TBL_HOTEL_SEASON>();
|
||
List<TBL_HOTEL_SEASON> insertlist = new List<TBL_HOTEL_SEASON>();
|
||
|
||
//联系键:
|
||
//那边的主键 ID == 这边的 ID
|
||
var listIds = db.Queryable<TBL_HOTEL_SEASON>().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<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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();
|
||
}
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 同步人员信息
|
||
/// </summary>
|
||
/// <param name="db"></param>
|
||
/// <param name="stTime"></param>
|
||
public static void SyncUserInfoAll(SqlSugarScope db, DateTime stTime)
|
||
{
|
||
//0. 取到酒店,酒店组,房型,主机,季度,酒店季度,用户信息表上次最晚记录的记录自己的更新时间
|
||
string lastRecTime = "2023-10-08";
|
||
List<new_table_update_time_mark> itList = db.Queryable<new_table_update_time_mark>()
|
||
.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<UserInfo> hoteldata = DataTableHelper.ToEntities<UserInfo>(
|
||
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<UserInfo> updatelist = new List<UserInfo>();
|
||
List<UserInfo> insertlist = new List<UserInfo>();
|
||
|
||
//联系键:
|
||
//那边的主键 b.id == 这边的 OldId
|
||
//var listidstump
|
||
var listIds = SqlSugarBase.Db.Queryable<UserInfo>()
|
||
.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<int, List<int>> keyValues = new Dictionary<int, List<int>>();
|
||
static object lockstr = "";
|
||
static DateTime? oldtime = null;
|
||
/// <summary>
|
||
/// 同步酒店组信息
|
||
/// </summary>
|
||
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<Hotels>(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>(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<UserInfo>().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;
|
||
}
|
||
/// <summary>
|
||
/// 自动授权
|
||
/// </summary>
|
||
public static void SyncAutho()
|
||
{
|
||
try
|
||
{
|
||
//取到Autho是1的人员(只有很少几个,也不少,有37个)
|
||
var userinfo = CacheHelp.cacheSysUserInfo.Where(x => x.Autho == 1);
|
||
//取到所有定义的权限
|
||
var appautho = CacheHelp.cacheSysAutho;
|
||
|
||
List<UserAuthoes> RES = new List<UserAuthoes>();
|
||
List<QxIfo> RES_ = new List<QxIfo>();
|
||
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<int, Authority> authDic = CacheHelp.cacheSysAutho.ToDictionary(p => p.Id); //Authority 取到权限的定义表
|
||
//View_UserInfo视图取到Autho是1的人员(只有很少几个,也不少,有37个)
|
||
List<View_UserInfo> usrViewList = CacheHelp.cacheSysUserInfo.Where(x => x.Autho == 1).ToList();
|
||
List<int> uidList = usrViewList.Select(x => x.Id).ToList();
|
||
//UserAuthoes 取到授权表
|
||
List<UserAuthoes> authList = SqlSugarBase.Db.Queryable<UserAuthoes>()
|
||
.Where(it => uidList.Contains(it.UserId)).ToList();
|
||
//酒店信息
|
||
List<Hotels> hotelList = SqlSugarBase.Db.Queryable<Hotels>().ToList();
|
||
|
||
//分成全权限,部分权限两种方式处理。
|
||
List<View_UserInfo> superUserViewList = usrViewList.Where(it => it.HotelGroupID == 1 && it.IsImport != 0).ToList();// 导入的酒店组用户
|
||
List<View_UserInfo> normalUserViewList = usrViewList.Where(it => it.HotelGroupID != 1 || it.IsImport == 0).ToList();// 非酒店组用户或者非导入用户
|
||
|
||
//2. 对每一个用户,每一个酒店,每一项权限,如果有漏的,收集。
|
||
//收集的权限插入到权限关系表里面去。
|
||
|
||
List<UserAuthoes> insertAuth = new List<UserAuthoes>();
|
||
|
||
//2.1. 全权限用户的处理
|
||
int curUsrID = -1;
|
||
int curHotelId = -1;
|
||
int curAuthId = -1;
|
||
List<int> fullHotelId = hotelList.Select(x => x.Id).ToList();
|
||
List<int> existHotelId = new List<int>();
|
||
List<int> shouldAddId = new List<int>();//shouldAddId = fullHotelId.Except(existHotelId).ToList();
|
||
//循环导入的酒店组用户
|
||
foreach (var dicUsritem in superUserViewList)//每一个用户
|
||
{
|
||
curUsrID = dicUsritem.Id;
|
||
//循环权限
|
||
foreach (var authDicItem in authDic)//每一项功能
|
||
{
|
||
curAuthId = authDicItem.Key;
|
||
List<UserAuthoes> 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<int>();
|
||
existHotelId = new List<int>();
|
||
shouldAddId = new List<int>();
|
||
Dictionary<int, List<QxIfo>> normalUsrResult = UH_CENTER_Help.Sel_HotelOptimized(normalUserViewList);
|
||
//非酒店组用户或者非导入用户
|
||
foreach (var dicUsritem in normalUsrResult)//每一个用户
|
||
{
|
||
curUsrID = dicUsritem.Key;
|
||
List<QxIfo> curUsrHotelList = dicUsritem.Value;
|
||
foreach (var authDicItem in authDic)//每一项功能
|
||
{
|
||
curAuthId = authDicItem.Key;
|
||
List<UserAuthoes> 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);
|
||
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 根据酒店组查找下面所有酒店
|
||
/// </summary>
|
||
/// <param name="Groups"></param>
|
||
/// <returns></returns>
|
||
public static List<int> FindHotel(int? Groups = 1)
|
||
{
|
||
var key = int.Parse(Groups.ToString());
|
||
if (keyValues.ContainsKey(key))
|
||
{
|
||
return keyValues[key];
|
||
}
|
||
List<int> res = new List<int>();
|
||
//查找下面的直属酒店
|
||
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;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 组织酒店
|
||
/// </summary>
|
||
/// <param name="Groups"></param>
|
||
/// <returns></returns>
|
||
public static List<int> FindGroup(Organization org)
|
||
{
|
||
return CacheHelp.cacheSysOrgAuthority.Where(x => x.OrgId == org.Id).Select(x => x.HotelId).Distinct().ToList();
|
||
}
|
||
/// <summary>
|
||
/// 酒店权限信息 酒店 权限数
|
||
/// </summary>
|
||
/// <param name="u"></param>
|
||
/// <returns></returns>
|
||
public static List<QxIfo> FindUHotelInfo(View_UserInfo Id)
|
||
{
|
||
try
|
||
{
|
||
return UH_CENTER_Help.Sel_Hotel(Id);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return new List<QxIfo>();
|
||
}
|
||
finally
|
||
{
|
||
if (Id != null && string.IsNullOrEmpty(Id.Hotel_Data))
|
||
CacheHelp.Removesys(CacheHelp.syskey.sysUserInfoListKey);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 复制数据到表
|
||
/// </summary>
|
||
/// <param name="Name">表名</param>
|
||
/// <param name="dt">数据</param>
|
||
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<T>(params T[] data)
|
||
{
|
||
DataTable dt = new DataTable();
|
||
T t = System.Activator.CreateInstance<T>();
|
||
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;
|
||
}
|
||
}
|
||
}
|