예제 #1
0
        public IActionResult RenderChart([FromBody] RenderChartModel model)
        {
            QueryView.Domain.QueryView view = null;
            if (model.QueryId.Equals(Guid.Empty) && model.EntityName.IsNotEmpty())
            {
                view = _queryViewFinder.FindEntityDefaultView(model.EntityName);
                if (view != null)
                {
                    model.QueryId = view.QueryViewId;
                }
            }
            else if (!model.QueryId.Equals(Guid.Empty))
            {
                view = _queryViewFinder.FindById(model.QueryId);
            }
            if (view == null)
            {
                return(NotFound());
            }
            var chartEntity = _chartFinder.FindById(model.ChartId);
            var result      = _chartBuilder.Build(view, chartEntity, model.Filter, model.Groups.NotEmpty() ? model.Groups.Last() : string.Empty);

            model.Chart       = result.Chart;
            model.ChartData   = result.ChartData;
            model.ChartEntity = chartEntity;
            model.Attributes  = result.Attributes;
            model.DataSource  = result.DataSource;

            return(View($"~/Views/Component/{WebContext.ActionName}.cshtml", model));
        }
예제 #2
0
 public IActionResult CopyQueryView(Guid queryViewId, string name)
 {
     if (!queryViewId.Equals(Guid.Empty))
     {
         var entity       = _queryViewFinder.FindById(queryViewId);
         var newQueryView = new QueryView.Domain.QueryView();
         entity.CopyTo(newQueryView);
         newQueryView.QueryViewId = Guid.NewGuid();
         newQueryView.Name        = name.IfEmpty(entity.Name + " Copy");
         newQueryView.IsDefault   = false;
         newQueryView.CreatedOn   = DateTime.Now;
         newQueryView.CreatedBy   = CurrentUser.SystemUserId;
         _queryViewCreater.Create(newQueryView);
         return(SaveSuccess(new { id = entity.QueryViewId }));
     }
     return(SaveFailure());
 }
예제 #3
0
        public string ToExcelFile(QueryView.Domain.QueryView queryView, FilterExpression filter, OrderExpression order, string fileName, bool includePrimaryKey = false, bool includeIndex = false, string title = "")
        {
            fileName.IfEmpty(queryView.Name);
            fileName = Encoding.UTF8.GetString(fileName.ToByteArray());//防止linux下乱码
            var webPath  = "/excel/" + fileName + "_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls";
            var filePath = _webHelper.MapPath(webPath);

            //SaveToExcel(list, fileName, filePath, columnNames, hideColumns, title, _fetchDataService.QueryResolver.AttributeList);
            using (var ms = ToExcelStream(queryView, filter, order, fileName, includePrimaryKey, includeIndex, title))
            {
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                {
                    byte[] data = ms.ToArray();
                    fs.Write(data, 0, data.Length);
                    fs.Flush();
                }
            }
            return(webPath);
        }
예제 #4
0
 public IActionResult Post(EditQueryViewModel model)
 {
     if (ModelState.IsValid)
     {
         var entity = new QueryView.Domain.QueryView();
         model.CopyTo(entity);
         entity.StateCode   = RecordState.Enabled;
         entity.IsDefault   = false;
         entity.IsPrivate   = false;
         entity.QueryViewId = Guid.NewGuid();
         entity.CreatedBy   = CurrentUser.SystemUserId;
         if (model.IsCustomButton && model.ButtonId.NotEmpty())
         {
             entity.CustomButtons = model.ButtonId.SerializeToJson();
         }
         entity.AggregateConfig = string.Empty;
         _queryViewCreater.Create(entity);
         return(CreateSuccess(new { id = entity.QueryViewId }));
     }
     return(CreateFailure(GetModelErrors()));
 }
예제 #5
0
        public IActionResult Export([FromBody] EntityGridModel model)
        {
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryViewId.HasValue && !model.QueryViewId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryViewId.Value);
            }
            else if (model.EntityId.HasValue && !model.EntityId.Value.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityId.Value);
            }
            else if (model.EntityName.IsNotEmpty())
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityName);
            }
            else
            {
                return(NotFound());
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            OrderExpression orderExp = null;

            if (model.IsSortBySeted)
            {
                orderExp = new OrderExpression(model.SortBy, model.SortDirection == 0 ? OrderType.Ascending : OrderType.Descending);
            }
            string path = _dataExporter.ToExcelFile(queryView, model.Filter, orderExp, queryView.Name, model.ExportType == 1, includeIndex: model.IncludeIndex, title: model.ExportTitle);

            if (path.IsEmpty())
            {
                return(JError(T["list_nodata"]));
            }
            return(JOk(path));
        }
