Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
5a7ac0f2b1
14 changed files with 460 additions and 42 deletions
|
|
@ -206,7 +206,7 @@
|
||||||
<companySymbol type="12" name="Идентификатор справочника" shortname="Идентификатор справочника" searchable="true" sortable="true" visible="true" link="companySymbol"/>
|
<companySymbol type="12" name="Идентификатор справочника" shortname="Идентификатор справочника" searchable="true" sortable="true" visible="true" link="companySymbol"/>
|
||||||
<companySymbolValue type="2" length="255" name="Значение справочника" shortname="Значение" searchable="true" sortable="true" visible="true"/>
|
<companySymbolValue type="2" length="255" name="Значение справочника" shortname="Значение" searchable="true" sortable="true" visible="true"/>
|
||||||
</companySymbols>
|
</companySymbols>
|
||||||
<keyRate name="Ключевая ставка ЦБ" class="?">
|
<keyRate name="Ключевая ставка ЦБ" class="ru.clearing.classes.StaticData.Misc.KeyRate">
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
|
||||||
<rate type="10" name="Ключевая ставка ЦБ РФ" shortname="Ставка" searchable="true" sortable="true" visible="true"/>
|
<rate type="10" name="Ключевая ставка ЦБ РФ" shortname="Ставка" searchable="true" sortable="true" visible="true"/>
|
||||||
<startDate type="6" name="Дата начала действия ключевой ставки" shortname="Начальная дата" searchable="true" sortable="true" visible="true"/>
|
<startDate type="6" name="Дата начала действия ключевой ставки" shortname="Начальная дата" searchable="true" sortable="true" visible="true"/>
|
||||||
|
|
@ -303,7 +303,7 @@
|
||||||
<countryCode type="12" name="Идентификатор кода страны" shortname="Страна" searchable="true" sortable="true" visible="true" link="countryCode"/>
|
<countryCode type="12" name="Идентификатор кода страны" shortname="Страна" searchable="true" sortable="true" visible="true" link="countryCode"/>
|
||||||
<currencyCode type="12" name="Идентификатор кода валюты" shortname="Валюта" searchable="true" sortable="true" visible="true" link="currencyCode"/>
|
<currencyCode type="12" name="Идентификатор кода валюты" shortname="Валюта" searchable="true" sortable="true" visible="true" link="currencyCode"/>
|
||||||
</currency>
|
</currency>
|
||||||
<moneyMarketSecurity name="Инструменты Денежного рынка" class="com.spicex.Static.company.Relation.Service" logUpdates = "true">
|
<moneyMarketSecurity name="Инструменты Денежного рынка" class="ru.clearing.classes.StaticData.Misc.MoneyMarketSecurity" logUpdates = "true">
|
||||||
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
|
||||||
<securityId type="1" name="Идентификатор инструмента" shortname="Инструмент" searchable="true" sortable="true" link="security"/>
|
<securityId type="1" name="Идентификатор инструмента" shortname="Инструмент" searchable="true" sortable="true" link="security"/>
|
||||||
<description type="2" length="255" name="Описание" shortname="Описание" searchable="true" sortable="false"/>
|
<description type="2" length="255" name="Описание" shortname="Описание" searchable="true" sortable="false"/>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,59 @@
|
||||||
|
package ru.clearing.classes.StaticData.Misc;
|
||||||
|
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ключевая ставка ЦБ
|
||||||
|
*
|
||||||
|
* DB table: KEY_RATE
|
||||||
|
**/
|
||||||
|
public class KeyRate extends SpcexObjectBase {
|
||||||
|
private BigDecimal rate;
|
||||||
|
private Instant startDate;
|
||||||
|
private Instant endDate;
|
||||||
|
private String document;
|
||||||
|
private String workflowStatus;
|
||||||
|
|
||||||
|
public BigDecimal getRate() {
|
||||||
|
return rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRate(BigDecimal rate) {
|
||||||
|
this.rate = rate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instant getStartDate() {
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartDate(Instant startDate) {
|
||||||
|
this.startDate = startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instant getEndDate() {
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDate(Instant endDate) {
|
||||||
|
this.endDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDocument() {
|
||||||
|
return document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDocument(String document) {
|
||||||
|
this.document = document;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getWorkflowStatus() {
|
||||||
|
return workflowStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorkflowStatus(String workflowStatus) {
|
||||||
|
this.workflowStatus = workflowStatus;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
package ru.clearing.classes.StaticData.Misc;
|
||||||
|
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.time.Instant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Инструменты Денежного рынка
|
||||||
|
* <p>
|
||||||
|
* DB table: MONEY_MARKET_SECURITY
|
||||||
|
**/
|
||||||
|
public class MoneyMarketSecurity extends SpcexObjectBase {
|
||||||
|
private Long securityId;// (linked to security)
|
||||||
|
private String description;
|
||||||
|
private Instant startDate;
|
||||||
|
private Instant endDate;
|
||||||
|
private BigDecimal nominalValue;
|
||||||
|
private Long nominalCurrency; // (linked to currencyCode)
|
||||||
|
private String instrumentType; // (linked to instrumentType)
|
||||||
|
private String fullName;
|
||||||
|
private String securitySymbol;
|
||||||
|
|
||||||
|
public Long getSecurityId() {
|
||||||
|
return securityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSecurityId(Long securityId) {
|
||||||
|
this.securityId = securityId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDescription(String description) {
|
||||||
|
this.description = description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instant getStartDate() {
|
||||||
|
return startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartDate(Instant startDate) {
|
||||||
|
this.startDate = startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Instant getEndDate() {
|
||||||
|
return endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEndDate(Instant endDate) {
|
||||||
|
this.endDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getNominalValue() {
|
||||||
|
return nominalValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNominalValue(BigDecimal nominalValue) {
|
||||||
|
this.nominalValue = nominalValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getNominalCurrency() {
|
||||||
|
return nominalCurrency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNominalCurrency(Long nominalCurrency) {
|
||||||
|
this.nominalCurrency = nominalCurrency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getInstrumentType() {
|
||||||
|
return instrumentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstrumentType(String instrumentType) {
|
||||||
|
this.instrumentType = instrumentType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFullName() {
|
||||||
|
return fullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFullName(String fullName) {
|
||||||
|
this.fullName = fullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSecuritySymbol() {
|
||||||
|
return securitySymbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSecuritySymbol(String securitySymbol) {
|
||||||
|
this.securitySymbol = securitySymbol;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -549,7 +549,7 @@ COMMENT ON COLUMN RELATION_UPDATE.SERVICE_PRODUCT_ID IS 'Идентификат
|
||||||
COMMENT ON COLUMN RELATION_UPDATE.COMMENT IS 'Текст причины';
|
COMMENT ON COLUMN RELATION_UPDATE.COMMENT IS 'Текст причины';
|
||||||
|
|
||||||
-- bankAccount - Банковские счета
|
-- bankAccount - Банковские счета
|
||||||
CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), _сORRESPONDENT_ACCOUNT varchar(255));
|
CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), CORRESPONDENT_ACCOUNT varchar(255));
|
||||||
COMMENT ON TABLE BANK_ACCOUNT IS 'Банковские счета';
|
COMMENT ON TABLE BANK_ACCOUNT IS 'Банковские счета';
|
||||||
|
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи';
|
COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи';
|
||||||
|
|
@ -576,11 +576,11 @@ COMMENT ON COLUMN BANK_ACCOUNT.TAXPAYER_IDENTIFICATION_NUMBER IS 'Идентиф
|
||||||
|
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки';
|
COMMENT ON COLUMN BANK_ACCOUNT.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки';
|
||||||
|
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT._сORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
|
COMMENT ON COLUMN BANK_ACCOUNT.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
|
||||||
|
|
||||||
|
|
||||||
-- Update log of bankAccount - Банковские счета
|
-- Update log of bankAccount - Банковские счета
|
||||||
CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_UPDATE(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), _сORRESPONDENT_ACCOUNT varchar(255));
|
CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_UPDATE(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), CORRESPONDENT_ACCOUNT varchar(255));
|
||||||
COMMENT ON TABLE BANK_ACCOUNT_UPDATE IS 'Журнал изменений таблицы bankAccount';
|
COMMENT ON TABLE BANK_ACCOUNT_UPDATE IS 'Журнал изменений таблицы bankAccount';
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.BANK_ACCOUNT_ID IS 'Идентификатор записи в таблице BANK_ACCOUNT';
|
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.BANK_ACCOUNT_ID IS 'Идентификатор записи в таблице BANK_ACCOUNT';
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.EVENT_TIME IS 'Дата и время изменения';
|
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.EVENT_TIME IS 'Дата и время изменения';
|
||||||
|
|
@ -610,7 +610,7 @@ COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAXPAYER_IDENTIFICATION_NUMBER IS 'Иде
|
||||||
|
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки';
|
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки';
|
||||||
|
|
||||||
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE._сORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
|
COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
|
||||||
|
|
||||||
-- clearingAccount - Клиринговые счета
|
-- clearingAccount - Клиринговые счета
|
||||||
CREATE TABLE IF NOT EXISTS CLEARING_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, CASH_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, SETTLEMENT_CODE varchar(255));
|
CREATE TABLE IF NOT EXISTS CLEARING_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, CASH_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, SETTLEMENT_CODE varchar(255));
|
||||||
|
|
@ -753,7 +753,7 @@ COMMENT ON COLUMN CURRENCY_UPDATE.COUNTRY_CODE IS 'Идентификатор к
|
||||||
COMMENT ON COLUMN CURRENCY_UPDATE.CURRENCY_CODE IS 'Идентификатор кода валюты (linked to currencyCode)';
|
COMMENT ON COLUMN CURRENCY_UPDATE.CURRENCY_CODE IS 'Идентификатор кода валюты (linked to currencyCode)';
|
||||||
|
|
||||||
-- moneyMarketSecurity - Инструменты Денежного рынка
|
-- moneyMarketSecurity - Инструменты Денежного рынка
|
||||||
CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY(ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY);
|
CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY(ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255));
|
||||||
COMMENT ON TABLE MONEY_MARKET_SECURITY IS 'Инструменты Денежного рынка';
|
COMMENT ON TABLE MONEY_MARKET_SECURITY IS 'Инструменты Денежного рынка';
|
||||||
|
|
||||||
COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи';
|
COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи';
|
||||||
|
|
@ -776,8 +776,6 @@ COMMENT ON COLUMN MONEY_MARKET_SECURITY.FULL_NAME IS 'Полное наимен
|
||||||
|
|
||||||
COMMENT ON COLUMN MONEY_MARKET_SECURITY.SECURITY_SYMBOL IS 'Код инструмента';
|
COMMENT ON COLUMN MONEY_MARKET_SECURITY.SECURITY_SYMBOL IS 'Код инструмента';
|
||||||
|
|
||||||
COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Размер лота (linked to listing)';
|
|
||||||
|
|
||||||
|
|
||||||
-- Update log of moneyMarketSecurity - Инструменты Денежного рынка
|
-- Update log of moneyMarketSecurity - Инструменты Денежного рынка
|
||||||
CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY_UPDATE(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY);
|
CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY_UPDATE(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY);
|
||||||
|
|
|
||||||
|
|
@ -69,6 +69,12 @@
|
||||||
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
|
<artifactId>platform-imdg-api-hazelcast-impl</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- TEST -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testng</groupId>
|
||||||
|
<artifactId>testng</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<finalName>jar/${project.artifactId}</finalName>
|
<finalName>jar/${project.artifactId}</finalName>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ru.spcex.clearing.imdg.base;
|
||||||
|
|
||||||
|
public interface AutoconfiguredMap {
|
||||||
|
String getMapName();
|
||||||
|
|
||||||
|
String[] getIndexingField();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
package ru.spcex.clearing.imdg.base;
|
||||||
|
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MapStore для шаблонных бизнес-объектов
|
||||||
|
* @Component
|
||||||
|
*/
|
||||||
|
public abstract class TemplateMapStore<T extends SpcexObjectBase> extends ObjectBaseMapStore<T> implements AutoconfiguredMap {
|
||||||
|
|
||||||
|
protected final int validateSize = getFields().length;
|
||||||
|
|
||||||
|
protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id");
|
||||||
|
|
||||||
|
public TemplateMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
|
super(jdbcTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public String getTableName() {
|
||||||
|
// return "COMPANY_ROLE_SET";
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public String[] getFields() {
|
||||||
|
// return new String[]{"id", "roleid", "companyid"};
|
||||||
|
// }
|
||||||
|
|
||||||
|
// //todo TradingDay флаг
|
||||||
|
// protected boolean useTradingDay() {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return IMDGDistributedNames.*
|
||||||
|
*/
|
||||||
|
public abstract String getMapName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Список индексируемых полей, для быстрого поиска
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String[] getIndexingField() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Десериализатор
|
||||||
|
* @param resultSet
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
protected abstract T objectReader(ResultSet resultSet) throws SQLException;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<T> load(Collection<Long> keys) {
|
||||||
|
Map<String, Collection<Long>> paramMap = Collections.singletonMap("ids", keys);
|
||||||
|
return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap,
|
||||||
|
(resultSet, i) -> objectReader(resultSet));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сериализатор
|
||||||
|
* @param resultSet
|
||||||
|
* @return Object[] args
|
||||||
|
*/
|
||||||
|
protected abstract Object[] objectToField(T resultSet);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void store(Map<Long, T> map) {
|
||||||
|
List<Object[]> batchArgs = new ArrayList<>();
|
||||||
|
for (Map.Entry<Long, T> entry : map.entrySet()) {
|
||||||
|
T obj = entry.getValue();
|
||||||
|
Object[] args = objectToField(obj);
|
||||||
|
if (args.length != validateSize) {
|
||||||
|
throw new IllegalArgumentException("objectToField return " + args.length + " arguments, but expected " + validateSize);
|
||||||
|
}
|
||||||
|
batchArgs.add(args);
|
||||||
|
}
|
||||||
|
batchInsertUpdate(insertStatement, batchArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
package ru.spcex.clearing.imdg.base;
|
||||||
|
|
||||||
|
import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
|
import ru.clearing.classes.objects.BusinessEvent;
|
||||||
|
import ru.clearing.classes.objects.BusinessObject;
|
||||||
|
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
|
||||||
|
import ru.spcex.clearing.imdg.utils.TimeUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
//@Component
|
||||||
|
public abstract class TemplateUpdateMapStore<T extends BusinessObject, TU extends BusinessEvent<T>> extends BusinessEventMapStore<TU> {
|
||||||
|
|
||||||
|
protected final int validateSize = getFields().length;
|
||||||
|
protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id");
|
||||||
|
|
||||||
|
public TemplateUpdateMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
|
super(jdbcTemplate);
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public String getTableName() {
|
||||||
|
// return "COMPANY_UPDATE";
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// @Override
|
||||||
|
// public String[] getFields() {
|
||||||
|
// return new String[]{
|
||||||
|
// "id", "event_time", "event_user_id",
|
||||||
|
// "company_id", "created_at", "updated_at", "status", "clearing_code", "exchange_code"
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Сериализатор
|
||||||
|
* @param object
|
||||||
|
* @return Object[] args
|
||||||
|
*/
|
||||||
|
protected abstract Object[] objectToField(T object);
|
||||||
|
|
||||||
|
protected Object[] objectToField(TU updateObject, T object) {
|
||||||
|
ArrayList<Object> lst=new ArrayList<>();
|
||||||
|
lst.add(updateObject.getId());
|
||||||
|
lst.add(TimeUtil.fromInstant(updateObject.getEventTime()));
|
||||||
|
lst.add(updateObject.getUserId());
|
||||||
|
lst.addAll(Arrays.asList(objectToField(object)));
|
||||||
|
//todo order?
|
||||||
|
// new Object[]{
|
||||||
|
// companyUpdate,
|
||||||
|
// ,
|
||||||
|
// companyUpdate.getUserId(),
|
||||||
|
// new Object[]{
|
||||||
|
// companyUpdate.getId(),
|
||||||
|
// TimeUtil.fromInstant(companyUpdate.getEventTime()),
|
||||||
|
// companyUpdate.getUserId(),
|
||||||
|
//
|
||||||
|
// company.getId(), // company_id
|
||||||
|
// TimeUtil.fromInstant(company.getCreated()),
|
||||||
|
// TimeUtil.fromInstant(company.getUpdated()),
|
||||||
|
// company.getStatusId(),
|
||||||
|
// company.getClearingCode(),
|
||||||
|
// company.getExchangeCode()
|
||||||
|
// };
|
||||||
|
return lst.toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void store(Map<Long, TU> map) {
|
||||||
|
List<Object[]> batchArgs = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<Long, TU> entry : map.entrySet()) {
|
||||||
|
TU updateContainer = entry.getValue();
|
||||||
|
T obj = updateContainer.getObject();
|
||||||
|
|
||||||
|
Object[] args = objectToField(updateContainer, obj);
|
||||||
|
if (args.length != validateSize) {
|
||||||
|
throw new IllegalArgumentException("objectToField return " + args.length + " arguments, but expected " + validateSize);
|
||||||
|
}
|
||||||
|
batchArgs.add(args);
|
||||||
|
}
|
||||||
|
batchInsertUpdate(insertStatement, batchArgs);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class HazelcastConfiguration {
|
public class HazelcastConfiguration {
|
||||||
|
|
||||||
|
|
@ -55,13 +57,19 @@ public class HazelcastConfiguration {
|
||||||
config.addMapConfig(poolMapConfigs.map_OrganizationTypeDictionary());
|
config.addMapConfig(poolMapConfigs.map_OrganizationTypeDictionary());
|
||||||
config.addMapConfig(poolMapConfigs.map_WorkflowStatusDictionary());
|
config.addMapConfig(poolMapConfigs.map_WorkflowStatusDictionary());
|
||||||
|
|
||||||
config.addMapConfig(poolMapConfigs.map_CompanyRoleSet());
|
// config.addMapConfig(poolMapConfigs.map_CompanyRoleSet()); todo протестировать автоконфигуратор конфигурации мапсторов
|
||||||
config.addMapConfig(poolMapConfigs.map_CompanySymbols());
|
config.addMapConfig(poolMapConfigs.map_CompanySymbols());
|
||||||
config.addMapConfig(poolMapConfigs.map_ProfileDocument());
|
config.addMapConfig(poolMapConfigs.map_ProfileDocument());
|
||||||
config.addMapConfig(poolMapConfigs.map_Contact());
|
config.addMapConfig(poolMapConfigs.map_Contact());
|
||||||
config.addMapConfig(poolMapConfigs.map_Company());
|
config.addMapConfig(poolMapConfigs.map_Company());
|
||||||
// config.addMapConfig(poolMapConfigs.map_CompanyUpdate());
|
// config.addMapConfig(poolMapConfigs.map_CompanyUpdate());
|
||||||
|
|
||||||
|
// Автоподключение мап
|
||||||
|
List<MapConfig> autoMapCfg = poolMapConfigs.autoconfiguratorOfMapstorages();
|
||||||
|
for (MapConfig cfg: autoMapCfg) {
|
||||||
|
config.addMapConfig(cfg);
|
||||||
|
}
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,13 @@ package ru.spcex.clearing.imdg.config;
|
||||||
|
|
||||||
import com.hazelcast.config.*;
|
import com.hazelcast.config.*;
|
||||||
import com.hazelcast.core.MapLoader;
|
import com.hazelcast.core.MapLoader;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import ru.spcex.clearing.imdg.base.TemplateMapStore;
|
||||||
import ru.spcex.clearing.imdg.businessevent.CompanyUpdateMapStore;
|
import ru.spcex.clearing.imdg.businessevent.CompanyUpdateMapStore;
|
||||||
import ru.spcex.clearing.imdg.businessobject.CompanyMapStore;
|
import ru.spcex.clearing.imdg.businessobject.CompanyMapStore;
|
||||||
import ru.spcex.clearing.imdg.dictionary.*;
|
import ru.spcex.clearing.imdg.dictionary.*;
|
||||||
|
|
@ -13,8 +18,14 @@ import ru.spcex.clearing.imdg.object.ContactMapStore;
|
||||||
import ru.spcex.clearing.imdg.object.ProfileDocumentMapStore;
|
import ru.spcex.clearing.imdg.object.ProfileDocumentMapStore;
|
||||||
import ru.spcex.clearing.imdg.utils.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.utils.IMDGDistributedNames;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class PoolMapConfigs {
|
public class PoolMapConfigs {
|
||||||
|
private Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
private ConfigurationRootElement configRoot = DfaConfig.get().getRoot();
|
private ConfigurationRootElement configRoot = DfaConfig.get().getRoot();
|
||||||
|
|
||||||
|
|
@ -127,12 +138,43 @@ public class PoolMapConfigs {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
// @Autowired todo эксперимент с мапстором, см. ниже autoconfiguratorOfMapstorage.
|
||||||
private CompanyRoleSetMapStore companyRoleSetMapStore;
|
// private CompanyRoleSetMapStore companyRoleSetMapStore;
|
||||||
|
//
|
||||||
|
// public MapConfig map_CompanyRoleSet() {
|
||||||
|
// return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyRoleSet, companyRoleSetMapStore)
|
||||||
|
// .addMapIndexConfig(makeMapIndexConfig("companyId"));
|
||||||
|
// }
|
||||||
|
|
||||||
public MapConfig map_CompanyRoleSet() {
|
@Autowired
|
||||||
return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyRoleSet, companyRoleSetMapStore)
|
private List<TemplateMapStore<?>> listOfAutopluginStores;
|
||||||
.addMapIndexConfig(makeMapIndexConfig("companyId"));
|
|
||||||
|
// @Qualifier("AutoconfiguredMapStore")
|
||||||
|
public List<MapConfig> autoconfiguratorOfMapstorages() {
|
||||||
|
List<MapConfig> out = new ArrayList<>();
|
||||||
|
HashSet<String> existMapStores = new HashSet<>();
|
||||||
|
for (TemplateMapStore<?> mapStore : listOfAutopluginStores) {
|
||||||
|
log.debug("Link mapstore {} to map {}", mapStore.toString(), mapStore.getMapName());
|
||||||
|
if (StringUtils.isEmpty(mapStore.getMapName())) {
|
||||||
|
throw new IllegalArgumentException("MapStore " + mapStore + " has empty mapName");
|
||||||
|
}
|
||||||
|
if (existMapStores.contains(mapStore.getMapName())) {
|
||||||
|
throw new IllegalArgumentException("MapStore " + mapStore + " has wrong mapName=\"" + mapStore.getMapName() + "\" is duplicated");
|
||||||
|
}
|
||||||
|
existMapStores.add(mapStore.getMapName()); // IMDGDistributedNames
|
||||||
|
MapConfig mapCfg = makeDefaultMapConfig(mapStore.getMapName(), mapStore);
|
||||||
|
if (mapStore.getIndexingField() != null && mapStore.getIndexingField().length > 0) {
|
||||||
|
if (log.isTraceEnabled()) {
|
||||||
|
log.trace("Create indexing filed on {}: {}", mapStore.getMapName(), Arrays.toString(mapStore.getIndexingField()));
|
||||||
|
}
|
||||||
|
for (String indexName : mapStore.getIndexingField()) {
|
||||||
|
mapCfg.addMapIndexConfig(makeMapIndexConfig(indexName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.add(mapCfg);
|
||||||
|
}
|
||||||
|
log.debug("Configured {} mapStore's", out.size());
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,16 @@ import org.springframework.jdbc.core.JdbcTemplate;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import ru.clearing.classes.StaticData.Company.CompanyRoleSet;
|
import ru.clearing.classes.StaticData.Company.CompanyRoleSet;
|
||||||
import ru.spcex.clearing.imdg.base.ObjectBaseMapStore;
|
import ru.spcex.clearing.imdg.base.ObjectBaseMapStore;
|
||||||
|
import ru.spcex.clearing.imdg.base.TemplateMapStore;
|
||||||
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
|
import ru.spcex.clearing.imdg.utils.DbUtilsHelper;
|
||||||
|
import ru.spcex.clearing.imdg.utils.IMDGDistributedNames;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class CompanyRoleSetMapStore extends ObjectBaseMapStore<CompanyRoleSet> {
|
public class CompanyRoleSetMapStore extends TemplateMapStore<CompanyRoleSet> {
|
||||||
|
|
||||||
public CompanyRoleSetMapStore(JdbcTemplate jdbcTemplate) {
|
public CompanyRoleSetMapStore(JdbcTemplate jdbcTemplate) {
|
||||||
super(jdbcTemplate);
|
super(jdbcTemplate);
|
||||||
|
|
@ -20,41 +24,39 @@ public class CompanyRoleSetMapStore extends ObjectBaseMapStore<CompanyRoleSet> {
|
||||||
return "COMPANY_ROLE_SET";
|
return "COMPANY_ROLE_SET";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMapName() {
|
||||||
|
return IMDGDistributedNames.Map_CompanyRoleSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String[] getIndexingField() {
|
||||||
|
return new String[]{};// список индексируемых полей
|
||||||
|
}
|
||||||
|
// IMDGDistributedNames.Map_CompanyRoleSet
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getFields() {
|
public String[] getFields() {
|
||||||
return new String[]{"id", "roleid", "companyid"};
|
return new String[]{"id", "roleid", "companyid"};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id");
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<CompanyRoleSet> load(Collection<Long> keys) {
|
protected CompanyRoleSet objectReader(ResultSet resultSet) throws SQLException {
|
||||||
Map<String, Collection<Long>> paramMap = Collections.singletonMap("ids", keys);
|
CompanyRoleSet companyRoleSet = new CompanyRoleSet();
|
||||||
return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap,
|
companyRoleSet.setId(resultSet.getObject("id", Long.class));
|
||||||
(resultSet, i) -> {
|
companyRoleSet.setRoleId(resultSet.getObject("roleid", Long.class));
|
||||||
CompanyRoleSet companyRoleSet = new CompanyRoleSet();
|
companyRoleSet.setCompanyId(resultSet.getObject("companyid", Long.class));
|
||||||
companyRoleSet.setId(resultSet.getObject("id", Long.class));
|
return companyRoleSet;
|
||||||
companyRoleSet.setRoleId(resultSet.getObject("roleid", Long.class));
|
|
||||||
companyRoleSet.setCompanyId(resultSet.getObject("companyid", Long.class));
|
|
||||||
return companyRoleSet;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void store(Map<Long, CompanyRoleSet> map) {
|
protected Object[] objectToField(CompanyRoleSet partnerList) {
|
||||||
List<Object[]> batchArgs = new ArrayList<>();
|
Object[] args = new Object[]{
|
||||||
|
partnerList.getId(),
|
||||||
for (Map.Entry<Long, CompanyRoleSet> entry : map.entrySet()) {
|
partnerList.getRoleId(),
|
||||||
CompanyRoleSet partnerList = entry.getValue();
|
partnerList.getCompanyId(),
|
||||||
|
};
|
||||||
Object[] args = new Object[]{
|
return args;
|
||||||
partnerList.getId(),
|
|
||||||
partnerList.getRoleId(),
|
|
||||||
partnerList.getCompanyId(),
|
|
||||||
};
|
|
||||||
batchArgs.add(args);
|
|
||||||
}
|
|
||||||
batchInsertUpdate(insertStatement, batchArgs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,8 @@ public final class IMDGDistributedNames {
|
||||||
public static final String Map_OrganizationTypeDictionary = "Map_OrganizationTypeDictionary";
|
public static final String Map_OrganizationTypeDictionary = "Map_OrganizationTypeDictionary";
|
||||||
public static final String Map_WorkflowStatusDictionary = "Map_WorkflowStatusDictionary";
|
public static final String Map_WorkflowStatusDictionary = "Map_WorkflowStatusDictionary";
|
||||||
|
|
||||||
|
public static final String Map_KeyRate = "Map_KeyRate";
|
||||||
|
public static final String Map_MoneyMarketSecurity = "Map_MoneyMarketSecurity";
|
||||||
|
|
||||||
public static final String MAP_SEQUENCE_NAME = "MAP_SEQUENCE_NAME"; // todo вынести idGenerator отдельно и завернуть в метод, чтобы не напрямую обращаться.
|
public static final String MAP_SEQUENCE_NAME = "MAP_SEQUENCE_NAME"; // todo вынести idGenerator отдельно и завернуть в метод, чтобы не напрямую обращаться.
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
package ru.spcex.clearing.imdg.utils;
|
||||||
|
|
||||||
|
import static org.testng.Assert.*;
|
||||||
|
|
||||||
|
public class DbUtilsHelperTest {
|
||||||
|
|
||||||
|
@org.testng.annotations.Test
|
||||||
|
public void testCreateUpdateOrInsert() {
|
||||||
|
String sql = DbUtilsHelper.createUpdateOrInsert("ENERGY",
|
||||||
|
new String[]{"id", "power", "circle", "of", "fantasy", "prime"}, "id");
|
||||||
|
assertEquals(sql,
|
||||||
|
"INSERT INTO ENERGY (\"ID\", \"POWER\", \"CIRCLE\", \"OF\", \"FANTASY\", \"PRIME\") values (?, ?, ?, ?, ?, ?) ON CONFLICT (ID) DO UPDATE SET \"POWER\"=EXCLUDED.\"POWER\", \"CIRCLE\"=EXCLUDED.\"CIRCLE\", \"OF\"=EXCLUDED.\"OF\", \"FANTASY\"=EXCLUDED.\"FANTASY\", \"PRIME\"=EXCLUDED.\"PRIME\""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
8
pom.xml
8
pom.xml
|
|
@ -127,6 +127,14 @@
|
||||||
<artifactId>spring-kafka</artifactId>
|
<artifactId>spring-kafka</artifactId>
|
||||||
<version>2.8.1</version>
|
<version>2.8.1</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- TEST -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testng</groupId>
|
||||||
|
<artifactId>testng</artifactId>
|
||||||
|
<version>7.5</version>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</dependencyManagement>
|
</dependencyManagement>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue