428 lines
19 KiB
C#
428 lines
19 KiB
C#
|
|
using APT.BaseData.Domain.Enums;
|
|||
|
|
using APT.BaseData.Domain.IServices;
|
|||
|
|
using APT.Infrastructure.Core;
|
|||
|
|
using APT.BaseData.Domain.ApiModel.EX;
|
|||
|
|
using APT.BaseData.Domain.ApiModel.FM;
|
|||
|
|
using APT.BaseData.Domain.IServices.FM;
|
|||
|
|
using Microsoft.AspNetCore.Mvc;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.ComponentModel;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Linq.Expressions;
|
|||
|
|
using System.Reflection;
|
|||
|
|
using System.Text;
|
|||
|
|
using APT.BaseData.Domain.Enums.PF;
|
|||
|
|
using APT.BaseData.Domain.Entities;
|
|||
|
|
using APT.Utility;
|
|||
|
|
using APT.Infrastructure.Api;
|
|||
|
|
|
|||
|
|
namespace APT.PF.WebApi.Controllers.Api.EX
|
|||
|
|
{
|
|||
|
|
[Route("api/PF/Extend")]
|
|||
|
|
public class ExtendController : CommonApiController
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 根据ID获得实体数据
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="name"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpGet, Route("Enum")]
|
|||
|
|
public JsonActionResult<string> Enum(string name)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<string>(() =>
|
|||
|
|
{
|
|||
|
|
return APT.Utility.DataHelper.EnumToString(name);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 根据枚举名称 获取 某个枚举
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="name"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpGet, Route("GetEnum")]
|
|||
|
|
public JsonActionResult<dynamic> GetEnum(string name)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<dynamic>(() =>
|
|||
|
|
{
|
|||
|
|
return APT.Utility.DataHelper.GetEnum(name);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 获取所有枚举信息
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpGet, Route("GetAllEnum")]
|
|||
|
|
public JsonActionResult<IEnumerable<APT.Utility.EnumInfo>> GetAllEnum()
|
|||
|
|
{
|
|||
|
|
return SafeExecute<IEnumerable<APT.Utility.EnumInfo>>(() =>
|
|||
|
|
{
|
|||
|
|
return APT.Utility.DataHelper.GetAllEnums();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[HttpPost, Route("EntityOrderPaged")]
|
|||
|
|
public PagedActionResult<EntityModel> EntityOrderPaged([FromBody] KeywordPageFilter pageFilter)
|
|||
|
|
{
|
|||
|
|
return SafeGetPagedData<EntityModel>(ret =>
|
|||
|
|
{
|
|||
|
|
var formService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IPFFormService>();
|
|||
|
|
var files = System.IO.Directory.GetFiles(System.AppContext.BaseDirectory, "*.Domain.dll");
|
|||
|
|
var tempFiles = System.IO.Directory.GetFiles(System.AppContext.BaseDirectory, "APT.Infrastructure.Core.dll");
|
|||
|
|
if (files == null)
|
|||
|
|
files = tempFiles;
|
|||
|
|
else if (tempFiles != null)
|
|||
|
|
{
|
|||
|
|
var temps = files.ToList();
|
|||
|
|
temps.AddRange(tempFiles);
|
|||
|
|
files = temps.ToArray();
|
|||
|
|
}
|
|||
|
|
if (files == null || !files.Any()) return;
|
|||
|
|
List<EntityModel> list = new List<EntityModel>();
|
|||
|
|
foreach (var file in files)
|
|||
|
|
{
|
|||
|
|
var assembly = Assembly.LoadFrom(file);
|
|||
|
|
if (assembly == null) continue;
|
|||
|
|
foreach (var t in assembly.ExportedTypes)
|
|||
|
|
{
|
|||
|
|
var baseType = t.BaseType;
|
|||
|
|
if (baseType == typeof(MesEntityBase) || baseType == typeof(MesTreeEntityBase))
|
|||
|
|
{
|
|||
|
|
EntityModel entityModel = new EntityModel();
|
|||
|
|
string entityName = t.Name;
|
|||
|
|
entityModel.EntityName = entityName;
|
|||
|
|
entityModel.Label = t.Name;
|
|||
|
|
|
|||
|
|
var attrs = t.GetCustomAttributes(typeof(DescriptionAttribute), false);
|
|||
|
|
if (attrs != null && attrs.Any())
|
|||
|
|
{
|
|||
|
|
var descAttr = attrs[0] as DescriptionAttribute;
|
|||
|
|
entityModel.Label = descAttr.Description;
|
|||
|
|
}
|
|||
|
|
#region 设置模块
|
|||
|
|
entityModel.ModuleType = (int)formService.GetModelTypeByName(entityName);
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
list.Add(entityModel);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Expression<Func<EntityModel, bool>> predicate = t => true;
|
|||
|
|
predicate = predicate.And(FilterHelper.GetExpression<EntityModel>(pageFilter.FilterGroup, null));
|
|||
|
|
list = list.Where(predicate.Compile()).OrderBy(t => t.EntityName).ToList();
|
|||
|
|
ret.TotalCount = list.Count;
|
|||
|
|
ret.Data = list.Skip(pageFilter.Start).Take(pageFilter.Limit).ToArray();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
[HttpPost, Route("EntityFieldOrderPaged")]
|
|||
|
|
public PagedActionResult<EntityFieldModel> EntityFieldOrderPaged([FromBody] KeywordPageFilter pageFilter)
|
|||
|
|
{
|
|||
|
|
return SafeGetPagedData<EntityFieldModel>(ret =>
|
|||
|
|
{
|
|||
|
|
var list = GetTableField(pageFilter);
|
|||
|
|
ret.TotalCount = list.Count;
|
|||
|
|
ret.Data = list.Skip(pageFilter.Start).Take(pageFilter.Limit).ToArray();
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
private List<EntityFieldModel> GetTableField(KeywordPageFilter pageFilter, string parentName = "")
|
|||
|
|
{
|
|||
|
|
List<EntityFieldModel> list = new List<EntityFieldModel>();
|
|||
|
|
if (string.IsNullOrEmpty(pageFilter.Keyword)) return list;
|
|||
|
|
var entityType = APT.Utility.DataHelper.GetTypeByEntityName(pageFilter.Keyword);
|
|||
|
|
if (entityType == null) return list;
|
|||
|
|
foreach (var property in entityType.GetProperties())
|
|||
|
|
{
|
|||
|
|
var propertyType = property.PropertyType;
|
|||
|
|
EntityFieldModel entityField = new EntityFieldModel();
|
|||
|
|
entityField.ID = property.Name + "." + propertyType.Name;
|
|||
|
|
entityField.Field = property.Name;
|
|||
|
|
entityField.NavField = property.Name;
|
|||
|
|
if (!string.IsNullOrEmpty(parentName))
|
|||
|
|
{
|
|||
|
|
entityField.ID = parentName + "." + entityField.ID;
|
|||
|
|
entityField.NavField = parentName + "." + entityField.NavField;
|
|||
|
|
}
|
|||
|
|
entityField.FieldTypeName = propertyType.Name;
|
|||
|
|
entityField.Label = entityField.Field;
|
|||
|
|
var attrs = property.GetCustomAttributes(typeof(DescriptionAttribute), false);
|
|||
|
|
if (attrs != null && attrs.Any())
|
|||
|
|
{
|
|||
|
|
var descAttr = attrs[0] as DescriptionAttribute;
|
|||
|
|
entityField.Label = descAttr.Description;
|
|||
|
|
}
|
|||
|
|
if (entityField.Field.StartsWith("VIR_", StringComparison.OrdinalIgnoreCase) ||
|
|||
|
|
entityField.Field.StartsWith("VIRTUAL_", StringComparison.OrdinalIgnoreCase) ||
|
|||
|
|
entityField.Field.ToUpper() != entityField.Field)
|
|||
|
|
entityField.FieldType = (int)EntityFieldTypeEnum.虚字段;
|
|||
|
|
|
|||
|
|
//判断是否为泛型
|
|||
|
|
if (propertyType.IsGenericType)
|
|||
|
|
{
|
|||
|
|
#region 泛型类型
|
|||
|
|
var types = propertyType.GetGenericArguments();
|
|||
|
|
Type realType = null;
|
|||
|
|
if (types != null && types.Any())
|
|||
|
|
realType = types[0];
|
|||
|
|
var genericType = propertyType.GetGenericTypeDefinition();
|
|||
|
|
var genericTypeName = genericType.Name.Substring(0, genericType.Name.Length - 2);
|
|||
|
|
if (genericTypeName.Contains("Nullable"))
|
|||
|
|
entityField.FieldTypeName = realType.Name + " ?";
|
|||
|
|
else
|
|||
|
|
entityField.FieldTypeName = genericTypeName + "<" + realType.Name + ">";
|
|||
|
|
if (realType.IsClass)
|
|||
|
|
{
|
|||
|
|
var baseType = realType.BaseType;
|
|||
|
|
if (baseType == typeof(MesEntityBase) || baseType == typeof(MesTreeEntityBase))
|
|||
|
|
{
|
|||
|
|
entityField.FieldEntityName = realType.Name;
|
|||
|
|
entityField.FieldType = (int)EntityFieldTypeEnum.导航字段;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
else if (propertyType.IsClass) //如果属性类型为Class并且继承至系统基类 则为导航属性
|
|||
|
|
{
|
|||
|
|
var baseType = propertyType.BaseType;
|
|||
|
|
if (baseType == typeof(MesEntityBase) || baseType == typeof(MesTreeEntityBase))
|
|||
|
|
{
|
|||
|
|
entityField.FieldEntityName = propertyType.Name;
|
|||
|
|
entityField.FieldType = (int)EntityFieldTypeEnum.导航字段;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region 添加字段额外信息
|
|||
|
|
StringBuilder stringBuilder = new StringBuilder();
|
|||
|
|
attrs = property.GetCustomAttributes(typeof(EnumNameAttribute), false);
|
|||
|
|
if (attrs != null && attrs.Any())
|
|||
|
|
{
|
|||
|
|
var enumAttr = attrs[0] as EnumNameAttribute;
|
|||
|
|
stringBuilder.Append("枚举:" + enumAttr.EnumName);
|
|||
|
|
stringBuilder.Append(";");
|
|||
|
|
}
|
|||
|
|
attrs = property.GetCustomAttributes(typeof(CUniqueAttribute), false);
|
|||
|
|
if (attrs != null && attrs.Any())
|
|||
|
|
{
|
|||
|
|
stringBuilder.Append("字段唯一");
|
|||
|
|
stringBuilder.Append(";");
|
|||
|
|
}
|
|||
|
|
attrs = property.GetCustomAttributes(typeof(CodeRuleAttribute), false);
|
|||
|
|
if (attrs != null && attrs.Any())
|
|||
|
|
{
|
|||
|
|
var codeRuleAttr = attrs[0] as CodeRuleAttribute;
|
|||
|
|
if (codeRuleAttr.CodeRuleTypes != null && codeRuleAttr.CodeRuleTypes.Any())
|
|||
|
|
{
|
|||
|
|
stringBuilder.Append("编码类型:");
|
|||
|
|
foreach (var ct in codeRuleAttr.CodeRuleTypes)
|
|||
|
|
stringBuilder.Append(System.Enum.GetName(typeof(PFCodeRuleType), ct) + "(" + ct + "),");
|
|||
|
|
stringBuilder.Append(";");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (stringBuilder.Length > 0)
|
|||
|
|
{
|
|||
|
|
stringBuilder.Length--;
|
|||
|
|
entityField.FieldInfo = stringBuilder.ToString();
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
list.Add(entityField);
|
|||
|
|
}
|
|||
|
|
Expression<Func<EntityFieldModel, bool>> predicate = t => true;
|
|||
|
|
predicate = predicate.And(FilterHelper.GetExpression<EntityFieldModel>(pageFilter.FilterGroup, null));
|
|||
|
|
list = list.Where(predicate.Compile()).OrderBy(t => t.Field).ToList();
|
|||
|
|
return list;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
[HttpPost, Route("TreeEntityField")]
|
|||
|
|
public PagedActionResult<EntityFieldModel> TreeEntityField([FromBody] KeywordPageFilter pageFilter)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
return SafeGetPagedData<EntityFieldModel>((result) =>
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
List<EntityFieldModel> list = new List<EntityFieldModel>();
|
|||
|
|
//var filedType = (int)PFFieldTypeEnum.表字段;
|
|||
|
|
//if (!string.IsNullOrEmpty(pageFilter.Parameter1))
|
|||
|
|
// filedType = int.Parse(pageFilter.Parameter1);
|
|||
|
|
//if (string.IsNullOrEmpty(pageFilter.Keyword))
|
|||
|
|
// return list;
|
|||
|
|
//if (filedType == (int)PFFieldTypeEnum.表字段)
|
|||
|
|
//{
|
|||
|
|
// var parentField = pageFilter.FilterGroup.Rules.FirstOrDefault(x => x.Field == "PARENT_ID");
|
|||
|
|
// var parentName = "";
|
|||
|
|
// if (parentField == null)
|
|||
|
|
// {
|
|||
|
|
// var form = this.GetEntityByRedis<T_PF_FORM>(pageFilter.Keyword, pageFilter.GetOrgId());
|
|||
|
|
// if (form == null)
|
|||
|
|
// this.ThrowError("020015");
|
|||
|
|
// if (string.IsNullOrEmpty(form.TABLE_NAME))
|
|||
|
|
// this.ThrowError("020016");
|
|||
|
|
// pageFilter.Keyword = form.TABLE_NAME;
|
|||
|
|
// }
|
|||
|
|
// else
|
|||
|
|
// {
|
|||
|
|
// var infos = parentField.Value.ToString().Split(new char[] { '.' });
|
|||
|
|
// pageFilter.Keyword = infos[infos.Length - 1];
|
|||
|
|
// parentName = string.Join('.', infos.Take(infos.Length - 1));
|
|||
|
|
// parentName = parentName.Trim('.');
|
|||
|
|
// pageFilter.FilterGroup.Rules.Clear();
|
|||
|
|
// }
|
|||
|
|
// var pagelist = GetTableField(pageFilter, parentName);
|
|||
|
|
// foreach (var d in pagelist)
|
|||
|
|
// {
|
|||
|
|
// var treeNode = new TreeNode<EntityFieldModel>();
|
|||
|
|
// treeNode.Node = d;
|
|||
|
|
// treeNode.IsLeaf = true;
|
|||
|
|
// treeNode.Level = 0;
|
|||
|
|
// if (d.FieldType == (int)EntityFieldTypeEnum.导航字段|| d.FieldType == (int)EntityFieldTypeEnum.虚字段)
|
|||
|
|
// {
|
|||
|
|
// treeNode.IsLeaf = false;
|
|||
|
|
// }
|
|||
|
|
// list.Add(treeNode);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
Dictionary<string, string> dicTree = new Dictionary<string, string>();
|
|||
|
|
dicTree.Add("层级", "Level");
|
|||
|
|
dicTree.Add("是否叶子", "IsLeaf");
|
|||
|
|
foreach (var key in dicTree.Keys)
|
|||
|
|
{
|
|||
|
|
var model = new EntityFieldModel()
|
|||
|
|
{
|
|||
|
|
NavField = dicTree[key],
|
|||
|
|
Label = key,
|
|||
|
|
FIELD_TYPE = (int)PFFieldTypeEnum.树字段,
|
|||
|
|
ID = Guid.NewGuid().ToString(),
|
|||
|
|
};
|
|||
|
|
list.Add(model);
|
|||
|
|
}
|
|||
|
|
//}
|
|||
|
|
result.Data = list.Skip(pageFilter.Start).Take(pageFilter.Limit);
|
|||
|
|
result.TotalCount = list.Count;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[HttpPost, Route("EntityField")]
|
|||
|
|
public JsonActionResult<IEnumerable<TreeNode<EntityFieldModel>>> EntityField([FromBody] KeywordPageFilter pageFilter)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
return SafeExecute<IEnumerable<TreeNode<EntityFieldModel>>>(() =>
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
List<TreeNode<EntityFieldModel>> list = new List<TreeNode<EntityFieldModel>>();
|
|||
|
|
//var filedType = (int)PFFieldTypeEnum.表字段;
|
|||
|
|
//if (!string.IsNullOrEmpty(pageFilter.Parameter1))
|
|||
|
|
// filedType = int.Parse(pageFilter.Parameter1);
|
|||
|
|
if (string.IsNullOrEmpty(pageFilter.Keyword))
|
|||
|
|
return list;
|
|||
|
|
//if (filedType == (int)PFFieldTypeEnum.表字段)
|
|||
|
|
//{
|
|||
|
|
//导航属性格式:Nav_Appliance.T_BD_APPLIANCE ,字段名称+.+字段累类型
|
|||
|
|
var parentField = pageFilter.FilterGroup.Rules.FirstOrDefault(x => x.Field == "PARENT_ID");
|
|||
|
|
var parentName = "";
|
|||
|
|
if (parentField == null)
|
|||
|
|
{
|
|||
|
|
var form = this.GetEntityByRedis<T_PF_FORM>(pageFilter.Keyword, pageFilter.GetOrgId());
|
|||
|
|
if (form == null)
|
|||
|
|
this.ThrowError("020015");
|
|||
|
|
if (string.IsNullOrEmpty(form.TABLE_NAME))
|
|||
|
|
this.ThrowError("020016");
|
|||
|
|
pageFilter.Keyword = form.TABLE_NAME;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var infos = parentField.Value.ToString().Split(new char[] { '.' });
|
|||
|
|
pageFilter.Keyword = infos[infos.Length - 1];
|
|||
|
|
parentName = string.Join('.', infos.Take(infos.Length - 1));
|
|||
|
|
parentName = parentName.Trim('.');
|
|||
|
|
pageFilter.FilterGroup.Rules.Clear();
|
|||
|
|
}
|
|||
|
|
var pagelist = GetTableField(pageFilter, parentName);
|
|||
|
|
foreach (var d in pagelist)
|
|||
|
|
{
|
|||
|
|
d.FIELD_TYPE = (int)PFFieldTypeEnum.表字段;
|
|||
|
|
var treeNode = new TreeNode<EntityFieldModel>();
|
|||
|
|
treeNode.Node = d;
|
|||
|
|
treeNode.IsLeaf = true;
|
|||
|
|
treeNode.Level = 0;
|
|||
|
|
if (d.FieldType == (int)EntityFieldTypeEnum.导航字段 || d.FieldType == (int)EntityFieldTypeEnum.虚字段)
|
|||
|
|
{
|
|||
|
|
treeNode.IsLeaf = false;
|
|||
|
|
}
|
|||
|
|
list.Add(treeNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// Dictionary<string, string> dicTree = new Dictionary<string, string>();
|
|||
|
|
// dicTree.Add("层级", "Level");
|
|||
|
|
// dicTree.Add("是否叶子", "IsLeaf");
|
|||
|
|
// foreach (var key in dicTree.Keys)
|
|||
|
|
// {
|
|||
|
|
// var model = new EntityFieldModel()
|
|||
|
|
// {
|
|||
|
|
// NavField = dicTree[key],
|
|||
|
|
// Label = key,
|
|||
|
|
// };
|
|||
|
|
// var treeNode = new TreeNode<EntityFieldModel>();
|
|||
|
|
// treeNode.Node = model;
|
|||
|
|
// treeNode.IsLeaf = true;
|
|||
|
|
// treeNode.Level = 0;
|
|||
|
|
// list.Add(treeNode);
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
return list;
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 向web客户端发送消息
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="model"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("SendInfo")]
|
|||
|
|
public JsonActionResult<bool> SendInfo([FromBody] SendNotificationModel model)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<bool>(() =>
|
|||
|
|
{
|
|||
|
|
List<WebSocketClientInfo> clientInfos = null;
|
|||
|
|
if (model.UserId != null)
|
|||
|
|
clientInfos = WebSocketServiceHelper.ClintInfos.Where(t => t.UserId == model.UserId).ToList();
|
|||
|
|
var notificatoinService = APT.Infrastructure.Api.ServiceLocator.Instance.GetService<IFMNotificatoinService>();
|
|||
|
|
notificatoinService.SendNotification(model, clientInfos);
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 向web客户端发送报警消息
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="model"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
[HttpPost, Route("SendAlarmInfo")]
|
|||
|
|
public JsonActionResult<bool> SendAlarmInfo([FromBody] SendNotificationModel model)
|
|||
|
|
{
|
|||
|
|
return SafeExecute<bool>(() =>
|
|||
|
|
{
|
|||
|
|
List<WebSocketClientInfo> clientInfos = null;
|
|||
|
|
if (model.UserIds.Count > 0)
|
|||
|
|
clientInfos = WebSocketServiceHelper.ClintInfos.Where(t => model.UserIds.Contains(t.UserId ?? Guid.Empty)).Distinct(x=>x.UserId).ToList();
|
|||
|
|
var notificatoinService = ServiceLocator.Instance.GetService<IFMNotificatoinService>();
|
|||
|
|
notificatoinService.SendAlarmNotification(model, clientInfos);
|
|||
|
|
return true;
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|