Версионность карточки

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

Добрый день,

Да, это можно реализовать.

В мануале есть определенная информация: https://doc.cuba-platform.com/manual-7.2-ru/entity_snapshots_save.html

Возможности механизма снимков немножко шире, чем там расписано. Посмотрите также на методы сервиса com.haulmont.cuba.core.app.EntitySnapshotService

  • Для сохранения снимка нужно вызывать метод createSnapshot()
  • Для получения списка снимков данной сущности - getSnapshots()
  • Потом из снимка можно получить саму сущность - extractEntity()

За сущностью может быть большой граф дочерних под-объектов, глубина сохранения определяется параметром view.

Полученную из extract() сущность можно подставить в экран, и поля экрана начнут отображать исторические данные. Можно попробовать подставлять исторический снимок прямо в основной экран редактора, а можно написать отдельный экран для отображения исторического снимка.

Имейте ввиду, что снимки хранятся в БД в json виде, поэтому они довольно прожорливы по дисковому пространству.

2 симпатии

Спасибо большое, попробуем это реализовать.

Почему то всегда открывается последняя версия, а не историческая.
Вот так я сохраняю:
6
Вот так достаю и открываю:
7

Да, это ожидаемо. StandardEditor для не-новых переданных в него сущностей берет только ID, и перезагружает сущность с view, указанной в редакторе.
Логика здесь: com.haulmont.cuba.gui.screen.StandardEditor#setupEntityToEdit (ветка else).

Попробуйте сделать в редакторе публичный метод, который будет проставлять сущность-снимок в instance container редактора - monitoringCardDc.setItem(snapshot). И вызывать этот метод на экране после show().

1 симпатия

Думал как раз о том, что дело в StandartEditor и так же делал публичный метод и подставлял в него историческую сущность, но до show() и не работало. Теперь, подставив после show(), все работает, спасибо.