diff --git a/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java b/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java new file mode 100644 index 0000000..4702a2e --- /dev/null +++ b/backend/src/main/java/service/loading/ContainerValueLoaderServiceImpl.java @@ -0,0 +1,126 @@ +package service.loading; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import component.field.dataconvert.DataConverter; +import component.field.dataconvert.DataConverterProvider; +import component.field.loading.FieldValueByContainer; +import component.field.loading.LoadType; +import model.FieldData; +import service.loading.ContainerValueLoaderService; + +import ru.cg.webbpm.modules.database.api.bean.TableRow; +import ru.cg.webbpm.modules.database.api.dao.LoadDao; +import ru.cg.webbpm.modules.database.api.dao.option.LoadOptions; +import ru.cg.webbpm.modules.database.bean.annotation.LocalGraphSource; +import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn; +import ru.cg.webbpm.modules.database.bean.filter.EntityFilter; +import ru.cg.webbpm.modules.database.bean.filter.FilterOperation; +import ru.cg.webbpm.modules.webkit.beans.Behavior; +import ru.cg.webbpm.modules.webkit.beans.PageObjectNotFoundException; + +/** + * @author Eduard Tihomirov + */ +public class ContainerValueLoaderServiceImpl extends Behavior + implements ContainerValueLoaderService { + + public LoadDao loadDao; + @LocalGraphSource(sourceFieldName = "loadDao") + public EntityColumn[] entityColumns; + + @Override + public List loadOnEventData(Object[] params, List guids) { + if (params.length > 1 && (entityColumns == null || params.length != entityColumns.length)) { + throw new UnsupportedOperationException( + "Can't support multiple params without matching entity columns"); + } + return new ArrayList<>(loadValuesByParamAndColumn(params, guids)); + } + + private List loadValuesByParamAndColumn(Object[] params, List guids) { + Map> byColumnMapping = getScriptsMapping(guids, + fieldDefaultValue -> fieldDefaultValue.loadType == LoadType.BY_COLUMN + ); + if (byColumnMapping.isEmpty()) { + throw new IllegalArgumentException("No control data to load"); + } + Map idToColumnMapping = byColumnMapping.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().getValueColumn() + ) + ); + return loadData(params, idToColumnMapping); + } + + private List loadData(Object[] params, Map idToColumnMapping) { + + if (loadDao == null || params == null || params.length == 0) { + return Collections.emptyList(); + } + + Set columns = new HashSet<>(idToColumnMapping.values()); + Map columnToDataMapping; + if (entityColumns == null || entityColumns.length == 0) { + columnToDataMapping = loadDao.loadByPK( + columns, + params[0].toString() + ).getColumnToDataMap(); + } + else { + LoadOptions loadOptions = new LoadOptions(); + List entityFilters = new ArrayList<>(); + for(int i = 0; i < entityColumns.length; i++) { + entityFilters.add(new EntityFilter(params[i], FilterOperation.EQUAL, entityColumns[i])); + } + loadOptions.setEntityFilters(entityFilters); + List tableRows = loadDao.load(columns, loadOptions); + columnToDataMapping = tableRows.size() > 0 + ? tableRows.get(0).getColumnToDataMap() + : Collections.emptyMap(); + } + + return idToColumnMapping.entrySet().stream() + .map(entry -> { + DataConverter dataConverter = DataConverterProvider.getDataConverter( + entry.getValue().getType()); + Object convertedValue = dataConverter.convertValueForLoad( + columnToDataMapping.get(entry.getValue())); + return new FieldData(entry.getKey(), convertedValue); + }) + .collect(Collectors.toList()); + } + + private Map> getScriptsMapping(List guids, + final Predicate> predicate) { + return guids.stream() + .map(guid -> new HashMap.SimpleEntry<>(guid, getFieldOnEventValueScript(guid))) + .filter(entry -> entry.getValue() != null) + .filter(entry -> predicate.test(entry.getValue())) + .collect(Collectors.toMap(HashMap.SimpleEntry::getKey, HashMap.SimpleEntry::getValue)); + } + + private FieldValueByContainer getFieldOnEventValueScript(String guid) { + try { + return getScriptInObject(guid, FieldValueByContainer.class); + } + catch (PageObjectNotFoundException e) { + return null; + } + } + + @Override + public void start() { + super.start(); + } +} + diff --git a/resources/src/main/resources/business-model/ervu-business-metrics/register_subpoenas.page b/resources/src/main/resources/business-model/ervu-business-metrics/register_subpoenas.page index 3924971..5dee7f0 100644 --- a/resources/src/main/resources/business-model/ervu-business-metrics/register_subpoenas.page +++ b/resources/src/main/resources/business-model/ervu-business-metrics/register_subpoenas.page @@ -3566,7 +3566,6 @@ 18ecb7c6-2148-4eb0-a18c-97af5e73cac7 ГК Второй ряд true - false false @@ -3680,6 +3679,24 @@ + + + + + behavior + + {"objectId":"7085eb05-5251-41dd-8484-8d24ee839f76","packageName":"component.field","className":"ComboBox","type":"TS"} + + + + propertyName + + "valueChangeEvent" + + + + + @@ -3706,6 +3723,37 @@ method + + "getBusinessId" + + + + + + + + + + + + + objectValue + + + +argument + + null + + + +behavior + + {"objectId":"7085eb05-5251-41dd-8484-8d24ee839f76","packageName":"component.field","className":"ComboBox","type":"TS"} + + + +method "getBusinessId" @@ -3727,6 +3775,21 @@ containerValueLoaderService + + entityColumns + + + + {"schema":"summonses_list","table":"formed_summonses","entity":"formed_summonses","name":"summonses_reason_id"} + + + + + {"schema":"metrics","table":"recruitment","entity":"recruitment","name":"idm_id"} + + + + loadDao @@ -3744,15 +3807,9 @@ - - replacePkColumn - - {"schema":"summonses_list","table":"formed_summonses","entity":"formed_summonses","name":"summonses_reason_id"} - - - ContainerByPkValueLoaderServiceImpl + ContainerValueLoaderServiceImpl service.loading