using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using HealthMonitor.Core.Aop; using HealthMonitor.Core.Cache; using HealthMonitor.Core.Dal; using HealthMonitor.Core.Dal.Factory; using HealthMonitor.Core.Operator; using HealthMonitor.Core.Query; using HealthMonitor.Core.Query.Extensions; using HealthMonitor.Util.Common; using HealthMonitor.Util.Common.Operator; using HealthMonitor.Util.Entities.Base; using HealthMonitor.Util.Models; using HealthMonitor.Util.QueryObjects; using HealthMonitor.WebApi.Filters; namespace HealthMonitor.WebApi.Controllers.Base { [Produces("application/json")] [Route("api/HealthMonitor/[controller]/[action]")] [ApiController] public abstract class HealthMonitorControllerBase<T> : DefaultControllerBase<T> where T : HealthMonitorEntityBase { //protected readonly GpsCardAccessorFactory _accessorFactory; //protected readonly IGpsCardDataAccessor _dataAccessor; //protected readonly IGpsCardOperatorManager _operatorGpsCardManager; protected readonly IHealthMonitorDataAccessor _dataAccessor; protected readonly IHealthMonitorOperatorManager _operatorManager; protected readonly IDurableEntityManager _durableManager; protected readonly ILogger _logger; protected HealthMonitorControllerBase( IHealthMonitorDataAccessor dataAccessor, //IGpsCardDataAccessor gpsCardDataAccessor, IHealthMonitorOperatorManager operatorGpsCardManager, IDurableEntityManager durableManager, ILogger logger) { _dataAccessor = dataAccessor; _operatorManager = operatorGpsCardManager; _durableManager = durableManager; _logger = logger; } /// <summary> /// 通过主键值,获取实体 /// </summary> /// <param name="id"></param> /// <param name="requestId">关联服务标识</param> /// <returns></returns> [HttpGet] //[QueryCacheInterceptor] public async virtual Task<T> GetById([Required] string id, [FromHeader] string requestId) { AssertModelStateIsValid(); //var key = EntityUtils.GetWrapKeyValue<T>(id); return await _dataAccessor.GetByIDAsync<T>(id); } /// <summary> /// 通过查询条件,获取符合条件的第一个实体 /// </summary> /// <param name="conditions"></param> /// <param name="requestId">关联服务标识</param> /// <returns></returns> [HttpPost] //[QueryCacheInterceptor] public async virtual Task<T?> GetFirst([FromBody] GeneralParam conditions, [FromHeader] string requestId) { AssertModelStateIsValid(); var parser = new QueryExpressionParser<T>(); var expression = parser.ParserConditions(conditions.Filters!); var list = await _dataAccessor.GetMany(expression).OrderConditions(conditions.OrderBys!).Take(1).ToListAsync(); return list.Count > 0 ? list[0] : null; } /// <summary> /// 获取实体列表(只提取符合条件的前100条记录) /// </summary> /// <param name="conditions"></param> /// <param name="requestId">关联服务标识</param> /// <returns></returns> [HttpPost] //[QueryCacheInterceptor] public async virtual Task<PageData<T>> GetPageList([FromBody] Paging page, [FromHeader] string requestId) { AssertModelStateIsValid(); var all = _dataAccessor.GetAll<T>(); var list = await all.Skip((page.CurPage - 1) * page.PageSize).Take(page.PageSize).ToListAsync(); int totals = await all.CountAsync(); return new PageData<T> { Totals= totals, Rows =list}; } [HttpPost] public async virtual Task<IEnumerable<T>> GetList([FromBody] GeneralParam conditions, [FromHeader] string requestId) { AssertModelStateIsValid(); var parser = new QueryExpressionParser<T>(); var expression = parser.ParserConditions(conditions.Filters!); var list = await _dataAccessor.GetMany(expression).OrderConditions(conditions.OrderBys!).Take(100).ToListAsync(); return list; } [HttpPost] public async virtual Task<IEnumerable<T>> GetPages([FromBody] GeneralParam conditions, [FromHeader] string requestId) { AssertModelStateIsValid(); //var parser = new QueryExpressionParser<T>(); //var expression = parser.ParserConditions(conditions.Filters!); // var aa = await _dataAccessor.GetPageListAsync(1,1, expression, conditions.OrderBys!); //var parser = new QueryExpressionParser<T>(); //var expression = parser.ParserConditions(conditions.Filters!); var pageSize = 1; var pageIdx = 1; //var bb = await _dataAccessor.OrderBy(conditions.OrderBys!).Skip(pageSize * (pageIdx - 1)).Take(pageSize); var list = await _dataAccessor.GetAll<T>().OrderConditions(conditions.OrderBys!).Skip(pageSize * (pageIdx - 1)).Take(pageSize).ToListAsync(); return list; } /// <summary> /// Insert实体 /// </summary> /// <param name="model"></param> /// <param name="requestId">关联服务标识</param> [HttpPost] //[InsertCacheInterceptor] public virtual void Add([FromBody] T model, [FromHeader] string requestId) { AssertModelStateIsValid(model); _dataAccessor.Add(model); _dataAccessor.Save(); } /// <summary> /// Update实体 /// </summary> /// <param name="model"></param> /// <param name="requestId">关联服务标识</param> [HttpPut] //[UpdateCacheInterceptor] public virtual void Update([FromBody] T model, [FromHeader] string requestId) { AssertModelStateIsValid(model); //_dataAccessor.GetByIDAsync<T>(model.GetPrimaryKey()); _dataAccessor.Update(model); _dataAccessor.Save(); //var item = new OperateCacheItem //{ // Type = DelayOperateTypeEnum.Update, // CreateTime = DateTime.Now, // EntityType = typeof(T), // JsonData = JsonConvert.SerializeObject(model) //}; //_operatorManager.Append(model.GetRequiredUniqueKey(), item); } /// <summary> /// Delete实体 /// </summary> /// <param name="model"></param> /// <param name="requestId">关联服务标识</param> [HttpDelete] //[DeleteCacheInterceptor] public virtual void Delete([FromBody] T model, [FromHeader] string requestId) { //删除操作不需要验证模型的有效性 //AssertModelStateIsValid(); _dataAccessor.Delete(model); _dataAccessor.Save(); //var item = new OperateCacheItem //{ // Type = DelayOperateTypeEnum.Delete, // CreateTime = DateTime.Now, // EntityType = typeof(T), // JsonData = JsonConvert.SerializeObject(model), //}; //_operatorManager.Append(model.GetRequiredUniqueKey(), item); } } }