예제 #6
0
        public IActionResult RenderGridView([FromBody] EntityGridModel model)
        {
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryViewId.HasValue && !model.QueryViewId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryViewId.Value);
            }
            else if (model.EntityId.HasValue && !model.EntityId.Value.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityId.Value);
            }
            else if (model.EntityName.IsNotEmpty())
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityName);
            }
            else
            {
                return(NotFound());
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            if (!queryView.IsDefault && queryView.AuthorizationEnabled)
            {
                if (!_roleObjectAccessService.Exists(queryView.QueryViewId, QueryViewDefaults.ModuleName, CurrentUser.Roles.Select(n => n.RoleId).ToArray()))
                {
                    return(Unauthorized());
                }
            }
            model.QueryView = queryView;
            model.EntityId  = queryView.EntityId;

            FetchDescriptor fetch = new FetchDescriptor
            {
                Page        = model.Page,
                PageSize    = model.PageSize,
                FetchConfig = queryView.FetchConfig,
                GetAll      = !model.PagingEnabled
            };

            if (model.IsSortBySeted)
            {
                QueryColumnSortInfo sort = new QueryColumnSortInfo(model.SortBy, model.SortDirection == 0);
                fetch.Sort = sort;
            }
            //查询关键字
            if (model.Q.IsNotEmpty())
            {
                fetch.Keyword = model.Q;
                fetch.Field   = model.QField;
            }
            var canFetch = true;

            //filter by relationship
            if (model.RelationShipName.IsNotEmpty())
            {
                var relationship = _relationShipFinder.FindByName(model.RelationShipName);
                if (relationship != null && model.ReferencedRecordId.HasValue && !model.ReferencedRecordId.Value.Equals(Guid.Empty))
                {
                    if (model.Filter == null)
                    {
                        model.Filter = new FilterExpression();
                    }
                    var condition = new ConditionExpression(relationship.ReferencingAttributeName, ConditionOperator.Equal, model.ReferencedRecordId);
                    model.Filter.AddCondition(condition);
                }
                model.RelationShipMeta = relationship;
            }
            if (model.RelationShipName.IsNotEmpty() && (!model.ReferencedRecordId.HasValue || model.ReferencedRecordId.Value.Equals(Guid.Empty)))
            {
                //如果被引用ID为空,则不查询数据
                canFetch = false;
            }
            fetch.Filter = model.Filter;
            if (canFetch)
            {
                fetch.User = CurrentUser;
                var datas = _fetchService.Execute(fetch);
                if (model.OnlyData)
                {
                    //var serializer = new DataContractJsonSerializer(typeof(User), new DataContractJsonSerializerSettings()
                    //{
                    //    UseSimpleDictionaryFormat = true//去掉Key和Value
                    //});
                    //return new JsonResult() { Data = datas.Items.SerializeToJson(), JsonRequestBehavior = JsonRequestBehavior.AllowGet };
                    return(Content(datas.SerializeToJson()));
                }
                model.Grid             = _gridService.Build(queryView, _fetchService.QueryResolver.EntityList, _fetchService.QueryResolver.AttributeList);
                model.EntityList       = _fetchService.QueryResolver.EntityList;
                model.AttributeList    = _fetchService.QueryResolver.AttributeList;
                model.RelationShipList = _fetchService.QueryResolver.RelationShipList;
                model.Items            = datas.Items;
                model.TotalItems       = datas.TotalItems;
            }
            else
            {
                _fetchService.GetMetaDatas(fetch);
                model.Grid             = _gridService.Build(queryView, _fetchService.QueryResolver.EntityList, _fetchService.QueryResolver.AttributeList);
                model.EntityList       = _fetchService.QueryResolver.EntityList;
                model.AttributeList    = _fetchService.QueryResolver.AttributeList;
                model.RelationShipList = _fetchService.QueryResolver.RelationShipList;
                model.Items            = new List <dynamic>();
                model.TotalItems       = 0;
            }
            var buttons = _ribbonbuttonFinder.Find(model.EntityId.Value, RibbonButtonArea.SubGrid);

            if (buttons.NotEmpty())
            {
                buttons             = buttons.OrderBy(x => x.DisplayOrder).ToList();
                model.RibbonButtons = buttons;
            }
            if (model.IsSortBySeted == false)
            {
                if (_fetchService.QueryExpression.Orders.NotEmpty())
                {
                    model.SortBy        = _fetchService.QueryExpression.Orders[0].AttributeName;
                    model.SortDirection = (int)_fetchService.QueryExpression.Orders[0].OrderType;
                }
            }
            return(View($"~/Views/Entity/{WebContext.ActionName}.cshtml", model));
        }
