Всем добрый день!

Друзья, подскажите, пожалуйста, кто-нибудь работал с деталью на странице портала самообслуживания?

Для бандла service сейчас пытаюсь реализовать деталь с редактируемым реестром, чтобы можно было указывать в заявке несколько значений из справочника. Всем известно, что, когда пытаешься добавить в деталь новое значение, то вызывается метод, который сохраняет родительскую запись, так как запись детали обязательно должна быть связана с родительской записью. Можно как-то добавить в деталь запись, не вызывая метод, который сохраняет родителя, но при этом, чтобы после сохранения родителя, в детали все корректно связалось? Как-то же это реализовано для файлов например.

Нравится

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

Это ещё реализовано и в Средствах связи

Как отключить логику сохранения раздела при добавлении на деталь, обсуждают тут, но для момента до первого сохранения так не подойдёт, данные нужно где-то хранить.

В средствах связи, схеме ContactCommunicationDetailV2 добавленные и удалённые складываются в две коллекции Collection и DeletedItems и при сохранении из них извлекаются и идут на сервер одним составным запросом:

deleteItem: function(item) {
	var deletedItems = this.get("DeletedItems");
	var collection = this.get("Collection");
	collection.removeByKey(item.get("Id"));
	deletedItems.addItem(item);
},
 
addItem: function(tag) {
	if (this.get("IsDetailCollapsed")) {
		return;
	}
	var communicationTypes = this.get("CommunicationTypes");
	var communicationType = communicationTypes.get(tag);
	var newItem = this.Ext.create("Terrasoft.BaseCommunicationViewModel", {
		entitySchema: this.entitySchema,
		columns: this.columns
	});
	newItem.set("CommunicationTypes", communicationTypes);
	newItem.sandbox = this.sandbox;
	newItem.setDefaultValues(function() {
		newItem.set("CommunicationType", {
			value: communicationType.get("Id"),
			displayValue: communicationType.get("Name")
		});
		newItem.set("Contact", {
			value: this.get("MasterRecordId")
		});
		var itemKey = newItem.get("Id");
		var collection = this.get("Collection");
		collection.add(itemKey, newItem);
		this.changeCardPageButtonsVisibility(true);
	}, this);
	return newItem;
},
 
...
 
getDeleteItemsQueries: function() {
	var deletedItems = this.get("DeletedItems");
	var deleteQueries = [];
	deletedItems.each(function(item) {
		var primaryColumnValue = item.get(item.primaryColumnName);
		var deleteQuery = item.getDeleteQuery();
		deleteQuery.enablePrimaryColumnFilter(primaryColumnValue);
		deleteQueries.push(deleteQuery);
	}, this);
	return deleteQueries;
},
 
getSaveItemsQueries: function() {
	var collection = this.get("Collection");
	var saveQueries = [];
	collection.each(function(item) {
		if (item.isChanged() && item.validate()) {
			saveQueries.push(item.getSaveQuery());
		}
	}, this);
	return saveQueries;
},
 
...
 
save: function() {
	var restrictionsQuery = this.getSaveRestrictionsQuery();
	var queries = restrictionsQuery ? [restrictionsQuery] : [];
	var saveQueries = this.getSaveItemsQueries();
	queries = queries.concat(saveQueries);
	var deleteQueries = this.getDeleteItemsQueries();
	queries = queries.concat(deleteQueries);
	if (Ext.isEmpty(queries)) {
		this.publishSaveResponse({
			success: true
		});
		return true;
	}
	var batchQuery = Ext.create("Terrasoft.BatchQuery");
	Terrasoft.each(queries, function(query) {
		batchQuery.add(query);
	}, this);
	batchQuery.execute(this.onSaved, this);
	return true;
},
 
