Публикация

Запуск процесса или сервиса по действию в карточке

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

Решение:
1. Необходимо заместить метод getActions, добавив в него описание вашего действия:

getActions: function () {
   var actionMenuItems = this.callParent(arguments);
   actionMenuItems.addItem(this.getActionsMenuItem({
      Type: "Terrasoft.MenuSeparator",
      Caption: ""
   }));
   actionMenuItems.add("CreateLead", this.getActionsMenuItem({
      Caption: this.get("Resources.Strings.CreateLeadCaption"),
      Tag: "createLead"
   }));
   return actionMenuItems;
}

2. Далее, в функции createLead необходимо добавить примерно следующий код:

MaskHelper.ShowBodyMask();//добавляем отображение маски загрузки (для корректной работы необходимо добавить MaskHelper в блок dependencies карточки)
Terrasoft.AjaxProvider.request({
   url: Terrasoft.workspaceBaseUrl + "/ServiceModel/ProcessEngineService.svc/" +
   "{YOUR_PROCESS_NAME_HERE}/Execute?{FIRST_PARAMETER_NAME}=" + this.get("Id") + "&{SECOND_PARAMETER_NAME}=" + {SECOND_PARAMETER_VALUE},
   method: "POST",
   jsonData: {},
   scope: this,
   callback: function () {
        //здесь можно написать постобработку выполненного процесса
      MaskHelper.HideBodyMask();
   }
});

Рассмотрим второй кейс, когда необходимо по действию запустить сервис с некоторыми начальными входными данными

Решение
1. Заместить метод getActions, добавив в него описание вашего действия.
2. В функцию обработчик дописать логику вызова сервиса.
3. Чтобы вызвать сервис, есть два способа. 1 - функция callService, реализована в BaseSchemaViewModel или в ServiceHelper, 2 - самостоятельно описать вызов сервиса. Ниже будут показаны два примера вызова сервисов.
4.Вызов с помощью callService:

var objConfig = this.getObjConfig(); //самописный метод, подготавливающий конфиг и данные для сервиса
var config = {
   serviceName: "{YOUR_SERVICE_NAME}",
   methodName: "{YOUR_SERVICE_METHOD_NAME}",
   data: {
      request: {
         ProductsInObjIds: objConfig.ProductsInObjIds,
         ResourcesInObjIds: objConfig.ResourcesInObjIds,
         ObjSchemaName: objConfig.objSchemaName,
         ObjValue: objConfig.objValue
      }
   }
};
this.callService(config, callback, this);

5. Вызов с помощью AjaxProvider'а:

Terrasoft.AjaxProvider.request({
   url: Terrasoft.workspaceBaseUrl + '/rest/SomeService/' + 'SomeServiceMethodUriTemplate',
   headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
   },
   method: 'POST',
   jsonData: data || {}, //некоторые данные в формате JSON которые необходимо передать сервису
   callback: function(request, success, response) {
    //постобработка вызова сервиса
      if (success) {
         responseObject = Terrasoft.decode(response.responseText);
      }
      callback.call(this, responseObject);
   },
   scope: this
});

6. Для корректного вызова сервиса, сам сервис должен иметь примерно следующую сигнатуру объявления:

 [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class SomeService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "SomeServiceMethodUriTemplate", BodyStyle = WebMessageBodyStyle.Wrapped,
            RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
        public string SomeServiceMethod(string someParam1, string someParam2)
        {
           string result = string.Empty;
             
            //... your code here
 
            return result;
        }
}

Нравится

Поделиться

0 комментариев
Показать все комментарии