using System.Reflection; namespace Tiobon.Core.Controllers; /// /// 增删改查基础服务 /// /// /// /// /// /// public class BaseController : Controller { #region 初始化 protected IServiceBase _service; /// /// 初始化 (注入) /// public BaseController(IServiceBase service) { _service = service; } #endregion #region 基础接口 #region 查询 /// /// 根据条件查询数据 /// /// 条件 /// [HttpPost, Route("Query")] public virtual async Task> QueryByFilter([FromFilter] QueryFilter filter) { var data = (await InvokeServiceAsync("QueryFilterPage", [filter])) as ServicePageResult; return data; } public static T ConvertTo(object input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } // 当T是Nullable类型时,需要获取其基础类型 Type targetType = typeof(T); Type nullableType = Nullable.GetUnderlyingType(targetType); targetType = nullableType ?? targetType; // 检查input是否已经是T类型 if (input is T) { return (T)input; } // 尝试转换 try { return (T)Convert.ChangeType(input, targetType); } catch (InvalidCastException) { throw new InvalidOperationException($"Cannot convert an instance of type {input.GetType().Name} to type {typeof(T).Name}."); } } /// /// 根据Id查询数据 /// /// 主键ID /// [HttpPost("Query/{Id}")] public virtual async Task> QueryById(long Id) { var entity1 = await InvokeServiceAsync("QueryById", [Id]); var entity = ConvertTo(entity1); if (entity is null) return Failed("获取失败"); else return Success(entity, "获取成功"); } #endregion #region 新增 /// /// 新增数据 /// /// /// [HttpPost("Insert")] public virtual async Task> Insert([FromBody] TInsertDto insertModel) { var data = Success(null, "新增成功"); var id = Convert.ToInt64(await InvokeServiceAsync("Add", [insertModel])); data.Success = id > 0; if (data.Success) data.Data = id.ObjToString(); else return Failed("新增失败"); return data; } /// /// 批量新增数据 /// /// [HttpPost, Route("BulkInsert")] public virtual async Task>> BulkInsert([FromBody] List insertModels) { var data = Success>(null, "新增成功"); var ids = await InvokeServiceAsync("Add", [insertModels]) as List; data.Success = ids.Any(); if (data.Success) data.Data = ids; else return Failed>("新增失败"); return data; } #endregion #region 更新 /// /// 更新数据 /// /// 主键ID /// /// [HttpPost("Update/{Id}")] public virtual async Task Put(long Id, [FromBody] TEditDto editModel) { var data = Success("更新成功"); var flag = Convert.ToBoolean(await InvokeServiceAsync("Update", [Id, editModel])); if (!flag) return Failed("更新失败"); return data; } /// /// 批量更新数据 /// /// [HttpPost, Route("BulkUpdate")] public virtual async Task BulkUpdate([FromBody] Dictionary editModels) { var data = Success("更新成功"); var flag = Convert.ToBoolean(await InvokeServiceAsync("Update", [editModels])); if (!flag) return Failed("更新失败"); return data; } #endregion #region 删除 /// /// 删除数据 /// /// 主键ID /// [HttpPost("Delete/{Id}")] public virtual async Task Delete(long Id) { var data = Success("删除成功"); var isExist = Convert.ToBoolean(await InvokeServiceAsync("AnyAsync", [Id])); if (!isExist) return Failed("删除失败"); data.Success = Convert.ToBoolean(await InvokeServiceAsync("DeleteById1", [Id])); if (!data.Success) return Failed("删除失败"); return data; } /// /// 批量删除数据 /// /// 主键IDs /// [HttpPost, Route("BulkDelete")] public virtual async Task BulkDelete([FromBody] long[] Ids) { var data = Success("删除成功"); data.Success = Convert.ToBoolean(await InvokeServiceAsync("DeleteByIds1", [Ids])); if (!data.Success) return Failed("删除失败"); return data; } #endregion #endregion ///// ///// 反射调用service方法 ///// ///// ///// ///// //[NonAction] //private object InvokeService(string methodName, object[] parameters) //{ // return _service.GetType().GetMethod(methodName).Invoke(_service, parameters); //} ///// ///// 反射调用service方法 ///// ///// ///// 为要调用重载的方法参数类型:new Type[] { typeof(SaveDataModel) ///// ///// //[NonAction] //private object InvokeService(string methodName, Type[] types, object[] parameters) => _service.GetType().GetMethod(methodName, types).Invoke(_service, parameters); [NonAction] private async Task InvokeServiceAsync(string methodName, object[] parameters) { var task = _service.GetType().InvokeMember(methodName, BindingFlags.InvokeMethod, null, _service, parameters) as Task; if (task != null) await task; var result = task?.GetType().GetProperty("Result")?.GetValue(task); return result; } [NonAction] public ServiceResult Success(T data, string message = "成功") { return new ServiceResult() { Success = true, Message = message, Data = data, }; } // [NonAction] //public ServiceResult Success(T data, string msg = "成功",bool success = true) //{ // return new ServiceResult() // { // success = success, // msg = msg, // response = data, // }; //} [NonAction] public ServiceResult Success(string message = "成功") { return new ServiceResult() { Success = true, Message = message, Data = null, }; } [NonAction] public ServiceResult Failed(string message = "失败", int status = 500) { return new ServiceResult() { Success = false, Status = status, Message = message, Data = null, }; } [NonAction] public ServiceResult Failed(string message = "失败", int status = 500) { return new ServiceResult() { Success = false, Status = status, Message = message, Data = default, }; } [NonAction] public ServiceResult> SuccessPage(int page, int dataCount, int pageSize, List data, int pageCount, string message = "获取成功") { return new ServiceResult>() { Success = true, Message = message, Data = new PageModel(page, dataCount, pageSize, data) }; } [NonAction] public ServiceResult> SuccessPage(PageModel pageModel, string message = "获取成功") { return new ServiceResult>() { Success = true, Message = message, Data = pageModel }; } }