Добрый день!



Хочу отобразить коллекцию в деталь, без сохранения в бд.

Есть коллекция Collection состоящая из полей из разных обьектов, мне удалось ее заполнить данными, но столкнулся с проблемой при заполнении через this.getGridData(), который переопределил, при вызове деталь не заполняется данными.



entitySchemaName: "AllParentImplementationsByService" - обьект с проставленным Поведение->виртуальный, думал это поможет но нет



Как корректно сделать вставку этой коллекции в GridData детали?



Предоставляю мою схему детали :

define("AllParentImplementationsByService_Detail", [
	"ConfigurationGrid",
	"ConfigurationGridGenerator",
	"ConfigurationGridUtilities",
	"ProcessModuleUtilities"
],
	function (
		ProcessModuleUtilities
	) {
		return {
			entitySchemaName: "AllParentImplementationsByService",
			modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
			dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
			mixins: {
				ConfigurationGridUtilites: "Terrasoft.ConfigurationGridUtilities",           	
			},
			businessRules: /**SCHEMA_BUSINESS_RULES*/{}/**SCHEMA_BUSINESS_RULES*/,
			attributes: {
				IsGridEmpty: {
					dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
					value: true
				},
				/**
				* Grid data collection.
				* @type {Terrasoft.BaseViewModelCollection}
				*/
				Collection: {
					dataValueType: Terrasoft.DataValueType.COLLECTION,
					value: this.Ext.create("Terrasoft.BaseViewModelCollection")
				},
				CaseId: {
					dataValueType: Terrasoft.DataValueType.GUID,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "Id"
				},
				CaseNumber: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CaseNumber" // Номер
				},
				CaseSymptoms: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CaseSymptoms" //Описание
				},
				TcName: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "TcName" // Тех.карта процесса
				},
				AccountAddress: {
					dataValueType: Terrasoft.DataValueType.TEXT,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "AccountAddress" // Адрес контрагента
				},
				CasereatedOn: {
					dataValueType: Terrasoft.DataValueType.DATE_TIME,
					type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
					caption: "CasereatedOn" // Дата регистраци
				}
			},
			messages: {},
			details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
			methods: {
				init: function () {
					this.callParent(arguments);
					this.callAllParentImplementationsByServiceProvisionService();
				},
 
				onEntityInitialized: function () {
					this.callParent(arguments);
				},
 
				callAllParentImplementationsByServiceProvisionService: function () {
					this.showBodyMask({
						caption: "callAllParentImplementationsByServiceProvisionService"
					});
					let config = this.getAllParentImplementationsByServiceProvisionServiceConfig();
					this.callService(config, this.allParentImplementationsByServiceProvisionServiceHandler, this);
				},
 
				getAllParentImplementationsByServiceProvisionServiceConfig: function () {
					return {
						serviceName: "AllParentImplementationsByServiceProvisionService",
						methodName: "GetAllParentImplementationsByServiceProvision",
						timeout: 300000,
						data: {
							Id: this.$MasterRecordId
						}
					};
				},
 
				allParentImplementationsByServiceProvisionServiceHandler: function (response) {
					this.hideBodyMask();
 
					var result = JSON.parse(response);
					var resultCollection = Ext.create("Terrasoft.BaseViewModelCollection");
 
					for (var i = 0; i < result.length; i++) {
						if (!result[i].ExeptionMsg) {
                          	const casereatedOnStr = result[i].CasereatedOn;
							const timestamp = parseInt(casereatedOnStr.substring(
                              casereatedOnStr.indexOf('(') + 1, casereatedOnStr.indexOf(')')));
							const date = new Date(timestamp);
							const options = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
							const formattedDate = date.toLocaleString(options);	
 
							var resultViewModel = Ext.create("Terrasoft.BaseViewModel", {
								values: {
									"CaseId": result[i].CaseId,
									"Number": result[i].CaseNumber,
									"Symptoms": result[i].CaseSymptoms,
									"Name": result[i].TcName,
									"AccountAddress": result[i].AccountAddress,
									"CasereatedOn" : formattedDate
								}
							});
							resultCollection.add(resultViewModel);
						} else {
                          	const casereatedOnStr = result[i].CasereatedOn;
							const timestamp = parseInt(casereatedOnStr.substring(
                              casereatedOnStr.indexOf('(') + 1, casereatedOnStr.indexOf(')')));
							const date = new Date(timestamp);
							const options = { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute:'2-digit' };
							const formattedDate = date.toLocaleString(options);
 
							var resultErrViewModel = Ext.create("Terrasoft.BaseViewModel", {
								values: {
									"CaseId": result[i].CaseId,
									"CaseNumber": result[i].CaseNumber,
									"CaseSymptoms": result[i].CaseSymptoms,
									"TcName": result[i].TcName,
									"AccountAddress": result[i].AccountAddress,
									"CasereatedOn": formattedDate,
									"ExeptionMsg": result[i].ExeptionMsg
								}
							});
							resultCollection.add(resultErrViewModel);
						}
					}
 
					this.set("IsGridEmpty", false);
					this.set("Collection", resultCollection);
					this.getGridData();
				},
 
				getGridData: function () {
					return this.get("Collection");
				},
 
				useVirtualRecord: function () {
					return true;
				},
				/**
				 * @inheritDoc BaseGridDetailV2#getCopyRecordMenuItem
				  * @override
				 */
				getCopyRecordMenuItem: this.Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getEditRecordMenuItem
				 * @override
				 */
				getEditRecordMenuItem: this.Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getDeleteRecordMenuItem
				 * @override
				 */
				getDeleteRecordMenuItem: Terrasoft.emptyFn,
 
				/**
				 * @inheritDoc BaseGridDetailV2#getAddRecordButtonVisible
				 * @override
				 */
				getAddRecordButtonVisible: function () {
					return false;
				},
 
				getAddTypedRecordButtonVisible: function () {
					return false;
				},
 
				getDetailCaption: function () {
					return this.get("Resources.Strings.AllParentImplementationsByServiceDetailLabel");
				}
			},
			diff: /**SCHEMA_DIFF*/[
				{
					"operation": "insert",
					"name": "Container",
					"parentName": "Header",
					"propertyName": "items",
					"values": {
						"itemType": this.Terrasoft.ViewItemType.CONTAINER,
						"layout": { "column": 0, "row": 0, "colSpan": 24 },
						"items": []
					}
				},
				{
					"operation": "merge",
					"name": "DataGrid",
					"parentName": "Container",
					"propertyName": "items",
					"values": {
                      	//"generator": "Terrasoft.GridGenerator.generateGrid",
						"itemType": this.Terrasoft.ViewItemType.GRID,
						"type": this.Terrasoft.GridType.LISTED,
						"collection": "Collection",
						"isEmpty": { "bindTo": "IsGridEmpty" },
                      	"captionsConfig": []						
					}
				},
				{
					operation: "insert",
					name: "InfoButton",
					parentName: "ActionButtonsContainer",
					propertyName: "items",
					values: {
						click: { bindTo: "callAllParentImplementationsByServiceProvisionService" },
						itemType: this.Terrasoft.ViewItemType.BUTTON,
						style: this.Terrasoft.controls.ButtonEnums.style.GREEN,
						hint: { bindTo: "showHint" },
						caption: "Test",
					},
				},
			]/**SCHEMA_DIFF*/
		};
	});

 

Нравится

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

Добрый день.

Возможно есть смысл сделать представление?

Логику формирования записей сделать не в вебсервиме и отображение этой коллекции в детале. А сделать объект, который пометить как вьюха, и на SQL написать код, который будет формировать коллекцию. Тогда кроме как вьюхи никакого дополнительного кода не требуется, и будет работать стандартная логика детали.

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

Добрый день !)

В системе существует роль "Эксперты" внутри этой роли 15-20 пользователей .

 

Если отправить на визу в эту Роль то - по документации любой из этих пользователей может утвердить или отклонить эту визу. 

  • [ Роли ] — выберите из справочника определенную организационную или функциональную роль. Так любой из сотрудников, входящих в эту роль, сможет выполнить визирование.

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

Суть:

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

 

Сделать 20 отдельных виз со всеми исходами пока что кажется нецелесообразным .

Считываю коллекцию "ID всех контактов у которых должность "Эксперт""

После, нужно отправить на визирование всем этим контактам .(Естественно коллекцию нельзя вставлять как параметр процесса в "Кому отправить на визирование")

Поделитесь пожалуйста опытом.

Как использовать считанную коллекцию записей для элемента Визирование ?

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

 

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

 

 

Нравится

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

Tigran Gevorgyan, здравствуйте!

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

В таком случае по каждой записи в коллекции уйдет своя виза.

Подробнее о работе с коллекциями и подпроцессами тут:

https://academy.terrasoft.ru/docs/7-17/user/biznes_processy/nastrojka_p…

 

Tigran Gevorgyan, здравствуйте!

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

В таком случае по каждой записи в коллекции уйдет своя виза.

Подробнее о работе с коллекциями и подпроцессами тут:

https://academy.terrasoft.ru/docs/7-17/user/biznes_processy/nastrojka_p…

 

Sorotiuk Anna,

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

Владимир Соколов, 

В рамках одного процесса никак.

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

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

Всем доброго дня! 

В БП есть параметр Коллекция записей с вложенными параметрами, который приходит по вебсервису. Вопрос в том как правильно прочитать эту коллекцию в задании-сценарии и достать нужные параметры?Изображение удалено.

Нравится

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

Попробуйте может через CompositeObject получить коллекцию

Get<ICompositeObjectList<ICompositeObject>>("Ваш_параметр.ResultCompositeObjectList")

Литвинко Павел пишет:

Попробуйте может через CompositeObject получить коллекцию

Get<ICompositeObjectList<ICompositeObject>>("Ваш_параметр.ResultCompositeObjectList")

Здравствуйте,  получилось немного не так:

 

var list = Get<ICompositeObjectList<ICompositeObject>>("Units");

foreach (ICompositeObject item in list) {

    

    if (item.TryGetValue<string>("Name", out string value)) {

        Set<string>("ProcessSchemaParameter1", value);

   }

}

Спасибо за помощь!)

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