onSaved: function(response) {
	var message = response.ResponseStatus && response.ResponseStatus.Message;
	if (response.success && !message) {
		var deletedItems = this.get("DeletedItems");
		var collection = this.get("Collection");
		collection.each(function(item) {
			item.isNew = false;
			item.changedValues = null;
		}, this);
		deletedItems.clear();
		this.publishSaveResponse(response);
	} else {
		this.publishSaveResponse({
			success: false,
			message: this.getValidationMessage(message)
		});
	}
},

 

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

Добрый день! Возник вопрос с заимствованием функциональности из готовых решений. К примеру, используется продукт Sales, в который требуется добавить функциональность работы с email из Service.  Покупать целый продукт service нецелесообразно, большая часть функциональности не будет использована.

Как будет корректней поступить в этом случае?

 

Нравится

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

Зверев Александр,

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

Во-первых, как ты уже написал есть ряд проверок, которые нельзя обойти.

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

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

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

Также уже на усмотрение компании Terrasoft эту функциональность можно включить в бесплатную функциональность платформы, либо за дополнительную плату предоставлять тем, кому она нужна.

Добрый день.

 

Уточните, о какой именно функциональности идет речь?

Алла Савельева,

 Возможность регистрировать обращения из email, объединения нескольких писем в одну цепочку, связанную с объектом.

Searcher,

Попробуйте реализовать нужную Вам функциональность по аналогии с уже реализованной в Service.

Спасибо

Обратите внимание, что у Service есть несколько версий, отличающихся функциональностью и ценой. На калькуляторе стоимости можно подсчитать, сколько будет стоить сочетание Sales и Service.

 

По поводу копирования из одного продукта в другой, в ядре есть проверки наличия лицензий на ту или иную сущность. Да и, наверняка, такое нарушает лицензионные соглашения.

Зверев Александр,

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

Во-первых, как ты уже написал есть ряд проверок, которые нельзя обойти.

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

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

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

Также уже на усмотрение компании Terrasoft эту функциональность можно включить в бесплатную функциональность платформы, либо за дополнительную плату предоставлять тем, кому она нужна.

Алла, не всегда всё можно реализовать самостоятельно, даже во всём разобравшись. Тут недавно был аналогичный вопрос по поводу переноса рассылок из Marketing, там это ещё более очевидно, логика отправки вынесена даже за пределы ядра на отдельный  общий для всех сайт Cloud Email Service.

 

Для продукта Service это может быть портал, хотя в недавних версиях его аналог как раз добавили везде, как ты сейчас предложила.

 

Идея делать и оплачивать сборку не из трёх частей (с возможностью выбрать мощность каждой из них), как сейчас, а более гибко, хороша, но это и более трудоёмко. Часть узкоспециализированной логики можно, наоборот, вынести в дополнения и предоставлять из маркета, платно или бесплатно.

 

Платформа (Studio Enterprise), кстати, сейчас не бесплатна, бесплатна только Studio Free.

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

Всем доброго времени суток!

Есть задача: по нажатию кнопки в модальном окне открывается окно с выбором

полей текущего раздела. Выбирается любое поле и добавляется в модальное окно. И так далее. То есть получается добавленные поля существуют только пока  открыто модальное окно. Это нужно для создания отчета Excel, где указанные значения в полях будут фильтрами.

В разделе полей много. Плюс в будущем поля могут добавляться. Поэтому забивать их жестко в diff смысла не вижу.

Вопрос: есть ли возможность как-то динамически наполнять массив diff полями? 

Нравится

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

А если создать фиксированное количество виртуальных полей и программно их скрывать, показывать, а также менять заголовки?

 

Либо в этом окне использовать редактируемый реестр с двумя колонками: название и значение. Примерно такой обсуждали в этой теме, но там предлагали решение при помощи view, что может в Вашем случае не подойти.

 

Наконец, если формируете фильтр по значениям полей, можно воспользоваться готовым механизмом динамических групп, где такой тоже настраивается. То есть стандартными средствами создать группу, а затем выбрать её в окне настроек отчёта, а затем программно разбирать её фильтр.

 

