diff --git a/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java b/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java index 17b6a7f8..ca11c106 100644 --- a/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java +++ b/backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java @@ -24,12 +24,12 @@ public class EsnsiOkopfClient { private static final Logger logger = LoggerFactory.getLogger(EsnsiOkopfClient.class); - @Value("${ervu.esnsi.okopf.file.url:#{null}}") + @Value("${esnsi.okopf.url:#{null}}") private String uri; @Retryable(value = {TimeoutException.class}, backoff = @Backoff(delay = 2000)) - public String getJsonOkopFormData() { + public String getData() { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(uri)) diff --git a/backend/src/main/java/ervu/dao/classifier/OkopfAttributeDao.java b/backend/src/main/java/ervu/dao/classifier/OkopfAttributeDao.java deleted file mode 100644 index 69e2da5c..00000000 --- a/backend/src/main/java/ervu/dao/classifier/OkopfAttributeDao.java +++ /dev/null @@ -1,13 +0,0 @@ -package ervu.dao.classifier; - - -import ervu.service.classifier.model.OkopfAttributeModel; - -/** - * @author Artyom Hackimullin - */ -public interface OkopfAttributeDao { - void save(OkopfAttributeModel[] okopfAttributeModels); - - void deleteIfNotExistRecords(); -} diff --git a/backend/src/main/java/ervu/dao/classifier/OkopfAttributeDaoImpl.java b/backend/src/main/java/ervu/dao/classifier/OkopfAttributeDaoImpl.java deleted file mode 100644 index ec8b329d..00000000 --- a/backend/src/main/java/ervu/dao/classifier/OkopfAttributeDaoImpl.java +++ /dev/null @@ -1,46 +0,0 @@ -package ervu.dao.classifier; - -import java.util.Arrays; -import java.util.UUID; - -import ervu.service.classifier.model.OkopfAttributeModel; -import org.jooq.DSLContext; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import static ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Tables.OKOPF_ATTRIBUTES; -import static ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.Tables.OKOPF_RECORDS; - - -/** - * @author Artyom Hackimullin - */ -@Repository -public class OkopfAttributeDaoImpl implements OkopfAttributeDao { - - @Autowired - private DSLContext dsl; - - @Override - public void save(OkopfAttributeModel[] okopfAttributeModels) { - var queries = Arrays.stream(okopfAttributeModels).map(attribute -> { - var uid = UUID.fromString(attribute.getUid()); - return dsl.insertInto(OKOPF_ATTRIBUTES) - .set(OKOPF_ATTRIBUTES.OKOPF_ATTRIBUTE_ID, uid) - .set(OKOPF_ATTRIBUTES.ATTRIBUTE_NAME, attribute.getName()) - .onConflict(OKOPF_ATTRIBUTES.OKOPF_ATTRIBUTE_ID) - .doUpdate() - .set(OKOPF_ATTRIBUTES.ATTRIBUTE_NAME, attribute.getName()); - }).toList(); - dsl.batch(queries).execute(); - } - - @Override - public void deleteIfNotExistRecords() { - dsl.deleteFrom(OKOPF_ATTRIBUTES).whereNotExists(dsl.selectOne() - .from(OKOPF_ATTRIBUTES) - .where(OKOPF_RECORDS.ATTRIBUTE_ID.eq(OKOPF_ATTRIBUTES.OKOPF_ATTRIBUTE_ID))) - .execute(); - } - -} diff --git a/backend/src/main/java/ervu/dao/classifier/OkopfRecordDao.java b/backend/src/main/java/ervu/dao/classifier/OkopfRecordDao.java index 26685be2..6a4090bf 100644 --- a/backend/src/main/java/ervu/dao/classifier/OkopfRecordDao.java +++ b/backend/src/main/java/ervu/dao/classifier/OkopfRecordDao.java @@ -1,13 +1,13 @@ package ervu.dao.classifier; -import ervu.service.classifier.model.OkopfGroupRecordModel; +import ervu.service.classifier.model.OkopfRecordModel; /** * @author Artyom Hackimullin */ public interface OkopfRecordDao { - void save(OkopfGroupRecordModel[] recordModels, String version); + void save(OkopfRecordModel[] recordModels, String version); String fetchTitleByLeg(String leg); diff --git a/backend/src/main/java/ervu/dao/classifier/OkopfRecordDaoImpl.java b/backend/src/main/java/ervu/dao/classifier/OkopfRecordDaoImpl.java index 5093b589..598394ce 100644 --- a/backend/src/main/java/ervu/dao/classifier/OkopfRecordDaoImpl.java +++ b/backend/src/main/java/ervu/dao/classifier/OkopfRecordDaoImpl.java @@ -1,9 +1,8 @@ package ervu.dao.classifier; -import java.util.Arrays; import java.util.UUID; -import ervu.service.classifier.model.OkopfGroupRecordModel; +import ervu.service.classifier.model.OkopfRecordModel; import org.jooq.DSLContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -22,31 +21,31 @@ public class OkopfRecordDaoImpl implements OkopfRecordDao { private DSLContext dsl; @Override - public void save(OkopfGroupRecordModel[] recordModels, String version) { - var queries = Arrays.stream(recordModels) - .flatMap(it -> Arrays.stream(it.getOkopfRecords()) - .map(attribute -> { - var recordUid = UUID.fromString(it.getUid()); - var attributeUid = UUID.fromString(attribute.getAttributeUid()); - var value = attribute.getValue(); - - return dsl.insertInto(OKOPF_RECORDS, - OKOPF_RECORDS.RECORD_ID, - OKOPF_RECORDS.ATTRIBUTE_ID, - OKOPF_RECORDS.VALUE, - OKOPF_RECORDS.VERSION - ) - .values(recordUid, attributeUid, value, version) - .onConflict(OKOPF_RECORDS.RECORD_ID, OKOPF_RECORDS.ATTRIBUTE_ID) - .doUpdate() - .set(OKOPF_RECORDS.VALUE, value) - .set(OKOPF_RECORDS.VERSION, version) - .where(OKOPF_RECORDS.RECORD_ID.eq(recordUid) - .and(OKOPF_RECORDS.ATTRIBUTE_ID.eq(attributeUid))); - })) - .toList(); - - dsl.batch(queries).execute(); + public void save(OkopfRecordModel[] recordModels, String version) { +// var queries = Arrays.stream(recordModels) +// .flatMap(it -> Arrays.stream(it.getOkopfRecords()) +// .map(attribute -> { +// var recordUid = UUID.fromString(it.getUid()); +// var attributeUid = UUID.fromString(attribute.getAttributeUid()); +// var value = attribute.getValue(); +// +// return dsl.insertInto(OKOPF_RECORDS, +// OKOPF_RECORDS.RECORD_ID, +// OKOPF_RECORDS.ATTRIBUTE_ID, +// OKOPF_RECORDS.VALUE, +// OKOPF_RECORDS.VERSION +// ) +// .values(recordUid, attributeUid, value, version) +// .onConflict(OKOPF_RECORDS.RECORD_ID, OKOPF_RECORDS.ATTRIBUTE_ID) +// .doUpdate() +// .set(OKOPF_RECORDS.VALUE, value) +// .set(OKOPF_RECORDS.VERSION, version) +// .where(OKOPF_RECORDS.RECORD_ID.eq(recordUid) +// .and(OKOPF_RECORDS.ATTRIBUTE_ID.eq(attributeUid))); +// })) +// .toList(); +// +// dsl.batch(queries).execute(); } @Override diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfAttributeModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfAttributeModel.java deleted file mode 100644 index cc2ed3ec..00000000 --- a/backend/src/main/java/ervu/service/classifier/model/OkopfAttributeModel.java +++ /dev/null @@ -1,93 +0,0 @@ -package ervu.service.classifier.model; - -import java.io.Serializable; - -/** - * @author Artyom Hackimullin - */ -public class OkopfAttributeModel implements Serializable { - private final static long serialVersionUID = 1L; - - private String uid; - - private String type; - - private String name; - - private String techName; - - private Boolean required; - - private Boolean unique; - - private Integer length; - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getTechName() { - return techName; - } - - public void setTechName(String techName) { - this.techName = techName; - } - - public Boolean getRequired() { - return required; - } - - public void setRequired(Boolean required) { - this.required = required; - } - - public Boolean getUnique() { - return unique; - } - - public void setUnique(Boolean unique) { - this.unique = unique; - } - - public Integer getLength() { - return length; - } - - public void setLength(Integer length) { - this.length = length; - } - - @Override - public String toString() { - return "OkopfAttributeModel{" + - "uid='" + uid + '\'' + - ", type='" + type + '\'' + - ", name='" + name + '\'' + - ", techName='" + techName + '\'' + - ", required=" + required + - ", unique=" + unique + - ", length=" + length + - '}'; - } -} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfFormDataModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfFormDataModel.java deleted file mode 100644 index b353fdb4..00000000 --- a/backend/src/main/java/ervu/service/classifier/model/OkopfFormDataModel.java +++ /dev/null @@ -1,42 +0,0 @@ -package ervu.service.classifier.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * @author Artyom Hackimullin - */ -public class OkopfFormDataModel implements Serializable { - private static final long serialVersionUID = 1L; - - @JsonProperty("classifier") - private OkopfOrgModel okopfOrg; - - @JsonProperty("data") - private OkopfNodeModel okopfNode; - - public OkopfOrgModel getOkopfOrg() { - return okopfOrg; - } - - public void setOkopfOrg(OkopfOrgModel okopfOrg) { - this.okopfOrg = okopfOrg; - } - - public OkopfNodeModel getOkopfNode() { - return okopfNode; - } - - public void setOkopfNode(OkopfNodeModel okopfNode) { - this.okopfNode = okopfNode; - } - - @Override - public String toString() { - return "OkopfOrgModel{" + - "classifier=" + okopfOrg + - ", data=" + okopfNode + - '}'; - } -} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfGroupRecordModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfGroupRecordModel.java deleted file mode 100644 index 5e539709..00000000 --- a/backend/src/main/java/ervu/service/classifier/model/OkopfGroupRecordModel.java +++ /dev/null @@ -1,33 +0,0 @@ -package ervu.service.classifier.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * @author Artyom Hackimullin - */ -public class OkopfGroupRecordModel implements Serializable { - private static final long serialVersionUID = 1L; - - private String uid; - - @JsonProperty("attributeValues") - private OkopfRecordModel[] okopfRecords; - - public OkopfRecordModel[] getOkopfRecords() { - return okopfRecords; - } - - public void setOkopfRecords(OkopfRecordModel[] okopfRecords) { - this.okopfRecords = okopfRecords; - } - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } -} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfNodeModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfNodeModel.java deleted file mode 100644 index 4555271d..00000000 --- a/backend/src/main/java/ervu/service/classifier/model/OkopfNodeModel.java +++ /dev/null @@ -1,34 +0,0 @@ -package ervu.service.classifier.model; - -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * @author Artyom Hackimullin - */ -public class OkopfNodeModel implements Serializable { - private static final long serialVersionUID = 1L; - - @JsonProperty("classifierUid") - private String okopfUid; - - @JsonProperty("records") - private OkopfGroupRecordModel[] okopfGroups; - - public String getOkopfUid() { - return okopfUid; - } - - public void setOkopfUid(String okopfUid) { - this.okopfUid = okopfUid; - } - - public OkopfGroupRecordModel[] getOkopfGroups() { - return okopfGroups; - } - - public void setOkopfGroups(OkopfGroupRecordModel[] okopfGroups) { - this.okopfGroups = okopfGroups; - } -} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfOrgModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfOrgModel.java deleted file mode 100644 index 24810fe3..00000000 --- a/backend/src/main/java/ervu/service/classifier/model/OkopfOrgModel.java +++ /dev/null @@ -1,153 +0,0 @@ -package ervu.service.classifier.model; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.Arrays; - -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * @author Artyom Hackimullin - */ -public class OkopfOrgModel implements Serializable { - private static final long serialVersionUID = 1L; - - private String uid; - - private String code; - - private String name; - - private String description; - - private String version; - - private String publicId; - - private String techName; - - private String updatePeriod; - - private OkopfAttributeModel[] attributes; - - @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX") - private LocalDateTime revisionTimestamp; - - private String keyAttributeUid; - - private String type; - - public String getUid() { - return uid; - } - - public void setUid(String uid) { - this.uid = uid; - } - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public String getPublicId() { - return publicId; - } - - public void setPublicId(String publicId) { - this.publicId = publicId; - } - - public String getTechName() { - return techName; - } - - public void setTechName(String techName) { - this.techName = techName; - } - - public String getUpdatePeriod() { - return updatePeriod; - } - - public void setUpdatePeriod(String updatePeriod) { - this.updatePeriod = updatePeriod; - } - - public OkopfAttributeModel[] getAttributes() { - return attributes; - } - - public void setAttributes(OkopfAttributeModel[] attributes) { - this.attributes = attributes; - } - - public LocalDateTime getRevisionTimestamp() { - return revisionTimestamp; - } - - public void setRevisionTimestamp(LocalDateTime revisionTimestamp) { - this.revisionTimestamp = revisionTimestamp; - } - - public String getKeyAttributeUid() { - return keyAttributeUid; - } - - public void setKeyAttributeUid(String keyAttributeUid) { - this.keyAttributeUid = keyAttributeUid; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - @Override - public String toString() { - return "ClassifierOrgModel{" + - "uid='" + uid + '\'' + - ", code='" + code + '\'' + - ", name='" + name + '\'' + - ", description='" + description + '\'' + - ", version='" + version + '\'' + - ", publicId='" + publicId + '\'' + - ", techName='" + techName + '\'' + - ", updatePeriod='" + updatePeriod + '\'' + - ", attributes=" + Arrays.toString(attributes) + - ", revisionTimestamp=" + revisionTimestamp + - ", keyAttributeUid='" + keyAttributeUid + '\'' + - ", type='" + type + '\'' + - '}'; - } -} diff --git a/backend/src/main/java/ervu/service/classifier/model/OkopfRecordModel.java b/backend/src/main/java/ervu/service/classifier/model/OkopfRecordModel.java index 2cd68083..fcf91810 100644 --- a/backend/src/main/java/ervu/service/classifier/model/OkopfRecordModel.java +++ b/backend/src/main/java/ervu/service/classifier/model/OkopfRecordModel.java @@ -2,29 +2,36 @@ package ervu.service.classifier.model; import java.io.Serializable; +import com.fasterxml.jackson.annotation.JsonRootName; + /** * @author Artyom Hackimullin */ public class OkopfRecordModel implements Serializable { private static final long serialVersionUID = 1L; - private String attributeUid; + private String code; - private String value; + private String name; - public String getAttributeUid() { - return attributeUid; + public OkopfRecordModel(String code, String name) { + this.code = code; + this.name = name; } - public void setAttributeUid(String attributeUid) { - this.attributeUid = attributeUid; + public String getCode() { + return code; } - public String getValue() { - return value; + public void setCode(String code) { + this.code = code; } - public void setValue(String value) { - this.value = value; + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; } } diff --git a/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java b/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java index ef41a078..cb93b8d2 100644 --- a/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java +++ b/backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java @@ -1,15 +1,18 @@ package ervu.service.scheduer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import ervu.client.classified.EsnsiOkopfClient; -import ervu.dao.classifier.OkopfAttributeDao; import ervu.dao.classifier.OkopfRecordDao; -import ervu.service.classifier.model.OkopfAttributeModel; -import ervu.service.classifier.model.OkopfFormDataModel; -import ervu.service.classifier.model.OkopfGroupRecordModel; +import ervu.service.classifier.model.OkopfRecordModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @@ -23,8 +26,6 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic @Autowired private EsnsiOkopfClient esnsiOkopfClient; @Autowired - private OkopfAttributeDao okopfAttributeDao; - @Autowired private OkopfRecordDao okopfRecordDao; @Autowired private ObjectMapper mapper; @@ -33,25 +34,25 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic @Transactional public void load() { try { - String json = Objects.requireNonNull(esnsiOkopfClient.getJsonOkopFormData()); - OkopfFormDataModel classifierFormModel = mapper.readValue(json, OkopfFormDataModel.class); - OkopfAttributeModel[] okopfAttributeModels = classifierFormModel.getOkopfOrg() - .getAttributes(); - OkopfGroupRecordModel[] recordModels = classifierFormModel.getOkopfNode().getOkopfGroups(); - String currentVersion = classifierFormModel.getOkopfOrg().getVersion(); - var newVersion = Integer.parseInt(classifierFormModel.getOkopfOrg().getVersion()); - var versionFromDb = Integer.parseInt(okopfRecordDao.fetchVersion()); + String okopfData = Objects.requireNonNull(esnsiOkopfClient.getData()); + List okopfRecordModels = mapToOkopfRecords(okopfData); + String version = mapper.readValue("version", String.class); - okopfAttributeDao.save(okopfAttributeModels); - okopfRecordDao.save(recordModels, currentVersion); - - if (versionFromDb != 0 && versionFromDb < newVersion) { - okopfRecordDao.deleteAllByVersion(String.valueOf(versionFromDb)); - okopfAttributeDao.deleteIfNotExistRecords(); - } } catch (JsonProcessingException e) { throw new RuntimeException(e); } } + + private List mapToOkopfRecords(String data) { + JsonNode nodeRecords = mapper.valueToTree(data).at("/data/records"); + return StreamSupport.stream(nodeRecords.spliterator(), false) + .flatMap(it -> StreamSupport.stream(it.at("/attributeValues").spliterator(), false)) + .toList() + .stream() + .filter(JsonNode::isArray) + .limit(2) + .map(it -> new OkopfRecordModel(it.get("attributeUid").asText(), it.get("value").asText())) + .toList(); + } } diff --git a/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-record-attributes.xml b/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-record-attributes.xml index f7fc030d..1b56daa0 100644 --- a/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-record-attributes.xml +++ b/backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-record-attributes.xml @@ -6,25 +6,12 @@ http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd"> - - CREATE TABLE okopf_attributes - ( - okopf_attribute_id uuid primary key, - attribute_name varchar unique - ); - - - - CREATE TABLE okopf_records ( - okopf_record_id bigserial primary key, - record_id uuid not null, - attribute_id uuid not null references okopf_attributes (okopf_attribute_id), - value varchar, - version varchar not null, - CONSTRAINT uni_okopf_record_uid_attribute_uid UNIQUE (record_id, attribute_id) + okopf_code_id varchar primary key, + name varchar unique, + version varchar ); diff --git a/config.md b/config.md index 74557103..6fc231df 100644 --- a/config.md +++ b/config.md @@ -677,6 +677,15 @@ JBPM использует 3 корневых категории логирова ``` +# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ + +Свойства задаются в файле config/standalone/dev/standalone.xml + +## Параметры +- `esnsi.okopf.url` - настройка, которая обращается к еснси для получения справочника и скачивает данные спровочников организации в виде заархивированного json файл. +- `esnsi.okopf.cron.load` - указываем расписание для загрузки справочника окопф и сохранения данных по справкам в БД + + # Описание параметров конфигурации клиентской части Свойства задаются в файле frontend/src/resources/app-config.json или frontend.war/src/resources/app-config.json @@ -741,6 +750,7 @@ JBPM использует 3 корневых категории логирова "jivo_chat_widget_enabled": false ``` + # Прочее ## Смена удалённого репозитория