using System.Threading.Tasks; using ZhonTai.Admin.Domain.DictType; using ZhonTai.Admin.Domain.Dict; using ZhonTai.Admin.Domain.Api; using ZhonTai.Admin.Domain.Permission; using ZhonTai.Admin.Domain.User; using ZhonTai.Admin.Domain.Role; using ZhonTai.Admin.Domain.UserRole; using ZhonTai.Admin.Domain.RolePermission; using ZhonTai.Admin.Domain.Tenant; using ZhonTai.Admin.Domain.TenantPermission; using ZhonTai.Admin.Domain.PermissionApi; using ZhonTai.Admin.Domain.View; using ZhonTai.Admin.Core.Configs; using ZhonTai.Admin.Domain.Org; using ZhonTai.Admin.Domain.UserStaff; using ZhonTai.Admin.Core.Db.Data; using ZhonTai.Admin.Domain.UserOrg; using System.Linq; using ZhonTai.Common.Extensions; using System; using FreeSql; using ZhonTai.Admin.Core.Auth; using Mapster; using System.Collections.Generic; namespace ZhonTai.Admin.Repositories; public class CustomSyncData : SyncData, ISyncData { /// /// 初始化字典类型 /// /// /// /// /// private async Task InitDictTypeAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化字典 /// /// /// /// /// private async Task InitDictAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化用户 /// /// /// /// /// /// private async Task InitUserAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(isTenant, dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化用户员工 /// /// /// /// /// /// private async Task InitUserStaffAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(isTenant, dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化部门 /// /// /// /// /// /// private async Task InitOrgAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataTree = GetData(isTenant, dbConfig.SyncDataPath); var dataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray(); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化角色 /// /// /// /// /// /// private async Task InitRoleAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig, bool isTenant) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(isTenant, dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化接口 /// /// /// /// /// private async Task InitApiAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataTree = GetData(path: dbConfig.SyncDataPath); var dataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray(); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化视图 /// /// /// /// /// private async Task InitViewAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataTree = GetData(path: dbConfig.SyncDataPath); var dataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray(); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化权限 /// /// /// /// /// private async Task InitPermissionAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataTree = GetData(path: dbConfig.SyncDataPath); var dataList = dataTree.ToList().ToPlainList((a) => a.Childs).ToArray(); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化权限接口 /// /// /// /// /// private async Task InitPermissionApiAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var recordList = await rep.Where(a => rep.Select.WithMemory(dataList).Where(b => b.PermissionId == a.PermissionId && b.ApiId == a.ApiId).Any()).ToListAsync(); //新增 var insertDataList = dataList.Where(a => !(recordList.Where(b => a.PermissionId == b.PermissionId && a.ApiId == b.ApiId).Any())).ToList(); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 用户角色记录 /// /// /// record UserRoleRecord(long UserId, long RoleId); /// /// 初始化用户角色 /// /// /// /// /// private async Task InitUserRoleAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var userRoleRecordList = dataList.Adapt>(); var recordList = await rep.Where(a => rep.Orm.Select().WithMemory(userRoleRecordList).Where(b => b.UserId == a.UserId && b.RoleId == a.RoleId).Any()).ToListAsync(); //新增 var insertDataList = dataList.Where(a => !(recordList.Where(b => a.UserId == b.UserId && a.RoleId == b.RoleId).Any())).ToList(); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 用户部门记录 /// /// /// record UserOrgRecord(long UserId, long OrgId); /// /// 初始化用户部门 /// /// /// /// /// private async Task InitUserOrgAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var userOrgRecordList = dataList.Adapt>(); var recordList = await rep.Where(a => rep.Orm.Select().WithMemory(userOrgRecordList).Where(b => b.UserId == a.UserId && b.OrgId == a.OrgId).Any()).ToListAsync(); //新增 var insertDataList = dataList.Where(a => !(recordList.Where(b => a.UserId == b.UserId && a.OrgId == b.OrgId).Any())).ToList(); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 角色权限记录 /// /// /// record RolePermissionRecord(long RoleId, long PermissionId); /// /// 初始化角色权限 /// /// /// /// /// private async Task InitRolePermissionAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var rolePermissionRecordList = dataList.Adapt>(); var recordList = await rep.Where(a => rep.Orm.Select().WithMemory(rolePermissionRecordList).Where(b => b.RoleId == a.RoleId && b.PermissionId == a.PermissionId).Any()).ToListAsync(); //新增 var insertDataList = dataList.Where(a => !(recordList.Where(b => a.RoleId == b.RoleId && a.PermissionId == b.PermissionId).Any())).ToList(); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 初始化租户 /// /// /// /// /// private async Task InitTenantAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var ids = dataList.Select(e => e.Id).ToList(); var recordList = await rep.Where(a => ids.Contains(a.Id)).ToListAsync(); //新增 var recordIds = recordList.Select(a => a.Id).ToList(); var insertDataList = dataList.Where(a => !recordIds.Contains(a.Id)); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } //修改 if (!dbConfig.SysUpdateData && recordList?.Count > 0) { var updateDataList = dataList.Where(a => recordIds.Contains(a.Id)); await rep.UpdateAsync(updateDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 租户权限记录 /// /// /// record TenantPermissionRecord(long TenantId, long PermissionId); /// /// 初始化租户权限 /// /// /// /// /// private async Task InitTenantPermissionAsync(IFreeSql db, IRepositoryUnitOfWork unitOfWork, DbConfig dbConfig) { var tableName = GetTableName(); try { if (!IsSyncData(tableName, dbConfig)) { return; } var rep = db.GetRepository(); rep.UnitOfWork = unitOfWork; //数据列表 var dataList = GetData(path: dbConfig.SyncDataPath); if (!(dataList?.Length > 0)) { Console.WriteLine($"table: {tableName} import data []"); return; } //查询 var tenantPermissionRecordList = dataList.Adapt>(); var recordList = await rep.Where(a => rep.Orm.Select().WithMemory(tenantPermissionRecordList).Where(b => b.TenantId == a.TenantId && b.PermissionId == a.PermissionId).Any()).ToListAsync(); //新增 var insertDataList = dataList.Where(a => !(recordList.Where(b => a.TenantId == b.TenantId && a.PermissionId == b.PermissionId).Any())).ToList(); if (insertDataList.Any()) { await rep.InsertAsync(insertDataList); } Console.WriteLine($"table: {tableName} sync data succeed"); } catch (Exception ex) { var msg = $"table: {tableName} sync data failed.\n{ex.Message}"; Console.WriteLine(msg); throw new Exception(msg); } } /// /// 同步数据 /// /// /// /// /// public virtual async Task SyncDataAsync(IFreeSql db, DbConfig dbConfig = null, AppConfig appConfig = null) { using var unitOfWork = db.CreateUnitOfWork(); try { var isTenant = appConfig.Tenant; await InitDictTypeAsync(db, unitOfWork, dbConfig); await InitDictAsync(db, unitOfWork, dbConfig); await InitUserAsync(db, unitOfWork, dbConfig, isTenant); await InitUserStaffAsync(db, unitOfWork, dbConfig, isTenant); await InitOrgAsync(db, unitOfWork, dbConfig, isTenant); await InitRoleAsync(db, unitOfWork, dbConfig, isTenant); await InitApiAsync(db, unitOfWork, dbConfig); await InitViewAsync(db, unitOfWork, dbConfig); await InitPermissionAsync(db, unitOfWork, dbConfig); await InitPermissionApiAsync(db, unitOfWork, dbConfig); await InitUserRoleAsync(db, unitOfWork, dbConfig); await InitUserOrgAsync(db, unitOfWork, dbConfig); await InitRolePermissionAsync(db, unitOfWork, dbConfig); await InitTenantAsync(db, unitOfWork, dbConfig); await InitTenantPermissionAsync(db, unitOfWork, dbConfig); unitOfWork.Commit(); } catch (Exception) { unitOfWork.Rollback(); throw; } } }