Merge remote-tracking branch 'origin/feature/SUPPORT-8471_fix_load_okopf' into feature/SUPPORT-8471_fix_load_okopf

# Conflicts:
#	backend/src/main/java/ervu/client/classified/EsnsiOkopfClient.java
#	backend/src/main/java/ervu/dao/classifier/OkopfRecordDao.java
#	backend/src/main/java/ervu/service/classifier/model/OkopfRecordModel.java
#	backend/src/main/java/ervu/service/scheduer/EsnsiOkopfSchedulerServiceImpl.java
#	backend/src/main/resources/config/v_1.0/2024-29-08--01-create-table-record-attributes.xml
This commit is contained in:
Хакимуллин Артём 2024-09-12 00:27:51 +03:00
commit 8a270cc563
7 changed files with 53 additions and 31 deletions

View file

@ -24,12 +24,12 @@ public class EsnsiOkopfClient {
private static final Logger logger = LoggerFactory.getLogger(EsnsiOkopfClient.class); private static final Logger logger = LoggerFactory.getLogger(EsnsiOkopfClient.class);
@Value("${esnsi.okopf.url:#{null}}") @Value("${esnsi.okopf.url:#{null}")
private String uri; private String uri;
@Retryable(value = {TimeoutException.class}, backoff = @Retryable(value = {TimeoutException.class}, backoff =
@Backoff(delay = 2000)) @Backoff(delay = 2000))
public String getData() { public String getJsonOkopFormData() {
HttpClient client = HttpClient.newHttpClient(); HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(uri)) .uri(URI.create(uri))

View file

@ -1,17 +1,16 @@
package ervu.dao.classifier; package ervu.dao.classifier;
import java.util.List;
import ervu.service.classifier.model.OkopfRecordModel; import ervu.service.classifier.model.OkopfRecordModel;
/** /**
* @author Artyom Hackimullin * @author Artyom Hackimullin
*/ */
public interface OkopfRecordDao { public interface OkopfRecordDao {
void save(OkopfRecordModel[] recordModels, String version); void save(List<OkopfRecordModel> recordModels, int version);
String fetchTitleByLeg(String leg); String fetchTitleByLeg(String leg);
void deleteAllByVersion(String version);
String fetchVersion();
} }

View file

@ -2,8 +2,6 @@ package ervu.service.classifier.model;
import java.io.Serializable; import java.io.Serializable;
import com.fasterxml.jackson.annotation.JsonRootName;
/** /**
* @author Artyom Hackimullin * @author Artyom Hackimullin
*/ */
@ -34,4 +32,12 @@ public class OkopfRecordModel implements Serializable {
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
@Override
public String toString() {
return "OkopfRecordModel{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
'}';
}
} }

View file

@ -1,10 +1,6 @@
package ervu.service.scheduer; package ervu.service.scheduer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport; import java.util.stream.StreamSupport;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
@ -30,14 +26,14 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic
@Autowired @Autowired
private ObjectMapper mapper; private ObjectMapper mapper;
@Scheduled(cron = "${ervu.esnsi.okopf.cron:0 0 */1 * * *}") @Scheduled(cron = "${esnsi.okopf.cron:0 0 */1 * * *}")
@Transactional @Transactional
public void load() { public void load() {
String data = esnsiOkopfClient.getJsonOkopFormData();
try { try {
String okopfData = Objects.requireNonNull(esnsiOkopfClient.getData()); List<OkopfRecordModel> okopfRecords = mapToOkopfRecords(data);
List<OkopfRecordModel> okopfRecordModels = mapToOkopfRecords(okopfData); int currentVersion = mapper.readTree(data).findValue("version").asInt();
String version = mapper.readValue("version", String.class); okopfRecordDao.save(okopfRecords, currentVersion);
} }
catch (JsonProcessingException e) { catch (JsonProcessingException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -45,14 +41,28 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic
} }
private List<OkopfRecordModel> mapToOkopfRecords(String data) { private List<OkopfRecordModel> mapToOkopfRecords(String data) {
JsonNode nodeRecords = mapper.valueToTree(data).at("/data/records"); try {
return StreamSupport.stream(nodeRecords.spliterator(), false) JsonNode nodes = mapper.readTree(data).at("/data/records");
.flatMap(it -> StreamSupport.stream(it.at("/attributeValues").spliterator(), false)) return StreamSupport.stream(nodes.spliterator(), false).map(it -> {
.toList() JsonNode attributeValues = it.get("attributeValues");
.stream() String code = null;
.filter(JsonNode::isArray) String name = null;
.limit(2) for (JsonNode record : attributeValues) {
.map(it -> new OkopfRecordModel(it.get("attributeUid").asText(), it.get("value").asText())) String value = record.get("value").asText();
.toList(); if (value.matches("\\d+")) {
code = value;
}
else {
name = value;
break;
}
}
return new OkopfRecordModel(code, name);
})
.toList();
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
} }
} }

View file

@ -9,9 +9,9 @@
<sql> <sql>
CREATE TABLE okopf_records CREATE TABLE okopf_records
( (
okopf_code_id varchar primary key, okopf_records_id varchar primary key,
name varchar unique, name varchar unique,
version varchar version int not null
); );
</sql> </sql>
</changeSet> </changeSet>

View file

@ -676,6 +676,13 @@ JBPM использует 3 корневых категории логирова
<level name="TRACE"/> <level name="TRACE"/>
</logger> </logger>
``` ```
# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ
Свойства задаются в файле config/standalone/dev/standalone.xml
## Параметры
- `esnsi.okopf.cron.load` - указываем расписание для загрузки справочника окопф и сохранения данных по справкам в БД
- `esnsi.okopf.url` - url который обращается к еснси для получения справочника окопф и скачивает данные спровочников организации в виде заархивированного json файл.
# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ # Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ

View file

@ -66,8 +66,8 @@
<property name="ervu.fileupload.max_file_size" value="5242880"/> <property name="ervu.fileupload.max_file_size" value="5242880"/>
<property name="ervu.fileupload.max_request_size" value="6291456"/> <property name="ervu.fileupload.max_request_size" value="6291456"/>
<property name="ervu.fileupload.file_size_threshold" value="0"/> <property name="ervu.fileupload.file_size_threshold" value="0"/>
<property name="ervu.cron.load.time" value="0 0 */1 * * *"/> <property name="esnsi.okopf.cron.load" value="0 0 */1 * * *"/>
<property name="ervu.esnsi.classifier.url.load" value="https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/11465/file?extension=JSON&amp;encoding=UTF_8"/> <property name="esnsi.okopf.url" value="https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/11465/file?extension=JSON&amp;encoding=UTF_8"/>
</system-properties> </system-properties>
<management> <management>
<audit-log> <audit-log>