예제 #7
0
        /// <summary>
        /// 生成图表
        /// </summary>
        /// <param name="queryId">视图记录</param>
        /// <param name="chartId">图表记录</param>
        /// <param name="filter">附加过滤条件</param>
        /// <returns></returns>
        public ChartContext Build(QueryView.Domain.QueryView queryView, Chart chartEntity, FilterExpression filter = null, string drillGroup = "")
        {
            ChartContext context = new ChartContext();
            //图表对象
            ChartDescriptor chart = new ChartDescriptor();

            chart       = chart.DeserializeFromJson(chartEntity.PresentationConfig);
            chart.Title = chartEntity.Name;
            //引用视图查询数据
            _fetchDataService.GetMetaDatas(queryView.FetchConfig);
            if (filter != null)
            {
                _fetchDataService.QueryExpression.Criteria.AddFilter(filter);
            }

            //图表数据描述
            ChartDataDescriptor chartData = new ChartDataDescriptor();

            chartData = chartData.DeserializeFromJson(chartEntity.DataConfig);
            if (drillGroup.IsNotEmpty())
            {
                var categoryChartData = chartData.Fetch.Find(n => n.Type == ChartItemType.Category);
                categoryChartData.Attribute = drillGroup;
            }
            var dataSource = _chartRepository.GetChartDataSource(chartData, _fetchDataService.QueryExpression, _fetchDataService.QueryResolver);

            chart.Legend = new List <string>();
            var categories = new List <string>();//分类标签
            var emptyStr   = _loc["chart_nodata"];

            foreach (var item in chartData.Fetch)
            {
                var attr = _fetchDataService.QueryResolver.AttributeList.Find(n => n.EntityId == chartEntity.EntityId && n.Name.IsCaseInsensitiveEqual(item.Attribute));
                var name = item.Attribute;
                if (item.Type == ChartItemType.Series)
                {
                    //legend
                    chart.Legend.Add(attr.LocalizedName);
                    var seriesData = new List <string>();
                    var seriesName = name + Enum.GetName(typeof(AggregateType), item.Aggregate);
                    foreach (var d in dataSource)
                    {
                        var line = d as IDictionary <string, object>;
                        seriesData.Add(line[seriesName] != null ? line[seriesName].ToString() : "0");
                    }
                    var s = chart.Series.Find(n => n.Name.IsCaseInsensitiveEqual(item.Attribute));
                    s.Name = attr.LocalizedName;
                    s.Data = seriesData;
                }
                else if (item.Type == ChartItemType.Category)
                {
                    if (attr.TypeIsLookUp() || attr.TypeIsOwner() || attr.TypeIsCustomer())
                    {
                        name += "name";
                    }
                    else if (attr.TypeIsPrimaryKey())
                    {
                        name = attr.Name + "name";
                    }
                    foreach (var d in dataSource)
                    {
                        var line = d as IDictionary <string, object>;
                        //选项类型,获取选项显示名称
                        if (line[name] != null && (attr.TypeIsPickList() || attr.TypeIsStatus()))
                        {
                            var oname = _optionSetDetailFinder.GetOptionName(attr.OptionSetId.Value, int.Parse(line[name].ToString()));
                            categories.Add(oname.IfEmpty(emptyStr));
                        }
                        //是否类型,获取选项显示名称
                        else if (line[name] != null && (attr.TypeIsBit() || attr.TypeIsState()))
                        {
                            var oname = _stringMapFinder.GetOptionName(attr.AttributeId, int.Parse(line[name].ToString()));
                            categories.Add(oname.IfEmpty(emptyStr));
                        }
                        else
                        {
                            categories.Add(line[name] != null ? line[name].ToString() : emptyStr);
                        }
                    }
                    chart.XAxis = new XAxis()
                    {
                        Type = AxisType.Category,
                        Data = categories
                    };
                }
                chart.SubTitle = queryView.Name;

                context.Chart      = chart;
                context.ChartData  = chartData;
                context.Attributes = _fetchDataService.QueryResolver.AttributeList;
                context.DataSource = dataSource;
            }
            return(context);
        }
