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;
}
}
}