А вообще, описанное Вами очень похоже на автогенерируемую страницу в БП. Может, с её помощью получится?

Зверев Александр,

Спасибо за ответ. Фиксированное количество виртуальных полей не вариант, так как в будущем клиент самостоятельно может добавлять поля, которые тоже должны выбираться. Мне подсказали создать на странице модального окна ContainerList. Вот такой элемент diff:

{
    "operation": "insert",
    "name": "CommunicationsContainer",
    "parentName": "ContainerListContainer",
    "propertyName": "items",
    "values": {
        "generator": "ConfigurationItemGenerator.generateContainerList",
        "idProperty": "Id",
        "collection": "CaseFieldCollection",
        "observableRowNumber": 10,
        "onGetItemConfig": "getCaseItemConfig"
    }
}

"collection" - коллекция всех полей, которые могут быть отображены в модальном окне.

"onGetItemConfig" - метод, где формируется структура каждого поля.

Только вот до конца не ясно как с этим всем работать.

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

Здравствуйте!

Как можно набрать номер телефона пользователя, если у него есть добавочный номер? 


Запущена интеграция bpm'online со штатным коннектором Oktell.

Нравится

1 комментарий

Автоматически возможности не предусмотрено, набирайте вручную. Сперва сам номер, потом добавочный.

 

Звонилка Android позволяет указать номер вида 0443633133, 5271. Далее после ответа на первую часть номера телефон выполняет донабор самостоятельно. Аналогично работает звонилка на IOS.  И даже в кнопочных Nokia были p и w.

Поддерживается 2 опции:

  • p (,) - пауза на 2 секунды, можно использовать несколько подряд, если не хватает
  • w (:) - пауза до подтверждения пользователем. Приложение спросит подтверждение донабрать символы после дозвона

 

Возможно, в некоторых программах-клиентах такое есть, но не везде.

В web-интерфейсе Oktell при вводе номера 0443633133,5221 звонок выполняется на 04436331335221. В то же время при использовании X-Lite и подключении к серверу Oktell удавалось корректно позвонить на номер вида 0443633133,5221. Похоже что данная возможность отрабатывает на уровне SIP клиента.

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

Подскажите, что я не так делаю.

Сделал экспорт схем из одного пакета.

В системных настройка указан новый, созданный пакет в который нужно импортировать схемы. Делаю импорт в новый пакет.Изображение удалено.

 

В результате, схема импортируется в тот же пакет из которого был сделан экспорт.

Изображение удалено.

 

Нравится

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

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

Добрый день!

Не совсем понятно чего Вы этими манипуляциями пытаетесь добиться? Переселить схему между пакетами? Это можно, конечно, сделать, но другими способами, правда я бы не рекомендовал этим заниматься.

 

Судя по названию схемы, это объект. Может лучше посмотреть в сторону замещения объектов?

Да, переселить схемы между пакетами. 

Я сделал свою разработку в пакете, который нам поставляют другие разработчики. Соответственно при следующей поставке, все мои изменения пропадут. Поэтому и хочется вытащить то, что я сделал в другой пакет. 

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

Добавить комментарий

Лопатин Константин,

Спасибо, буду пробовать

Здравствуйте, Олег!

Обратите внимание на обсуждение.

Интересующая Вас функциональность переноса между пакетами уже разрабатывается, но ещё полностью не готова и по умолчанию отключена.

Мотков Илья пишет:

Здравствуйте, Олег!

Обратите внимание на обсуждение.

Интересующая Вас функциональность переноса между пакетами уже разрабатывается, но ещё полностью не готова и по умолчанию отключена.

На сегодня указанная Вами функциональность все еще в разработке? 

Здравствуйте, Александр!

 

Пока ничего с ней не менялось.

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

Добрый день!

Подскажите, пожалуйста, как в задании-сценарии сгенерировать сообщение бизнес процесса.

