SUPPORT-8471: new changes

This commit is contained in:
Хакимуллин Артём 2024-09-11 18:44:04 +03:00
parent 6818967f86
commit 9472bf7315
14 changed files with 82 additions and 492 deletions

View file

@ -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))

View file

@ -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();
}

View file

@ -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();
}
}

View file

@ -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);

View file

@ -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

View file

@ -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 +
'}';
}
}

View file

@ -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 +
'}';
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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 + '\'' +
'}';
}
}

View file

@ -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;
}
}

View file

@ -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<OkopfRecordModel> 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<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();
}
}

View file

@ -6,25 +6,12 @@
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<changeSet id="create-table-classifier_attributes" author="a.khakimullin">
<sql>
CREATE TABLE okopf_attributes
(
okopf_attribute_id uuid primary key,
attribute_name varchar unique
);
</sql>
</changeSet>
<changeSet id="create-table-record-attributes" author="a.khakimullin">
<sql>
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
);
</sql>
</changeSet>

View file

@ -677,6 +677,15 @@ JBPM использует 3 корневых категории логирова
</logger>
```
# Взаимодействие с ЕСНСИ в части получения справочника ОКОПФ
Свойства задаются в файле 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
```
# Прочее
## Смена удалённого репозитория