예제 #8
0
        public IActionResult GetViewInfo(Guid?id, Guid?entityId, string entityName)
        {
            //视图信息
            List <QueryView.Domain.QueryView> views = null;
            //字段信息
            List <Schema.Domain.Attribute> attributes = null;
            //按钮信息
            List <RibbonButton.Domain.RibbonButton> buttons = null;
            //Web资源信息
            string      webResources   = null;
            List <Guid> webResourceIds = null;

            QueryView.Domain.QueryView queryView = null;

            //查询视图信息
            if (id.HasValue && !id.Value.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(id.Value);
                if (queryView != null)
                {
                    views = new List <QueryView.Domain.QueryView>
                    {
                        queryView
                    };
                }
            }
            else if (entityId.HasValue && !entityId.Equals(Guid.Empty))
            {
                views = _queryViewFinder.QueryAuthorized(n => n.Where(f => f.EntityId == entityId && f.StateCode == RecordState.Enabled)
                                                         .Sort(s => s.SortAscending(f => f.Name)));
                if (views.NotEmpty())
                {
                    queryView = views.First(x => x.IsDefault);
                }
            }
            else if (entityName.IsNotEmpty())
            {
                views = _queryViewFinder.QueryAuthorized(n => n.Where(f => f.EntityName == entityName && f.StateCode == RecordState.Enabled)
                                                         .Sort(s => s.SortAscending(f => f.Name)));
                if (views.NotEmpty())
                {
                    queryView = views.FirstOrDefault(x => x.IsDefault);
                }
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            //查询字段
            var queryExp = new QueryExpression().DeserializeFromJson(queryView.FetchConfig);

            attributes = _queryMetadataFinder.GetAttributes(queryExp);
            //查询按钮
            FilterContainer <RibbonButton.Domain.RibbonButton> buttonFilter = FilterContainerBuilder.Build <RibbonButton.Domain.RibbonButton>()
                                                                              .And(w => w.StateCode == RecordState.Enabled && w.EntityId == queryView.EntityId &&
                                                                                   (w.ShowArea == RibbonButtonArea.ListHead || w.ShowArea == RibbonButtonArea.ListRow || w.ShowArea == RibbonButtonArea.SubGrid));

            if (queryView.IsCustomButton && queryView.CustomButtons.IsNotEmpty())
            {
                List <Guid> buttonid = new List <Guid>();
                buttonid = buttonid.DeserializeFromJson(queryView.CustomButtons);
                buttonFilter.And(w => w.RibbonButtonId.In(buttonid));
            }
            buttons = _ribbonbuttonFinder.Query(n => n
                                                .Where(buttonFilter)
                                                .Sort(s => s.SortAscending(f => f.DisplayOrder)));
            //查询Web资源信息
            if (queryView.LayoutConfig.IsNotEmpty())
            {
                QueryViewLayoutConfigModel layoutConfig = new QueryViewLayoutConfigModel().DeserializeFromJson(queryView.LayoutConfig);
                if (layoutConfig != null && layoutConfig.ClientResources.NotEmpty())
                {
                    webResourceIds = layoutConfig.ClientResources;
                }
            }
            if (buttons.NotEmpty())
            {
                buttons.ForEach(x =>
                {
                    if (x.JsLibrary != null)
                    {
                        string[] arr = x.JsLibrary.Split(":");
                        if (arr.Length > 1)
                        {
                            Guid webResourceId = Guid.Empty;
                            if (Guid.TryParse(arr[1], out webResourceId))
                            {
                                if (webResourceIds == null)
                                {
                                    webResourceIds = new List <Guid>();
                                }
                                webResourceIds.Add(webResourceId);
                            }
                        }
                    }
                });
            }
            if (webResourceIds.NotEmpty())
            {
                StringBuilder content = new StringBuilder();
                var           result  = _webResourceFinder.FindByIds(webResourceIds.ToArray());
                foreach (var item in result)
                {
                    content.Append(_webResourceContentCoder.CodeDecode(item.Content));
                }
                webResources = content.ToString();
            }
            else
            {
                webResources = T["notfound_record"];
            }
            List <Guid> noneReadFields = new List <Guid>();

            //获取字段权限
            if (!CurrentUser.IsSuperAdmin && attributes.Count(n => n.AuthorizationEnabled) > 0)
            {
                var securityFields = attributes.Where(n => n.AuthorizationEnabled).Select(f => f.AttributeId)?.ToList();
                if (securityFields.NotEmpty())
                {
                    //无权限的字段
                    noneReadFields = _systemUserPermissionService.GetNoneReadFields(CurrentUser.SystemUserId, securityFields);
                }
            }
            return(JOk(new { Views = views, Attributes = attributes, Buttons = buttons, WebResources = webResources, NoneReadFields = noneReadFields }));
        }
        public IActionResult Post([FromBody] EntityGridModel model)
        {
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryViewId.HasValue && !model.QueryViewId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryViewId.Value);
            }
            else if (model.EntityId.HasValue && !model.EntityId.Value.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityId.Value);
            }
            else if (model.EntityName.IsNotEmpty())
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityName);
            }
            else
            {
                return(NotFound());
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            if (!queryView.IsDefault && queryView.AuthorizationEnabled)
            {
                if (!_roleObjectAccessService.Exists(queryView.QueryViewId, QueryViewDefaults.ModuleName, CurrentUser.Roles.Select(n => n.RoleId).ToArray()))
                {
                    return(Unauthorized());
                }
            }
            model.QueryView = queryView;
            model.EntityId  = queryView.EntityId;

            FetchDescriptor fetch = new FetchDescriptor
            {
                Page        = model.Page,
                PageSize    = model.PageSize,
                FetchConfig = queryView.FetchConfig,
                GetAll      = !model.PagingEnabled
            };

            if (model.IsSortBySeted)
            {
                QueryColumnSortInfo sort = new QueryColumnSortInfo(model.SortBy, model.SortDirection == 0);
                fetch.Sort = sort;
            }
            //查询关键字
            if (model.Q.IsNotEmpty())
            {
                fetch.Keyword = model.Q;
                fetch.Field   = model.QField;
            }
            var canFetch = true;

            //filter by relationship
            if (model.RelationShipName.IsNotEmpty())
            {
                var relationship = _relationShipFinder.FindByName(model.RelationShipName);
                if (relationship != null && model.ReferencedRecordId.HasValue && !model.ReferencedRecordId.Value.Equals(Guid.Empty))
                {
                    if (model.Filter == null)
                    {
                        model.Filter = new FilterExpression();
                    }
                    var condition = new ConditionExpression(relationship.ReferencingAttributeName, ConditionOperator.Equal, model.ReferencedRecordId);
                    model.Filter.AddCondition(condition);
                }
                model.RelationShipMeta = relationship;
            }
            if (model.RelationShipName.IsNotEmpty() && (!model.ReferencedRecordId.HasValue || model.ReferencedRecordId.Value.Equals(Guid.Empty)))
            {
                //如果被引用ID为空,则不查询数据
                canFetch = false;
            }
            fetch.Filter = model.Filter;
            if (canFetch)
            {
                fetch.User = CurrentUser;
                var    fetchDatas     = _fetchService.Execute(fetch);
                object aggregateDatas = null;
                if (queryView.AggregateConfig.IsNotEmpty())
                {
                    var aggFields = new List <AggregateExpressionField>().DeserializeFromJson(queryView.AggregateConfig);
                    if (aggFields.NotEmpty())
                    {
                        var queryExp = new QueryExpression().DeserializeFromJson(queryView.FetchConfig);
                        if (model.Filter != null &&
                            (model.Filter.Conditions.NotEmpty() || (model.Filter.Filters.NotEmpty() && model.Filter.Filters.First().Conditions.NotEmpty())))
                        {
                            queryExp.Criteria.AddFilter(model.Filter);
                        }
                        var aggExp = new AggregateExpression
                        {
                            ColumnSet       = queryExp.ColumnSet,
                            Criteria        = queryExp.Criteria,
                            EntityName      = queryExp.EntityName,
                            LinkEntities    = queryExp.LinkEntities,
                            AggregateFields = aggFields
                        };
                        var aggDatas   = _aggregateService.Execute(aggExp);
                        var attributes = _attributeFinder.FindByName(queryView.EntityId, aggFields.Select(x => x.AttributeName).ToArray());
                        foreach (dynamic item in aggDatas)
                        {
                            var line      = item as IDictionary <string, object>;
                            var attribute = attributes.Find(x => x.Name.IsCaseInsensitiveEqual(line.Keys.First()));
                            item.metadata      = new { attribute.Name, attribute.LocalizedName, attribute.AttributeTypeName, attribute.EntityId, attribute.EntityName, attribute.EntityLocalizedName };
                            item.aggregatetype = aggFields.Find(x => x.AttributeName.IsCaseInsensitiveEqual(attribute.Name)).AggregateType;
                        }
                        aggregateDatas = new { View = new { queryView.QueryViewId, queryView.Name }, Data = aggDatas };
                    }
                }
                return(Content(new { FetchData = fetchDatas, AggregateData = aggregateDatas }.SerializeToJson()));
            }
            if (!model.IsSortBySeted)
            {
                if (_fetchService.QueryExpression.Orders.NotEmpty())
                {
                    model.SortBy        = _fetchService.QueryExpression.Orders[0].AttributeName;
                    model.SortDirection = (int)_fetchService.QueryExpression.Orders[0].OrderType;
                }
            }
            return(View($"~/Views/Entity/{WebContext.ActionName}.cshtml", model));
        }
