using HealthMonitor.Core.Aop; using HealthMonitor.Core.Cache; using HealthMonitor.Core.Dal; using HealthMonitor.Core.Operator; using HealthMonitor.Core.Query; using HealthMonitor.Core.Query.Extensions; using HealthMonitor.Util.Common.Operator; using HealthMonitor.Util.Entities.Base; using HealthMonitor.Util.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; namespace HealthMonitor.WebApi.Controllers.Base { [Produces("application/json")] [Route("api/GpsCard/[controller]/[action]")] [ApiController] public abstract class GpsCardControllerBase<T> : DefaultControllerBase<T> where T : GpsCardEntityBase { //protected readonly GpsCardAccessorFactory _accessorFactory; protected readonly IGpsCardDataAccessor _dataAccessor; protected readonly IGpsCardOperatorManager _operatorManager; protected readonly IDurableEntityManager _durableManager; protected readonly ILogger _logger; protected GpsCardControllerBase( IGpsCardDataAccessor dataAccessor, IGpsCardOperatorManager operatorManager, IDurableEntityManager durableManager, ILogger logger) { _dataAccessor=dataAccessor; _operatorManager = operatorManager; _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<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; } /// <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); var item = new OperateCacheItem { Type = DelayOperateTypeEnum.Insert, CreateTime = DateTime.Now, EntityType = typeof(T), JsonData = JsonConvert.SerializeObject(model) }; _operatorManager.Append(model.GetUniqueKey(), item); } /// <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); 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(); var item = new OperateCacheItem { Type = DelayOperateTypeEnum.Delete, CreateTime = DateTime.Now, EntityType = typeof(T), JsonData = JsonConvert.SerializeObject(model), }; _operatorManager.Append(model.GetRequiredUniqueKey(), item); } } }