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;
 | 
						||
            });
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |