Table of Contents

Установка значений свойств элемента

Пример показывает, как обновить собственные свойства элемента (наименование и количество) средствами клиентской библиотеки Ascon.Polynom.Web.Api.Client. Проект — Samples.WebApi.UpdateElementProperty.

Требования

  • .NET 8.
  • Запущенный web-сервер ПОЛИНОМ:MDM с доступным хранилищем.
  • Пакет Ascon.Polynom.Web.Api.Client из локального фида (подключается автоматически).

Алгоритм

  1. Авторизоваться в web-API.
  2. Задать Uid элемента.
  3. Получить свойства элемента.
  4. Сформировать запрос на обновление значений.
  5. Отправить запрос и выйти из сессии.

Авторизация

Авторизация выполняется хелпером PolynomClientSession поверх AuthorizationService. Подробно — в разделе Авторизация в C# через клиентскую библиотеку.

Реализация

Свойства элемента возвращает метод GetByUid сервиса PropertyOwnerApiClient. Системное определение свойства «Количество» ищется методом GetByCode сервиса PropertyDefinitionApiClient. Обновление значений выполняет метод SetPropertyValues с моделью SetPropertyValuesRequest.

using Ascon.Polynom.Web.Api.Client.Enums;

using Samples.WebApi.Common.Services;

using var session = await PolynomClientSession.CreateAsync(cancellationToken);

// Uid элемента (например, скопированный из сводки тестового хранилища).
var objectUid = "8a0eaacf-0306-4772-bfe5-96f129fee31b";

var properties = await session.Factory.CreatePropertyOwnerApiClient()
    .GetByUid(new GetByUidRequest { Id = objectUid }, cancellationToken);

var contractElement = properties!.AllContracts.FirstOrDefault(x => x.Name == "Элемент классификации")
    ?? throw new InvalidOperationException("Контракт «Элемент классификации» не найден.");

var definitionElementName = properties.Definitions.StringProperties!.FirstOrDefault(x => x.Name == "Наименование")
    ?? throw new InvalidOperationException("Свойство «Наименование» не найдено.");

var quantityDefinition = await session.Factory.CreatePropertyDefinitionApiClient()
    .GetByCode(new GetByCodeRequest { Code = "@Quantity" }, cancellationToken)
    ?? throw new InvalidOperationException("Определение свойства «@Quantity» не найдено.");

var updateValueRequest = new SetPropertyValuesRequest
{
    Owner = new IdentifiableObject
    {
        ObjectId = properties.PropertyOwner.ObjectId,
        TypeId = IdentifiableObjectType.Element
    },
    Values = new AblePropertyValuesRequest
    {
        StringProperties = new List<IStringPropertyValueRequest>
        {
            new StringPropertyValueRequest
            {
                Value = "NewNameFromExample",
                ObjectId = 123,
                TypeId = IdentifiableObjectType.StringPropertyValue
            }
        },
        DoubleProperties = new List<IDoublePropertyValueRequest>
        {
            new DoublePropertyValueRequest
            {
                Value = new DoubleValue
                {
                    MinValue = 1111,
                    MaxValue = 9999,
                    Mode = DoublePropertyMode.Range
                },
                ObjectId = 456,
                TypeId = IdentifiableObjectType.DoublePropertyValue
            }
        }
    },
    Properties = new List<IPropertyValueItem>
    {
        new PropertyValueItem
        {
            Value = new IdentifiableObject { ObjectId = 123, TypeId = IdentifiableObjectType.StringPropertyValue },
            Contract = new IdentifiableObject { ObjectId = contractElement.ObjectId, TypeId = contractElement.TypeId },
            Definition = new IdentifiableObject { ObjectId = definitionElementName.ObjectId, TypeId = definitionElementName.TypeId },
            EvaluationMode = EvaluationMode.None
        },
        new PropertyValueItem
        {
            Value = new IdentifiableObject { ObjectId = 456, TypeId = IdentifiableObjectType.DoublePropertyValue },
            Contract = null,
            Definition = new IdentifiableObject { ObjectId = quantityDefinition.ObjectId, TypeId = quantityDefinition.TypeId },
            EvaluationMode = EvaluationMode.None
        }
    }
};

await session.Factory.CreatePropertyOwnerApiClient().SetPropertyValues(updateValueRequest, cancellationToken);

await session.SignOutAsync(cancellationToken);

Используемые методы библиотеки

Сервис Метод Назначение
PropertyOwnerApiClient GetByUid(GetByUidRequest, CancellationToken) Свойства элемента по Uid
PropertyDefinitionApiClient GetByCode(GetByCodeRequest, CancellationToken) Определение свойства по коду
PropertyOwnerApiClient SetPropertyValues(SetPropertyValuesRequest, CancellationToken) Обновление значений свойств

Результат

Свойства элемента обновляются: изменяется значение строкового свойства «Наименование», а системное свойство «Количество» добавляется элементу как собственное.

Возможные ошибки

  • Элемент не найден по Uid — проверьте Uid.
  • Свойство не найдено — системные свойства определяются контрактом «Элемент классификации» и определением по коду @Quantity; в другом хранилище контракты могут отличаться.
  • Ошибка доступа — у пользователя нет прав на изменение свойств.

Ссылки

Пример-приложение в составе SDK: SDK/Web/Samples/Server/Samples.WebApi.UpdateElementProperty.