You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
8.6 KiB
C#

using Infrastructure;
using Infrastructure.Extensions;
using OpenAuth.App.Base;
using OpenAuth.App.Interface;
using OpenAuth.App.SysDatabaseLink.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Core;
using OpenAuth.Repository.Domain;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenAuth.App.BaseApp.Base;
namespace OpenAuth.App.SysDatabaseLink
{
public class SysDatabaseLinkApp : SqlSugarBaseApp<Repository.Domain.SysDatabaseLink, SugarDbContext>
{
public SysDatabaseLinkApp(ISugarUnitOfWork<SugarDbContext> unitWork, ISimpleClient<Repository.Domain.SysDatabaseLink> repository, IAuth auth) : base(unitWork, repository, auth)
{
}
/// <summary>
/// 获取树形数据
/// </summary>
/// <returns></returns>
public async Task<Response<List<TreeModel>>> LoadDataBaseLinkTree()
{
var list = await this.Repository.AsQueryable().Where(r => r.DeleteMark == 0).ToListAsync();
List<TreeModel> treelist = new List<TreeModel>();
Dictionary<string, List<TreeModel>> dic = new Dictionary<string, List<TreeModel>>();
TreeModel mynode = new TreeModel();
mynode.id = "hcsystemdb";
mynode.text = "本地数据库";
mynode.value = "hcsystemdb";
mynode.complete = true;
mynode.hasChildren = false;
treelist.Add(mynode);
foreach (var item in list)
{
TreeModel node = new TreeModel();
node.id = item.DBName;
node.text = item.DBAlias;
node.value = item.DBName;
node.complete = true;
node.hasChildren = false;
if (!dic.ContainsKey(item.ServerAddress))
{
TreeModel pnode = new TreeModel();
pnode.id = item.ServerAddress;
pnode.text = item.ServerAddress;
pnode.value = "hcServerAddress";
pnode.isexpand = true;
pnode.complete = true;
pnode.hasChildren = true;
pnode.ChildNodes = new List<TreeModel>();
treelist.Add(pnode);
dic.Add(item.ServerAddress, pnode.ChildNodes);
}
dic[item.ServerAddress].Add(node);
}
return new Response<List<TreeModel>>
{
Result = treelist
};
}
/// <summary>
/// 分页获取列表数据
/// </summary>
/// <param name="keyword"></param>
/// <param name="pageindex"></param>
/// <param name="pagesize"></param>
/// <returns></returns>
public async Task<Response<PageInfo<List<Repository.Domain.SysDatabaseLink>>>> LoadDataBaseInfo(string keyword, int pageindex, int pagesize)
{
//定义且实例化分页数据
RefAsync<int> totalCount = 0;
//数据查询并返回
var info = await this.Repository.AsQueryable()
.WhereIF(!string.IsNullOrEmpty(keyword), t => t.DBName.Contains(keyword))
.OrderBy(r=>r.DBName)
.ToPageListAsync(pageindex, pagesize, totalCount);
return new Response<PageInfo<List<Repository.Domain.SysDatabaseLink>>>
{
Result = new PageInfo<List<Repository.Domain.SysDatabaseLink>>
{
Items = info,
Total = totalCount
}
};
}
/// <summary>
/// 获取实体数据
/// </summary>
/// <param name="id">数据库连接主键</param>
/// <returns></returns>
public async Task<Response<Repository.Domain.SysDatabaseLink>> GetDataBaseForm(string id)
{
var info = await this.Repository.GetByIdAsync(id);
return new Response<Repository.Domain.SysDatabaseLink>
{
Result = info
};
}
/// <summary>
/// 添加数据库连接(新增、修改)
/// </summary>
/// <param name="keyValue">主键值</param>
/// <param name="databaseLinkEntity">数据库实体</param>
/// <returns></returns>
public async Task<Response<bool>> SaveBaseLinkEntity(string keyValue, Repository.Domain.SysDatabaseLink baseLink)
{
/*测试数据库连接串"******";*/
if (!string.IsNullOrEmpty(keyValue) && baseLink.DBConnection == "******")
{
baseLink.DBConnection = null;// 不更新连接串地址
}
else
{
var testRes = TestConnection(baseLink.DBConnection, baseLink.DBType);
if (testRes != "success")
{
return new Response<bool>
{
Result = false,
Message = "字符串连接失败"
};
}
}
var user = _auth.GetCurrentUser().User;
using (var uwo = base.UnitWork.CreateContext())
{
if (!string.IsNullOrEmpty(keyValue))
{
baseLink.DatabaseLinkId = keyValue;
baseLink.ModifyDate = DateTime.Now;
baseLink.ModifyUserId = user.Id.ToString();
baseLink.ModifyUsername = user.Name;
await uwo.SysDatabaseLink.UpdateAsync(baseLink);
}
else
{
baseLink.DatabaseLinkId = Guid.NewGuid().ToString();
baseLink.Createdate = DateTime.Now;
baseLink.DeleteMark = 0;
baseLink.EnabledMark = 1;
baseLink.CreateUserId = user.Id.ToString();
baseLink.CreateUsername = user.Name;
await uwo.SysDatabaseLink.InsertAsync(baseLink);
}
var flag = uwo.Commit();
return new Response<bool>
{
Result = flag,
Message = flag == true ? "操作成功" : "操作失败"
};
}
}
/// <summary>
/// 删除数据库连接
/// </summary>
/// <param name="id">主键</param>
/// <returns></returns>
public async Task<Response<bool>> DeleteBaseLink(string id)
{
using (var uwo = base.UnitWork.CreateContext())
{
await uwo.SysDatabaseLink.DeleteByIdAsync(id);
var flag = uwo.Commit();
return new Response<bool>
{
Result = flag,
Message = flag == true ? "操作成功" : "操作失败"
};
}
}
#region 扩展方法
/// <summary>
/// 测试数据数据库是否能连接成功
/// </summary>
/// <param name="connection">连接串</param>
/// <param name="dbType">数据库类型</param>
public string TestConnection(string connection, string dbType)
{
try
{
this.TestLinkClient(connection, dbType).BeginTran();
this.TestLinkClient(connection, dbType).CommitTran();
return "success";
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 测试连接串是否正确
/// </summary>
/// <param name="connection">连接串</param>
/// <param name="dbType">数据库类型</param>
/// <param name="id">主键</param>
/// <returns></returns>
public async Task<Response<bool>> TestDataBaseLink(string connection, string dbType, string id)
{
if (!string.IsNullOrEmpty(id) && connection == "******")
{
Repository.Domain.SysDatabaseLink entity = await this.Repository.GetByIdAsync(id);
if (entity != null)
{
connection = entity.DBConnection;
}
}
string res = TestConnection(connection, dbType);
var flag = false;
if (res == "success")
{
flag = true;
}
return new Response<bool>
{
Result = flag,
Message = flag == true ? "连接成功" : "连接失败"
};
}
#endregion
}
}