Нравится

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

Интересный вопрос!

 

Генерация сообщения — это класс ProcessSchemaIntermediateThrowMessageEvent в ядре. Если взять любой компилируемый процесс и открыть его исходный код, будет видна автоматически сгенерированная логика, как с ним взаимодействуют. Например, в БП SendEmailToContactProcess есть такое сообщение:

В коде это соответствует (фрагменты):

ProcessSchemaIntermediateThrowMessageEvent sendemailintermediatethrowmessageevent = CreateSendEmailIntermediateThrowMessageEventIntermediateThrowMessageEvent();
//...
protected virtual ProcessSchemaIntermediateThrowMessageEvent CreateSendEmailIntermediateThrowMessageEventIntermediateThrowMessageEvent() {
	ProcessSchemaIntermediateThrowMessageEvent schemaThrowMessageEvent = new ProcessSchemaIntermediateThrowMessageEvent(this) {
		UId = new Guid("06d86512-8024-45a7-8c47-97339c880a62"),
		ContainerItemIndex = 0,
		ContainerUId = new Guid("dbae19cb-4797-46a7-8d5e-7849ed4640f5"),
		CreatedInOwnerSchemaUId = new Guid("bb4d6607-026b-4b27-b640-8f5c77c1e89d"),
		CreatedInPackageId = new Guid("66e9e705-64b4-4dda-925e-d1e05a389eb6"),
		CreatedInSchemaUId = new Guid("44589e2b-11fc-4e7e-b97f-9bd6d8f1dbd2"),
		DragGroupName = @"Event",
		EntitySchemaUId = Guid.Empty,
		ImageList = null,
		ImageName = null,
		IsLogging = false,
		ManagerItemUId = new Guid("7b8b16fb-d4c6-4e8b-a519-988250ac636f"),
		Message = @"SendEmail",
		ModifiedInSchemaUId = new Guid("44589e2b-11fc-4e7e-b97f-9bd6d8f1dbd2"),
		Name = @"SendEmailIntermediateThrowMessageEvent",
		OwnerSchemaManagerName = @"ProcessSchemaManager",
		Position = new Point(232, 156),
		SerializeToDB = false,
		Size = new Size(0, 0),
		ThrowToBase = false,
		UseBackgroundMode = false
	};
 
	return schemaThrowMessageEvent;
}
//...
private ProcessThrowMessageEvent _sendEmailIntermediateThrowMessageEvent;
//...
public ProcessThrowMessageEvent SendEmailIntermediateThrowMessageEvent {
	get {
		return _sendEmailIntermediateThrowMessageEvent ?? (_sendEmailIntermediateThrowMessageEvent = new ProcessThrowMessageEvent() {
			UId = Guid.NewGuid(),
			Owner = this,
			Type = "ProcessSchemaIntermediateThrowMessageEvent",
			Name = "SendEmailIntermediateThrowMessageEvent",
			SchemaElementUId = new Guid("06d86512-8024-45a7-8c47-97339c880a62"),
			CreatedInSchemaUId = InternalSchemaUId,
			ExecutedEventHandler = OnExecuted,
		Message = "SendEmail",
		});
	}
}

Также там есть сгенерированные функции, где инициируется процесс, создаются его связи между элементами, включая этот.

 

Возможно, в Вашем случае выйдет программно генерировать аналогичные объекты и добиться нужного поведения.

 

Или же не генерировать, а создать элемент обычным образом в дизайнере, а программно только заполнять свойство Message, плюс условным потоком переходить или нет в элемент, в зависимости от логики в коде.

Зверев Александр,

Спасибо за подробный ответ. Очень познавательно и полезно это знать.

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

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

Есть деталь с 3мя словариками: Контакт(с полем лояльность), Лояльнсть(имя, описание), Параметры лояльности(Имя, Лояльность.Имя, описание)

