Коллеги всем доброго времени суток.

Нужна Ваша помощь.

Написал сервис с методом который принимает следующие параметры:

[OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public void StartProcessWithParameters(string processName, Dictionary<object, object> parameters)
        {
            try
            {
                _logService.RecInfo($"[AutobookingServicesPack]:[AbStartProcessManager]:[StartProcessWithParameters(string processName = '{processName}', Dictionary<string, string> parameters)]: ({parameters.Count()})");
                ProcessSchemaManager processSchemaManager = (ProcessSchemaManager)UserConnection.GetSchemaManager("ProcessSchemaManager");
                ProcessSchema processSchema = processSchemaManager.GetInstanceByName(processName);
                Process process = processSchema.CreateProcess(UserConnection);
                foreach (var parameter in parameters)
                {
                    process.SetPropertyValue(parameter.Key.ToString(), parameter.Value);
                }
                process.Execute(UserConnection);
            }
            catch (Exception e)
            {
                _logService.RecInfo($"[AutobookingServicesPack]:[AbStartProcessManager]:[StartProcess(string processName = '{processName}', Dictionary<string, string> parameters)]:Exception: {e.Message}; {e.InnerException}");
            }
 
        }

Через фидлер кидаю следующий json:

{

    "processName":"AbListenCallAfterCancelationOrderProcess",

    "parameters":{

        "OrderId":"e3f25831-2482-4804-9564-72d6670634a5",

        "CallsId":"e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"

    }

}

В логах СРМ следующее:

[AutobookingServicesPack]:[AbStartProcessManager]:[StartProcessWithParameters(string processName = 'AbListenCallAfterCancelationOrderProcess', Dictionary parameters)]: (0)

Видно, что  processName десерелизовало, а вот parameters нет в Dictionary 0 элементов.

 

Подскажите в чем может быть проблема?

заранее благодарен.

Нравится

4 комментария
Лучший ответ

А еще лучше попробовать так

function toDictionary(obj) {
   var data = [];
   for (var key in obj) {
      data.push({ Key: key, Value: obj[key] });
    }
  return data;
}
 
var _parameters = {}
_parameters ["OrderId"] = "e3f25831-2482-4804-9564-72d6670634a5";
_parameters ["CallsId"] = "e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda";
 
 
 
var serviceData = {
   processName: "XrenyaNerabotaychayaProcess",
   parameters: toDictionary(_parameters)
};
//serviceData  это то что отправляется сервису

Чтобы получить в JSON.stringify(serviceData) чтото типа:

""processName":"XrenyaNerabotaychayaProcess",

"parameters":[

{"Key":"OrderId","Value":"e3f25831-2482-4804-9564-72d6670634a5"},

{"Key":"CallsId","Value":"e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"}

]}"

 

 

 

Попробуйте может WebMessageBodyStyle.Bare вместо Wrapped

Литвинко Павел,

При 

Bare 500 ошибку вываливает

Попробуйте так

В описание метода:

 StartProcessWithParameters(string processName, Dictionary<string, string> parameters)

 

Параметры как то так попытайтесь подставить



"processName":"AbListenCallAfterCancelationOrderProcess",

"parameters":

[{"OrderId" :"e3f25831-2482-4804-9564-72d6670634a5"},

{"CallsId": "e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"}]

}

 

В CallsId будет строка список Id через ; 

А еще лучше попробовать так

function toDictionary(obj) {
   var data = [];
   for (var key in obj) {
      data.push({ Key: key, Value: obj[key] });
    }
  return data;
}
 
var _parameters = {}
_parameters ["OrderId"] = "e3f25831-2482-4804-9564-72d6670634a5";
_parameters ["CallsId"] = "e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda";
 
 
 
var serviceData = {
   processName: "XrenyaNerabotaychayaProcess",
   parameters: toDictionary(_parameters)
};
//serviceData  это то что отправляется сервису

Чтобы получить в JSON.stringify(serviceData) чтото типа:

""processName":"XrenyaNerabotaychayaProcess",

"parameters":[

{"Key":"OrderId","Value":"e3f25831-2482-4804-9564-72d6670634a5"},

{"Key":"CallsId","Value":"e22be6b7-9cf7-ab57-3c0d-bdbfd6a0d168;3fcfab93-c395-7223-ee77-78a0a7efde9b;d2607c8b-7796-bb9b-f06f-aa5280240733;ea465baa-8205-914d-77e4-03a7a7249fda"}

]}"

 

 

 

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

Добрый день.

Есть самописный модуль, в параметры которого необходимо передать filterGroup для выполнения фильтрации внутри модуля.

Пробовал передать просто объект filterGroup - параметр с объектом не передается в модуль.

Пробовал передать 

filterGroup.serialize() 

- при десериализации строки получаю совершенно другую структуру объекта

Terrasoft.deserialize(filterGroup)

При добавлении этого фильтра в ESQ-запрос

происходит ошибка:

"Uncaught TypeError: a.on is not a function"

Подскажите, как корректно:

1. передать объект в параметры модуль?

2. провести сериализацию группы фильтров с последующим 



 

Нравится

2 комментария

ага. упирался уже в данный нюанс. Не могу найти пример с проекта, но фишка в serializationInfo. Вот пример из дефолтной конфигурации:

var serializationInfo = sectionFilters.getDefSerializationInfo();
serializationInfo.serializeFilterManagerInfo = true;
var deserializedFilters = Terrasoft.deserialize(sectionFilters.serialize(serializationInfo));

Попробуйте сериализовать. Прокинуть в модуль строкой, а в модуле десериализовать.



В консоли по быстрому накидал. Посмотрите, как различаются 2 результата десериализации (в моём примере v=Terrasoft.createFilterGroup()):

