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);
@Value("${esnsi.okopf.url:#{null}}")
@Value("${esnsi.okopf.url:#{null}")
private String uri;
@Retryable(value = {TimeoutException.class}, backoff =
@Backoff(delay = 2000))
public String getData() {
public String getJsonOkopFormData() {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(uri))

View file

@ -1,17 +1,16 @@
package ervu.dao.classifier;
import java.util.List;
import ervu.service.classifier.model.OkopfRecordModel;
/**
* @author Artyom Hackimullin
*/
public interface OkopfRecordDao {
void save(OkopfRecordModel[] recordModels, String version);
void save(List<OkopfRecordModel> recordModels, int version);
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 com.fasterxml.jackson.annotation.JsonRootName;
/**
* @author Artyom Hackimullin
*/
@ -34,4 +32,12 @@ public class OkopfRecordModel implements Serializable {
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "OkopfRecordModel{" +
"code='" + code + '\'' +
", name='" + name + '\'' +
'}';
}
}

View file

@ -1,10 +1,6 @@
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;
@ -30,14 +26,14 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic
@Autowired
private ObjectMapper mapper;
@Scheduled(cron = "${ervu.esnsi.okopf.cron:0 0 */1 * * *}")
@Scheduled(cron = "${esnsi.okopf.cron:0 0 */1 * * *}")
@Transactional
public void load() {
String data = esnsiOkopfClient.getJsonOkopFormData();
try {
String okopfData = Objects.requireNonNull(esnsiOkopfClient.getData());
List<OkopfRecordModel> okopfRecordModels = mapToOkopfRecords(okopfData);
String version = mapper.readValue("version", String.class);
List<OkopfRecordModel> okopfRecords = mapToOkopfRecords(data);
int currentVersion = mapper.readTree(data).findValue("version").asInt();
okopfRecordDao.save(okopfRecords, currentVersion);
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
@ -45,14 +41,28 @@ public class EsnsiOkopfSchedulerServiceImpl implements EsnsiOkopfSchedulerServic
}
private List<OkopfRecordModel> 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();
try {
JsonNode nodes = mapper.readTree(data).at("/data/records");
return StreamSupport.stream(nodes.spliterator(), false).map(it -> {
JsonNode attributeValues = it.get("attributeValues");
String code = null;
String name = null;
for (JsonNode record : attributeValues) {
String value = record.get("value").asText();
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>
CREATE TABLE okopf_records
(
okopf_code_id varchar primary key,
okopf_records_id varchar primary key,
name varchar unique,
version varchar
version int not null
);
</sql>
</changeSet>

View file

@ -676,6 +676,13 @@ JBPM использует 3 корневых категории логирова
<level name="TRACE"/>
</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_request_size" value="6291456"/>
<property name="ervu.fileupload.file_size_threshold" value="0"/>
<property name="ervu.cron.load.time" 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.cron.load" value="0 0 */1 * * *"/>
<property name="esnsi.okopf.url" value="https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/11465/file?extension=JSON&amp;encoding=UTF_8"/>
</system-properties>
<management>
<audit-log>