예제 #10
0
        public MemoryStream ToExcelStream(QueryView.Domain.QueryView queryView, FilterExpression filter, OrderExpression order, string fileName, bool includePrimaryKey = false, bool includeIndex = false, string title = "")
        {
            _fetchDataService.GetMetaDatas(queryView.FetchConfig);
            if (filter != null)
            {
                _fetchDataService.QueryExpression.Criteria.AddFilter(filter);
            }
            if (order != null)
            {
                _fetchDataService.QueryExpression.Orders.Clear();
                _fetchDataService.QueryExpression.Orders.Add(order);
            }
            _fetchDataService.QueryExpression.PageInfo = new PagingInfo()
            {
                PageNumber = 1, PageSize = 99999
            };
            var data = _fetchDataService.Execute(_fetchDataService.QueryExpression);

            if (data.TotalItems == 0)
            {
                return(null);
            }
            Dictionary <string, string> columnNames = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase);
            List <string> hideColumns = new List <string>();
            var           grid        = _gridService.Build(queryView, _fetchDataService.QueryResolver.EntityList, _fetchDataService.QueryResolver.AttributeList);

            if (includeIndex)
            {
                columnNames.Add("rownum", "序号");
                if (data.Items.NotEmpty())
                {
                    for (int i = 0; i < data.Items.Count; i++)
                    {
                        data.Items[i].RowNum = i + 1;
                    }
                }
            }
            if (includePrimaryKey)
            {
                var pk = _fetchDataService.QueryResolver.AttributeList.Find(n => n.EntityName.IsCaseInsensitiveEqual(_fetchDataService.QueryResolver.MainEntity.Name) && n.TypeIsPrimaryKey());//new Schema.AttributeService(user).Find(n => n.AttributeTypeName == AttributeTypeIds.PRIMARYKEY && n.EntityName == fetchService.QueryResolver.MainEntity.Name);
                columnNames.Add(pk.Name, pk.Name);
                hideColumns.Add(pk.Name);
            }
            foreach (var cell in grid.Rows[0].Cells)
            {
                var columnName = cell.Name.IndexOf(".") > 0 ? cell.Name.Split('.')[1] : cell.Name;
                var item       = _fetchDataService.QueryResolver.AttributeList.Find(n => n.Name.IsCaseInsensitiveEqual(columnName) && n.EntityName.IsCaseInsensitiveEqual(cell.EntityName));
                var label      = cell.Label;//item.LocalizedName;
                if (cell.Label.IsEmpty())
                {
                    if (!item.EntityId.Equals(_fetchDataService.QueryResolver.MainEntity.EntityId))
                    {
                        var le = _fetchDataService.QueryExpression.FindLinkEntityByName(item.EntityName);
                        if (le != null)
                        {
                            var relationship = _fetchDataService.QueryResolver.RelationShipList.Find(n => n.Name.IsCaseInsensitiveEqual(cell.Name.Split('.')[0]));
                            _relationShipFinder.WrapLocalizedLabel(relationship);
                            label     += "(" + relationship.ReferencingAttributeLocalizedName + ")";
                            columnName = le.EntityAlias + "." + columnName;
                        }
                    }
                    else
                    {
                        label = item.LocalizedName;
                    }
                }
                if (item.TypeIsPrimaryKey())
                {
                    var pkField = _fetchDataService.QueryResolver.AttributeList.Find(n => n.EntityName.IsCaseInsensitiveEqual(_fetchDataService.QueryResolver.MainEntity.Name) && n.IsPrimaryField);
                    columnNames.Add(pkField.Name, label);
                }
                else if (item.TypeIsBit() || item.TypeIsState() || item.TypeIsStatus() || item.TypeIsPickList() || item.TypeIsLookUp() || item.TypeIsOwner() || item.TypeIsCustomer())
                {
                    columnNames.Add(cell.Name + "Name", label);
                }
                else
                {
                    columnNames.Add(cell.Name, label);
                }
            }
            //字段权限
            if (_fetchDataService.QueryResolver.AttributeList.Count(x => x.AuthorizationEnabled) > 0)
            {
                var noneRead = _systemUserPermissionService.GetNoneReadFields(_appContext.GetFeature <ICurrentUser>().SystemUserId, _fetchDataService.QueryResolver.AttributeList.Where(x => x.AuthorizationEnabled).Select(x => x.AttributeId).ToList());
                if (noneRead.NotEmpty())
                {
                    var noneReadAttrs = _attributeFinder.Query(x => x.Where(f => f.AttributeId.In(noneRead)));
                    foreach (var d in data.Items)
                    {
                        var _this = d as IDictionary <string, object>;
                        foreach (var nr in noneReadAttrs)
                        {
                            _this[nr.Name.ToLower()] = null;
                            if (nr.TypeIsBit() || nr.TypeIsState() || nr.TypeIsPickList() || nr.TypeIsStatus() ||
                                nr.TypeIsLookUp() || nr.TypeIsOwner() || nr.TypeIsCustomer())
                            {
                                _this[nr.Name.ToLower() + "name"] = null;
                            }
                        }
                    }
                }
            }
            var list = data.Items;

            //aggregation
            if (list.NotEmpty() && queryView.AggregateConfig.IsNotEmpty())
            {
                var aggFields = new List <AggregateExpressionField>().DeserializeFromJson(queryView.AggregateConfig);
                if (aggFields.NotEmpty())
                {
                    var aggExp = new AggregateExpression
                    {
                        ColumnSet       = _fetchDataService.QueryExpression.ColumnSet,
                        Criteria        = _fetchDataService.QueryExpression.Criteria,
                        EntityName      = _fetchDataService.QueryExpression.EntityName,
                        LinkEntities    = _fetchDataService.QueryExpression.LinkEntities,
                        AggregateFields = aggFields
                    };
                    var aggDatas = _aggregateService.Execute(aggExp);
                    var aggData  = aggDatas.NotEmpty() ? aggDatas.First() : null;
                    if (aggData != null)
                    {
                        var tmpRow     = list.First() as IDictionary <string, object>;
                        var aggRow     = new Dictionary <string, object>();
                        var aggDataRow = aggData as IDictionary <string, object>;
                        foreach (var r in tmpRow)
                        {
                            var aggf = aggFields.Find(n => n.AttributeName.IsCaseInsensitiveEqual(r.Key));
                            if (aggf != null)
                            {
                                aggRow[r.Key] = aggDataRow[aggf.AttributeName.ToLower()];
                            }
                            else
                            {
                                aggRow[r.Key] = null;
                            }
                        }
                        list.Add(aggRow);
                    }
                }
            }
            return(ToExcelStream(list, fileName, columnNames, hideColumns, title, _fetchDataService.QueryResolver.AttributeList));
        }