Варфоломеев Данила,

Огромное спасибо! Всё получилось.

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

Здравствуйте! Помогите пожалуйста решить задачу программной загрузки сервисов из файлов на диске в базу, на C#.
Выполняю следующий метод

//connector - соединение с базой, path - путь к сервису wnd_ContactEdit
private static void LoadAndSaveService(Connector connector, string path)
{
 
   var service = (TSObjectLibrary.IService)connector.Services.GetNewItemByUSI("wnd_ContactEdit");

   var xmlStrogare = new TSObjectLibrary.XMLStorage();
   xmlStrogare.LoadFromFile(path);
   service.Deserialize(xmlStrogare.RootNode);
   connector.Services.SaveItem(service, SaveDatabaseObjectActionEnum.sdoaSave);
}

И возникает ошибка в строчке service.Deserialize(xmlStrogare.RootNode):
Object doesn't support interface {76218379-EDB8-43D5-A106-93A32C30612A} ({76218379-EDB8-43D5-A106-93A32C30612A})
Причем при выполнении того же кода в JavaScript в администраторе все нормально десериализуется и сервис сохраняется.
Версия бинарников 3.3.2.194

Нравится

6 комментариев

Алексей, можете пожалуйста показать код JScript в Администраторе

Метод сериализации в VisualStudio у меня тоже не работал.(Такая же ошибка Object doesn't support interface)

Рабочий код в администраторе Terrasoft, но он заменяет окно редактирования на пустое окно с заголовком

function Main() {
	var service = Connector.Services.GetNewItemByUSI("wnd_ContactEdit");
   	var XMLStorage = new ActiveXObject('TSObjectLibrary.XMLStorage');
	XMLStorage.InitRootNode("Service");
	XMLStorage.RootNode.SetAttributeAsStr("WindowCaption", "Заголовок окна", "");
	service.Deserialize(XMLStorage.RootNode);
    Connector.Services.SaveItem(service, 1);
}

Попытка загрузить тем же способом сервис, выгруженный вручную с помощью "Сохранить в файл" из администратора (приложенный во вложении), не привел к успеху.

function Main() {
	var service = Connector.Services.GetNewItemByUSI("wnd_ContactEdit");
   	var XMLStorage = new ActiveXObject('TSObjectLibrary.XMLStorage');
        XMLStorage.LoadFromFile("C:\\wnd_ContactEdit.xml");
	service.Deserialize(XMLStorage.RootNode);
        Connector.Services.SaveItem(service, 1);
}

На строчке service.Deserialize(XMLStorage.RootNode); выскочила ошибка
TSDskWindowLibrary.DskWindow: Член группы не найден

Здравствуйте Алексей
Воспроизвели данную проблему, передали вопрос в отдел разработки. Я вас проинформирую про решение данного вопроса

Здравствуйте всем
Проблема возникает из-за того, что Вы не корректно объявляете переменные.
Ниже приведен абсолютно работоспособный код:

public bool SaveServiceToDatabase(Connector connector, string serviceFilePath)
        {
            XMLStorage xmlStorage = new XMLStorageClass();
            xmlStorage.LoadFromFile(serviceFilePath);
            string serviceTypeCode;
            string serviceUSI;
            try
            {
                serviceTypeCode = xmlStorage.RootNode.GetAttributeAsStr("ServiceTypeCode", "");
                serviceUSI = xmlStorage.RootNode.GetAttributeAsStr("USI", "");
            }
            catch
            {
                return false;
            }
            ServiceInfo serviceInfo =
                   (TSObjectLibrary.ServiceInfo)сonnector.Services.get_InformationsByUSI(serviceUSI);
            if (serviceInfo != null)
            {
                connector.Services.DeleteItem(serviceUSI, SaveDatabaseObjectActionEnum.sdoaSave);
            }
            Service service = (TSObjectLibrary.Service)connector.Services.CreateItem(serviceTypeCode);
            service.Deserialize(xmlStorage.RootNode);
            connector.Services.SaveItem(service, SaveDatabaseObjectActionEnum.sdoaSave);
            return true;
        }

Также, при работе с загрузкой сервисов следует учесть, что если сервис уже существует, то при Deserialize (его же xml файл) он начнет выдавать ошибки типа "Component named btnOk already exist". Таким образом, в приведенном выше коде делается проверка на существование сервиса и последующего его удаления.

Большое спасибо за помощь!
Код действительно рабочий!

Единственное что хотелось бы добавить, что если мы сохраняем сервис таблицы, то в строчке

connector.Services.DeleteItem(serviceUSI, SaveDatabaseObjectActionEnum.sdoaSave);

происходит удаление таблицы из базы вместе со всеми данными, что недопустимо.
Конкретно у меня, на этой строчке вылетела ошибка связанная с ForeignKey.

Действительно не нужно удалять сервис, нужно создавать новый, в него все десериализировать и сохранить. Вот код:

public bool SaveServiceToDatabase(Connector connector, string serviceFilePath)
        {
            XMLStorage xmlStorage = new XMLStorageClass();
            xmlStorage.LoadFromFile(serviceFilePath);
            string serviceTypeCode;
            try
            {
                serviceTypeCode = xmlStorage.RootNode.GetAttributeAsStr("ServiceTypeCode", "");
            }
            catch
            {
                return false;
            }
            Service service = (TSObjectLibrary.Service)connector.Services.CreateItem(serviceTypeCode);
            service.Deserialize(xmlStorage.RootNode);
            connector.Services.SaveItem(service, SaveDatabaseObjectActionEnum.sdoaSave);
            return true;
        }
Показать все комментарии