Добавил деталь к контакту, она автоматически заполняет поле Контакт, а мне ещё нужно подтянуть поле Лояльность(из контакта), а по нему отфильтровать Параметры лояльности.

Знаю, что могу оформить запрос при помощи "EntityQueryColumn", не знаю только куда он собственно прописывается, и туда ли копаю

Нравится

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

Если нужен фильтр полей в карточке детали, то вам сюда:

https://academy.terrasoft.ru/documents/technic-sdk/7-15/primenenie-filtracii-k-spravochnym-polyam

Если нужно автозаполнение поля "в фоне" при сохранении объекта:

https://academy.terrasoft.ru/documents/technic-bpms/7-15/kak-ispolzovat-sobytiynyy-podprocess

Если нужен фильтр полей в карточке детали, то вам сюда:

https://academy.terrasoft.ru/documents/technic-sdk/7-15/primenenie-filtracii-k-spravochnym-polyam

Если нужно автозаполнение поля "в фоне" при сохранении объекта:

https://academy.terrasoft.ru/documents/technic-bpms/7-15/kak-ispolzovat-sobytiynyy-podprocess

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

Коллеги, добрый день!

Есть вопросы при подключении bpm к oktell с помощью штатного коннектора: 

1) Требуются ли стационарные телефоны или можно ограничиться гарнитурой usb? В документации на академии описано, что можно пользоваться как софтфоном, так и стац. телефоном, а на другой странице в сравнительной характеристика написано, что стац. телефон обязателен:

https://academy.terrasoft.ru/documents/administration/7-15/sravnenie-vozmozhnostey-integracii-s-razlichnymi-ats



https://academy.terrasoft.ru/documents/technic-sdk/7-15/oktell



Если все-таки стац. телефон обязателен, то нужен ли сам софтфон oktell? 

А если софтфон стоит - возможно совершать звонки из него и фиксировать их в bpm?



Благодарю!

Нравится

1 комментарий

Не вижу в указанных статьях, где там об обязательности стационарного.

 

 

Судя по схеме из статьи, интеграция идёт на уровне браузера с сервером Oktell, а  не напрямую с телефонами. То есть важно, чтобы аппаратный или программный телефон был совместим с сервером телефонии.

 

Если интеграция настроена, то в системе будут фиксироваться входящие и исходящие звонки, производимые через телефонный аппарат (или программу для звонков). А если совершить исходящий звонок средствами 7.Х (например, из детали средств связи или правой панели), то сервер позвонит на Ваш телефон, а когда поднимете трубку, соединит с тем, куда звоните.

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

Добрый день!

Не могу установить приложение из файлового архива.

В дебаггере браузера видно сообщение от сервера:

errorInfo: {errorCode: "NLogRuntimeException", message: "Asynchronous exception has occurred.", stackTrace: null}

Перезапускал пул и приложение - не помогло. Что делать?

Нравится

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

Сегодня попытался еще раз установить приложение - получилось. Странно. Может на сервере что-то выполнялось что мешало установить приложение?

Руслан, судя по сообщению, ошибку выдавал механизм логирования NLog. Потом, видимо, его настроили правильно (или помогла переустановка). См. похожие симптомы тут.

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

Добрый день!

Подскажите, пожалуйста, возможно ли включить предиктивный анализ данных во время заполнения полей, а не после сохранения id записи в объекте?

И ещё вопрос: Можно ли так же в модели машинного обучения задать настройку по автоматическом заполнению и сохранению полей в случае высокого процента совпадения?

Благодарю за ответ!

Нравится

1 комментарий

Добрый день, izerl.

 

Такая функциональность не поддерживается базовыми настройками системы, реализовать возможно только выполнив доработки системы. 

 

По первому пункту можно выполнить доработки на уровне конфигурации. Но на сегодняшний день примеров реализации в стандатрной логике системы нет и будет лучше если для этого разработчиками системы предварительно будет реализовано API для этого.

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