예제 #11
0
        public IActionResult GridView([FromBody] EntityGridModel model)
        {
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryViewId.HasValue && !model.QueryViewId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryViewId.Value);
            }
            else if (model.EntityId.HasValue && !model.EntityId.Value.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityId.Value);
            }
            else if (model.EntityName.IsNotEmpty())
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityName);
            }
            else
            {
                return(NotFound());
            }
            if (queryView == null)

            {
                return(NotFound());
            }
            if (!queryView.IsDefault && queryView.AuthorizationEnabled)
            {
                if (!_roleObjectAccessService.Exists(queryView.QueryViewId, QueryViewDefaults.ModuleName, CurrentUser.Roles.Select(n => n.RoleId).ToArray()))
                {
                    return(Unauthorized());
                }
            }
            //EntityGridModel model = new EntityGridModel();
            model.QueryView    = queryView;
            model.EntityId     = queryView.EntityId;
            model.QueryViewId  = queryView.QueryViewId;
            model.TargetFormId = queryView.TargetFormId;
            if (model.IsEnabledViewSelector)
            {
                model.QueryViews = _queryViewFinder.QueryAuthorized(n => n.Where(f => f.EntityId == model.EntityId && f.StateCode == RecordState.Enabled)
                                                                    .Sort(s => s.SortAscending(f => f.Name)));
            }
            if (!model.PageSizeBySeted && CurrentUser.UserSettings.PagingLimit > 0)
            {
                model.PageSize = CurrentUser.UserSettings.PagingLimit;
            }
            FetchDescriptor fetch = new FetchDescriptor
            {
                User        = CurrentUser,
                Page        = model.Page,
                PageSize    = model.PageSize,
                FetchConfig = queryView.FetchConfig
            };

            if (model.IsSortBySeted)
            {
                QueryColumnSortInfo sort = new QueryColumnSortInfo(model.SortBy, model.SortDirection == 0);
                fetch.Sort = sort;
            }
            fetch.Filter = model.Filter;

            if (model.Q.IsNotEmpty())
            {
                fetch.Keyword = model.Q;
                fetch.Field   = model.QField;
            }
            //buttons
            if (model.IsShowButtons)
            {
                FilterContainer <RibbonButton.Domain.RibbonButton> buttonFilter = FilterContainerBuilder.Build <RibbonButton.Domain.RibbonButton>()
                                                                                  .And(w => w.StateCode == RecordState.Enabled && w.EntityId == model.EntityId.Value &&
                                                                                       (w.ShowArea == RibbonButtonArea.ListHead || w.ShowArea == RibbonButtonArea.ListRow));
                if (model.QueryView.IsCustomButton && model.QueryView.CustomButtons.IsNotEmpty())
                {
                    List <Guid> buttonid = new List <Guid>();
                    buttonid = buttonid.DeserializeFromJson(model.QueryView.CustomButtons);
                    buttonFilter.And(w => w.RibbonButtonId.In(buttonid));
                }
                var buttons = _ribbonbuttonFinder.Query(n => n
                                                        .Where(buttonFilter)
                                                        .Sort(s => s.SortAscending(f => f.DisplayOrder)));
                model.RibbonButtons = buttons;
            }

            //var datas = _fetchService.Execute(fetch);
            _fetchDataService.GetMetaDatas(fetch);
            model.Grid             = _gridService.Build(queryView, _fetchDataService.QueryResolver.EntityList, _fetchDataService.QueryResolver.AttributeList);
            model.EntityList       = _fetchDataService.QueryResolver.EntityList;
            model.AttributeList    = _fetchDataService.QueryResolver.AttributeList;
            model.RelationShipList = _fetchDataService.QueryResolver.RelationShipList;
            //model.Items = datas.Items;
            //model.TotalItems = datas.TotalItems;
            //model.TotalPages = datas.TotalPages;
            //aggregation
            if (queryView.AggregateConfig.IsNotEmpty())
            {
                var aggFields = new List <AggregateExpressionField>().DeserializeFromJson(queryView.AggregateConfig);
                if (aggFields.NotEmpty())
                {
                    var aggExp = new AggregateExpression
                    {
                        ColumnSet       = _fetchDataService.QueryExpression.ColumnSet,
                        Criteria        = _fetchDataService.QueryExpression.Criteria,
                        EntityName      = _fetchDataService.QueryExpression.EntityName,
                        LinkEntities    = _fetchDataService.QueryExpression.LinkEntities,
                        AggregateFields = aggFields
                    };
                    var aggDatas = _aggregateService.Execute(aggExp);
                    model.AggregationData = aggDatas.NotEmpty() ? aggDatas.First() : null;
                    model.AggregateFields = aggFields;
                }
            }
            if (model.IsSortBySeted == false)
            {
                if (_fetchDataService.QueryExpression.Orders.NotEmpty())
                {
                    model.SortBy        = _fetchDataService.QueryExpression.Orders[0].AttributeName;
                    model.SortDirection = (int)_fetchDataService.QueryExpression.Orders[0].OrderType;
                }
            }
            //字段权限
            model.NonePermissionFields = _fetchDataService.NonePermissionFields;

            return(View($"~/Views/Entity/{WebContext.ActionName}.cshtml", model));
        }
예제 #12
0
        public IActionResult RecordsDialog([FromBody] SelectEntityRecordsDialogModel model, DialogModel dm)
        {
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryId.HasValue && !model.QueryId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryId.Value);
            }
            else if (model.EntityId.HasValue && !model.EntityId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityId.Value);
            }
            else if (model.EntityName.IsNotEmpty())
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityName);
            }
            else
            {
                return(NotFound());
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            model.QueryId   = queryView.QueryViewId;
            model.QueryView = queryView;
            model.EntityId  = queryView.EntityId;

            FetchDescriptor fetch = new FetchDescriptor
            {
                User        = CurrentUser,
                Page        = model.Page,
                PageSize    = model.PageSize,
                FetchConfig = queryView.FetchConfig
            };

            if (model.IsSortBySeted)
            {
                QueryColumnSortInfo sort = new QueryColumnSortInfo(model.SortBy, model.SortDirection == 0);
                fetch.Sort = sort;
            }
            if (model.Q.IsNotEmpty())
            {
                fetch.Keyword = model.Q;
                fetch.Field   = model.QField;
            }
            if (model.Filter == null)
            {
                model.Filter = new FilterExpression();
            }
            //filter disabled records
            if (model.OnlyEnabledRecords)
            {
                if (model.Filter.Conditions.IsEmpty() || model.Filter.Conditions.Find(n => n.AttributeName.IsCaseInsensitiveEqual("statecode")) == null)
                {
                    model.Filter.AddCondition("statecode", ConditionOperator.Equal, 1);
                }
            }
            //filter by relationship
            if (model.RelationShipName.IsNotEmpty())
            {
                var relationship = _relationShipFinder.FindByName(model.RelationShipName);
                if (relationship != null && model.ReferencedRecordId.HasValue && !model.ReferencedRecordId.Value.Equals(Guid.Empty))
                {
                    var condition = new ConditionExpression(relationship.ReferencingAttributeName, ConditionOperator.Equal, model.ReferencedRecordId);
                    model.Filter.AddCondition(condition);
                }
                model.RelationShipMeta = relationship;
            }
            fetch.Filter = model.Filter;

            var datas = _fetchDataService.Execute(fetch);

            model.Grid             = _gridService.Build(queryView, _fetchDataService.QueryResolver.EntityList, _fetchDataService.QueryResolver.AttributeList);
            model.EntityList       = _fetchDataService.QueryResolver.EntityList;
            model.AttributeList    = _fetchDataService.QueryResolver.AttributeList;
            model.RelationShipList = _fetchDataService.QueryResolver.RelationShipList;
            model.Items            = datas.Items;
            model.TotalItems       = datas.TotalItems;
            if (model.IsSortBySeted == false)
            {
                if (_fetchDataService.QueryExpression.Orders.NotEmpty())
                {
                    model.SortBy        = _fetchDataService.QueryExpression.Orders[0].AttributeName;
                    model.SortDirection = (int)_fetchDataService.QueryExpression.Orders[0].OrderType;
                }
            }

            ViewData["DialogModel"] = dm;
            return(View($"~/Views/Entity/{WebContext.ActionName}.cshtml", model));
        }
