Запуск процесса или сервиса по действию в карточке
Задача: Необходимо по действию из карточки редактирования запустить бизнес-процес, с несколькими начальными значениями.
Решение:
1. Необходимо заместить метод getActions, добавив в него описание вашего действия:
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 необходимо добавить примерно следующий код:
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 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'а:
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. Для корректного вызова сервиса, сам сервис должен иметь примерно следующую сигнатуру объявления:
[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;
}
}