Этап 6. Создание
веб-сервиса
Создание веб-сервиса
Для создания пользовательского сервиса необходимо наследоваться от базового класса «BaseService». Кроме наследования от базового класса также необходимо добавить атрибуты к классу и методу сервиса. Технология сервисов BPMSoft базируется на технологии WCF от Microsoft.
Алгоритм создания сервиса:
- Откройте раздел «Конфигурация».
- Выберите ранее созданный пакет.
- Нажмите «Добавить», после выберите «Исходный код».
Рисунок 1 — Добавление элемента

- Заполните поля следующим образом:
Рисунок 2 — Заполнение полей элемента «Исходный код»

- Добавьте код:
namespace BPMSoft.Configuration.BpmDayOfferAmountService
{
using System.ServiceModel;
using System.ServiceModel.Web;
using System.ServiceModel.Activation;
using BPMSoft.Core;
using BPMSoft.Web.Common;
using BPMSoft.Core.Entities;
using System.Linq;
/// <summary>
/// Сервис расчета стоимости товаров в предложении дня.
/// </summary>
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class BpmDayOfferAmountService : BaseService
{
/// <summary>
/// Возвращает сумму товаров в предложении дня.
/// </summary>
/// <param name="offerName">Название предложения дня</param>
[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
public decimal GetOfferAmount(string offerName)
{
if (string.IsNullOrWhiteSpace(offerName))
{
return -1;
}
// Создаем экземпляр EntitySchemaQuery для создания запроса к объекту BpmProductInDeal
var esqOfferOfTheDay = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "BpmProductInDeal");
// Добавляем в результирующую выборку колонку BpmProductPrice объекта BpmProduct
var price = esqOfferOfTheDay.AddColumn("BpmProduct.BpmProductPrice").Name;
// Создаем фильтр записи "Продукт в предложении дня" по имени предложения дня
var offerNameFilter = esqOfferOfTheDay.CreateFilterWithParameters(
FilterComparisonType.Equal, "BpmDealsOfDay.BpmName", offerName);
// Применяем созданный фильтр к выборке
esqOfferOfTheDay.Filters.Add(offerNameFilter);
// Получаем коллекцию записей
var resultCollection = esqOfferOfTheDay.GetEntityCollection(UserConnection);
if (resultCollection.Count() > 0)
{
decimal amount = 0;
foreach (var entity in resultCollection)
{
// Суммируем цену продуктов из выборки
amount += entity.GetTypedColumnValue<decimal>(price);
}
return amount;
}
return -1;
}
}
}
- Опубликуйте сервис, нажав кнопку «Опубликовать».
Рисунок 3 — Публикация сервиса

Вызов сервиса из клиентской схемы
Для вызова сервиса из страницы редактирования предложения дня, необходимо добавить кнопку и написать к ней обработчик нажатия.
- Откройте раздел «Конфигурация».
- Выберите ранее созданный пакет.
- Используя фильтры, найдите «Страница редактирования: "Предложения дня"».
Рисунок 4 — Страница редактирования: «Предложения дня»

- Откройте схему.
- Добавьте локализуемую строку.
Рисунок 5 — Создание новой локализуемой строки

- Измените исходный код:
// Для вызова пользовательского сервиса из клиентской части необходимо добавить модуль ServiceHelper
define("BpmDealsOfDayPage", ["ServiceHelper", "ProcessModuleUtilities"], function(ServiceHelper, ProcessModuleUtilities) {
return {
entitySchemaName: "BpmDealsOfDay",
/** Свойство messages остается без изменений */
messages: {},
/** Свойство attributes остается без изменений */
attributes: {},
/** Свойство modules остается без изменений */
modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
/** Свойство details остается без изменений */
details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
/** Свойство businessRules остается без изменений */
businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
/** В свойство methods добавим обработчик нажатия на кнопку */
methods: {
// Методы из шага 5 Автозаполенения предложения дня остаются без изменений.
/* Обработчик нажатия кнопки */
onCalculateAmountButtonClick: function(){
// Получаем имя предложения дня
let offerName = this.get("BpmName");
// Параметры сервиса
let data = {
offerName : offerName
};
// Вызываем сервис, для вызова сервиса необходимо подключить модуль ServiceHelper
ServiceHelper.callService("BpmDayOfferAmountService", "GetOfferAmount", function(response){
// Колбек функция.
// Получаем результат работы сервиса
let result = response.GetOfferAmountResult;
// Выводим пользователю информацию
this.showInformationDialog("Сумма продуктов в предложении дня " + result);
}, data, this);
}
},
/** Свойство dataModels остается без изменений */
dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
/** В свойство diff добавим кнопку. */
diff: /**SCHEMA_DIFF*/[
{
"operation": "insert",
"name": "CalculateAmountButton",
"values": {
"layout": {
"colSpan": 24,
"rowSpan": 1,
"column": 0,
"row": 2,
"layoutName": "ProfileContainer"
},
"itemType": 5,
"caption": {
"bindTo": "Resources.Strings.BpmGetOfferAmountButtonName"
},
"click": {
"bindTo": "onCalculateAmountButtonClick"
}
},
"parentName": "ProfileContainer",
"propertyName": "items",
"index": 7
},
/** Остальные элементы свойства diff без изменений */
]/**SCHEMA_DIFF*/
};
});
- Сохраните изменения.
Результат выполнения задачи:
Рисунок 6 — Кнопка «Посчитать сумму продуктов»

Рисунок 7 — Результат работы сервиса

Рекомендуем изучить
Начало разработки
Этап 5. Автозаполнение предложения дня
Перенос приложения