예제 #13
0
        public IActionResult Post([FromBody] EntityGridModel model)
        {
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryViewId.HasValue && !model.QueryViewId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryViewId.Value);
            }
            else if (model.EntityId.HasValue && !model.EntityId.Value.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityId.Value);
            }
            else if (model.EntityName.IsNotEmpty())
            {
                queryView = _queryViewFinder.FindEntityDefaultView(model.EntityName);
            }
            else
            {
                return(NotFound());
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            if (!queryView.IsDefault && queryView.AuthorizationEnabled)
            {
                if (!_roleObjectAccessService.Exists(queryView.QueryViewId, QueryViewDefaults.ModuleName, CurrentUser.Roles.Select(n => n.RoleId).ToArray()))
                {
                    return(Unauthorized());
                }
            }
            model.QueryView = queryView;
            model.EntityId  = queryView.EntityId;

            FetchDescriptor fetch = new FetchDescriptor
            {
                Page        = model.Page,
                PageSize    = model.PageSize,
                FetchConfig = queryView.FetchConfig,
                GetAll      = !model.PagingEnabled
            };

            if (model.IsSortBySeted)
            {
                QueryColumnSortInfo sort = new QueryColumnSortInfo(model.SortBy, model.SortDirection == 0);
                fetch.Sort = sort;
            }
            //查询关键字
            if (model.Q.IsNotEmpty())
            {
                fetch.Keyword = model.Q;
                fetch.Field   = model.QField;
            }
            var canFetch = true;

            //filter by relationship
            if (model.RelationShipName.IsNotEmpty())
            {
                var relationship = _relationShipFinder.FindByName(model.RelationShipName);
                if (relationship != null && model.ReferencedRecordId.HasValue && !model.ReferencedRecordId.Value.Equals(Guid.Empty))
                {
                    if (model.Filter == null)
                    {
                        model.Filter = new FilterExpression();
                    }
                    var condition = new ConditionExpression(relationship.ReferencingAttributeName, ConditionOperator.Equal, model.ReferencedRecordId);
                    model.Filter.AddCondition(condition);
                }
                model.RelationShipMeta = relationship;
            }
            if (model.RelationShipName.IsNotEmpty() && (!model.ReferencedRecordId.HasValue || model.ReferencedRecordId.Value.Equals(Guid.Empty)))
            {
                //如果被引用ID为空,则不查询数据
                canFetch = false;
            }
            fetch.Filter = model.Filter;
            if (canFetch)
            {
                fetch.User = CurrentUser;
                var datas = _fetchService.Execute(fetch);
                return(Content(datas.SerializeToJson()));
            }
            if (!model.IsSortBySeted)
            {
                if (_fetchService.QueryExpression.Orders.NotEmpty())
                {
                    model.SortBy        = _fetchService.QueryExpression.Orders[0].AttributeName;
                    model.SortDirection = (int)_fetchService.QueryExpression.Orders[0].OrderType;
                }
            }
            return(View($"~/Views/Entity/{WebContext.ActionName}.cshtml", model));
        }
예제 #14
0
        public IActionResult KanbanView([FromBody, FromQuery] KanbanGridModel model)
        {
            if (model.AggregateField.IsEmpty() || model.GroupField.IsEmpty())
            {
                return(JError("请指定统计字段及分组字段"));
            }
            QueryView.Domain.QueryView queryView = null;
            if (model.QueryId.HasValue && !model.QueryId.Equals(Guid.Empty))
            {
                queryView = _queryViewFinder.FindById(model.QueryId.Value);
            }
            if (queryView == null)
            {
                return(NotFound());
            }
            if (!queryView.IsDefault && queryView.AuthorizationEnabled)
            {
                if (!_roleObjectAccessService.Exists(queryView.QueryViewId, QueryViewDefaults.ModuleName, CurrentUser.Roles.Select(n => n.RoleId).ToArray()))
                {
                    return(Unauthorized());
                }
            }
            model.QueryView  = queryView;
            model.EntityId   = queryView.EntityId;
            model.QueryId    = queryView.QueryViewId;
            model.EntityName = _entityFinder.FindById(model.EntityId.Value).Name;
            var attributes = new List <Schema.Domain.Attribute>();
            var aggAttr    = _attributeFinder.Find(model.EntityId.Value, model.AggregateField);

            attributes.Add(aggAttr);
            var queryExp = new QueryExpression();

            queryExp = queryExp.DeserializeFromJson(queryView.FetchConfig);
            var orderExp = new OrderExpression("createdon", OrderType.Descending);

            queryExp.Orders.Add(orderExp);
            Dictionary <string, AggregateType> attributeAggs = new Dictionary <string, AggregateType>();

            if (aggAttr.TypeIsInt() || aggAttr.TypeIsFloat() || aggAttr.TypeIsDecimal() || aggAttr.TypeIsMoney())
            {
                attributeAggs.Add(model.AggregateField, AggregateType.Sum);
                model.AggType = AggregateType.Sum;
            }
            else
            {
                attributeAggs.Add(model.AggregateField, AggregateType.Count);
                model.AggType = AggregateType.Count;
            }
            var datas = _aggregateService.Execute(queryExp, attributeAggs, new List <string>()
            {
                model.GroupField
            });

            model.Items = datas;
            queryExp.ColumnSet.Columns.Clear();
            queryExp.ColumnSet.AddColumns("createdon", model.AggregateField, model.GroupField, "ownerid");
            model.GroupingDatas = _aggregateService.GroupingTop(model.GroupingTop, model.GroupField, queryExp, orderExp);
            var groupAttr = _attributeFinder.Find(model.EntityId.Value, model.GroupField);

            groupAttr.OptionSet = _optionSetFinder.FindById(groupAttr.OptionSetId.Value);
            attributes.Add(groupAttr);
            model.AttributeList = attributes;
            return(View($"~/Views/Entity/{WebContext.ActionName}.cshtml", model));
        }