Шаг 5. Создайте пользовательский веб-сервис

Основы

На предыдущем шаге мы реализовали автоматическое заполнение расписания групповых занятий.

Теперь реализуем пользовательский веб-сервис, который будет предоставлять информацию о количестве занятий в расписании. Для вызова веб-сервиса добавим кнопку Web service на страницу записи.

Создать пользовательский веб-сервис  

  1. Перейдите в раздел Конфигурация (Configuration).
  2. В списке пакетов выберите пакет "TryItPackage".
  3. На панели инструментов рабочей области нажмите кнопку Добавить (Add) и выберите в списке тип конфигурационного элемента Исходный код (Source code).

    scr_SourceCode.png
  4. Заполните поля свойств схемы значениями:
    • Код (Code) — "UsrGroupSectionService".
    • Заголовок (Title) — "Group section service".
    scr_SourceCodeProps.png
  5. В дизайнере схем добавьте исходный код.

    UsrGroupSectionService.cs
    namespace Terrasoft.Configuration.UsrGroupSectionService
    {
        using System;
        using System.ServiceModel;
        using System.ServiceModel.Web;
        using System.ServiceModel.Activation;
        using Terrasoft.Core;
        using Terrasoft.Core.DB;
        using Terrasoft.Common;
        using Terrasoft.Web.Common;
        using Terrasoft.Core.Entities; 
    
        [ServiceContract]
        [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
        public class UsrGroupSectionService: BaseService
        {
    
            [OperationContract]
            [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
            ResponseFormat = WebMessageFormat.Json)]
            public int GetTrainingsQuantity(string code) {
                var groupSectionQuery = new Select(UserConnection)
                    .Column("Id")
                    .From("UsrGroupSections")
                    .Where("UsrCode")
                        .IsEqual(Column.Parameter(code))
                    as Select;
                Guid id = groupSectionQuery.ExecuteScalar<Guid>();
                if (id==Guid.Empty) {
                    return -1;
                }
                var countQuery = new Select(UserConnection)
                    .Column(Func.Count("Id")).As("Count")
                    .From("UsrGroupTrainings")
                    .Where("UsrGroupSectionsId")
                        .IsEqual(Column.Parameter(id))
                    as Select;
                int result = countQuery.ExecuteScalar<int>();
                
                return result;
            }
        }
    }
  6. Сохраните схему, нажав на кнопку Опубликовать (Publish).

Отредактировать исходный код страницы  

На страницу групповой секции добавьте кнопку, которая будет вызывать веб-сервис и выводить количество занятий в расписании во всплывающем окне.

  1. Перейдите в раздел Конфигурация (Configuration).
  2. В списке пакетов выберите пакет "TryItPackage".
  3. В результате работы мастеров в пакете уже содержатся схемы разных типов. С помощью сортировки по типу схем выберите для отображения только схемы с типом Клиентский модуль (Client module).

    scr_Client_Module.png
  4. Двойным нажатием мыши откройте схему UsrGroupSections1Page.
  5. Добавьте в схему новую локализуемую строку, которая будет использоваться для названия кнопки.

    В блоке Локализуемые строки (Localizable strings) панели свойств нажмите кнопку и заполните свойства локализуемой строки:

    • Код (Code) — "GetServiceInfoButtonCaption".
    • Значение (Value) — "WebService".
    scr_LocalizableString.png
  6. Отредактируйте исходный код:

    UsrGroupSections1Page.js
    define("UsrGroupSections1Page", ["ServiceHelper", "ProcessModuleUtilities"], function(ServiceHelper, ProcessModuleUtilities) {
    	return {
    		entitySchemaName: "UsrGroupSections",
    		/* Без изменений. */
    		messages: {
    			// ...
    		},
    		
    		/* Без изменений. */
    		attributes: {
    			// ...
    		},
    		
    		modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
    		
    		// Без изменений.
    		details: /**SCHEMA_DETAILS*/{
    				// ...
    		}/**SCHEMA_DETAILS*/,
    		
    		businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
    		
    		/* Добавляем новый метод к существующим. */
    		methods: {
    			
    			// ...
    			
    			/* Метод-обработчик нажатия кнопки. */
    			onGetServiceInfoClick: function() { 
    				/* Получаем код секции, для передачи в качестве входящего параметра метода сервиса. */
    				var code = this.get("UsrCode");
    				var serviceData = {
    					code: code
    				};
    				/* Вызов метода сервиса. */
    				ServiceHelper.callService("UsrGroupSectionService", "GetTrainingsQuantity",
    					function(response) {
    						var result = response.GetTrainingsQuantityResult;
    						/* Отображение результата выполнения метода сервиса во всплывающем окне. */
    						this.showInformationDialog(result);
    					}, serviceData, this);
    			}
    		},
    		dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
    		
    		/* Добавляем отображение кнопки на странице записи. */
    		diff: /**SCHEMA_DIFF*/[
    		
    			// ...
    			/* Добавляем элемент кнопка на страницу записи. */
    			{
    				"operation": "insert",
    				/* Имя родительского элемента. */
    				"parentName": "ActionButtonsContainer",
    				"propertyName": "items",
    				/* Имя элемента. */
    				"name": "GetServiceInfoButton",
    				"values": {
    					/* Тип элемента - кнопка. */
    					itemType: Terrasoft.ViewItemType.BUTTON,
    					/* Заголовок элемента получаем из локализованной строки. */
    					caption: {bindTo: "Resources.Strings.GetServiceInfoButtonCaption"},
    					/* Метод-обработчик нажатия кнопки. */
    					click: {bindTo: "onGetServiceInfoClick"},
    					enabled: true,
    					/* Позиция кнопки на странице. */
    					"layout": {"column": 1, "row": 6, "colSpan": 2, "rowSpan": 1}
    				}
    			},
    		
    		]/**SCHEMA_DIFF*/
    	};
    });
  7. Сохраните схему, нажав на кнопку Сохранить (Save).

В результате мы реализовали веб-сервис, который возвращает количество занятий групповой секции.

scr_Step5_Result.png