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:
commit
8a270cc563
7 changed files with 53 additions and 31 deletions
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 + '\'' +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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 файл.
|
||||||
|
|
||||||
# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ
|
# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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&encoding=UTF_8"/>
|
<property name="esnsi.okopf.url" value="https://esnsi.gosuslugi.ru/rest/ext/v1/classifiers/11465/file?extension=JSON&encoding=UTF_8"/>
|
||||||
</system-properties>
|
</system-properties>
|
||||||
<management>
|
<management>
|
||||||
<audit-log>
|
<audit-log>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue