This commit is contained in:
AKurakin 2024-08-22 14:13:05 +03:00
parent fa01562a9c
commit ed5b85daac
9 changed files with 5358 additions and 11 deletions

View file

@ -336,9 +336,10 @@
</priority>
</enums>
<objects>
<dbVersion name="Версия базы данных" destination="db-versions" class="" table="db_version">
<dbVersion name="Версия базы данных" destination="db-versions" class="ru.clearing.classes.statics.data.misc.DbVersion" table="db_version">
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
<version type="2" length="50" name="Версия базы данных, привязанная к релизу" shortname="Версия БД" searchable="true" sortable="true" visible="true"/>
<dictionaryVersion type="2" length="100" name="Версия справочника" shortname="Версия справочника" searchable="true" sortable="true" visible="true"/>
</dbVersion>
<userCls name="Пользователь" destination="users" class="ru.clearing.classes.statics.data.user.User" logUpdates="true" table="user_cls">
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true"/>
@ -2391,6 +2392,11 @@
<createdAt field="created" type="4" webtype="5" dbname="Дата-время создания записи" name="Время создания записи" shortname="Создано" searchable="true" sortable="true" ignore="true"/>
<updatedAt field="updated" type="4" webtype="5" dbname="Дата-время изменения записи" name="Время изменения записи" shortname="Изменено" searchable="true" sortable="true" ignore="true"/>
</sCrossRate>
<blacklistMarket name="blacklist площадок" destination="blacklist-market" class="ru.clearing.classes.statics.data.misc.BlacklistMarket" table="blacklist_market">
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
<code name="Код рынка" shortname="Код рынка" type="12"/>
<section name="Секция" shortname="Секция" type="12"/>
</blacklistMarket>
</objects>
<views>
<AccountUnion>

View file

@ -0,0 +1,30 @@
package ru.clearing.classes.statics.data.misc;
import ru.clearing.classes.ConstSerializable;
import ru.spcex.platform.classes.base.SpcexObjectBase;
/**
* Read-only
*/
public class DbVersion extends SpcexObjectBase {
private static final long serialVersionUID = ConstSerializable.serialVersionUID;
private String version;
private String dictionaryVersion;
public String getVersion() {
return version;
}
public void setVersion(String value) {
this.version = value;
}
public String getDictionaryVersion() {
return dictionaryVersion;
}
public void setDictionaryVersion(String value) {
this.dictionaryVersion = value;
}
}

View file

@ -1,4 +1,4 @@
-- DB version: 3.12.0.91
-- DB version: 3.13.8.101
/* Dictionaries */
-- allowed - Справочник признаков допустимости использования объектов
@ -856,13 +856,15 @@ GRANT ALL PRIVILEGES ON TABLE PRIORITY_DICTIONARY TO clearing;
-- dbVersion - Версия базы данных
DROP TABLE IF EXISTS DB_VERSION;
CREATE TABLE DB_VERSION(ID bigint PRIMARY KEY, VERSION varchar(50));
CREATE TABLE DB_VERSION(ID bigint PRIMARY KEY, VERSION varchar(50), DICTIONARY_VERSION varchar(100));
COMMENT ON TABLE DB_VERSION IS 'Версия базы данных';
COMMENT ON COLUMN DB_VERSION.ID IS 'Идентификатор записи';
COMMENT ON COLUMN DB_VERSION.VERSION IS 'Версия базы данных, привязанная к релизу';
COMMENT ON COLUMN DB_VERSION.DICTIONARY_VERSION IS 'Версия справочника';
GRANT ALL PRIVILEGES ON TABLE DB_VERSION TO clearing;
-- userCls - Пользователь
@ -2386,7 +2388,7 @@ COMMENT ON COLUMN BANK_ACCOUNT.ACCOUNT_ID IS 'Идентификатор сче
COMMENT ON COLUMN BANK_ACCOUNT.BANK_IDENTIFICATION_CODE IS 'Банковский идентификационный код (БИК)';
COMMENT ON COLUMN BANK_ACCOUNT.BANK_NAME IS 'Наименование банка';
COMMENT ON COLUMN BANK_ACCOUNT.BANK_NAME IS 'Наименование компании в банке';
COMMENT ON COLUMN BANK_ACCOUNT.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
@ -2430,7 +2432,7 @@ COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.ACCOUNT_ID IS 'Идентификатор
COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_IDENTIFICATION_CODE IS 'Банковский идентификационный код (БИК)';
COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_NAME IS 'Наименование банка';
COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_NAME IS 'Наименование компании в банке';
COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет';
@ -3521,9 +3523,9 @@ COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.UPDATED_AT IS 'Дата-врем
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала cессии';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала сессии';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания cессии';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания сессии';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)';
@ -3604,9 +3606,9 @@ COMMENT ON COLUMN LIABILITIES_REGISTER.UPDATED_AT IS 'Дата-время изм
COMMENT ON COLUMN LIABILITIES_REGISTER.SESSION_ID IS 'Идентификатор клиринговой сессии (linked to session)';
COMMENT ON COLUMN LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала cессии';
COMMENT ON COLUMN LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала сессии';
COMMENT ON COLUMN LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания cессии';
COMMENT ON COLUMN LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания сессии';
COMMENT ON COLUMN LIABILITIES_REGISTER.COMPANY_ID IS 'Идентификатор компании (linked to company)';
@ -5102,8 +5104,21 @@ COMMENT ON COLUMN S_CROSS_RATE.UPDATED_AT IS 'Дата-время изменен
GRANT ALL PRIVILEGES ON TABLE S_CROSS_RATE TO clearing;
-- blacklistMarket - blacklist площадок
DROP TABLE IF EXISTS BLACKLIST_MARKET;
CREATE TABLE BLACKLIST_MARKET(ID bigint PRIMARY KEY, CODE varchar(4), SECTION varchar(4));
COMMENT ON TABLE BLACKLIST_MARKET IS 'blacklist площадок';
COMMENT ON COLUMN BLACKLIST_MARKET.ID IS 'Идентификатор записи';
COMMENT ON COLUMN BLACKLIST_MARKET.CODE IS 'Код рынка';
COMMENT ON COLUMN BLACKLIST_MARKET.SECTION IS 'Секция';
GRANT ALL PRIVILEGES ON TABLE BLACKLIST_MARKET TO clearing;
/* views */
-- Data types
INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.12') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION
INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.13') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,4 @@
-- DB version: 3.12
-- DB version: 3.13
-- DATA version: 3.12.101.95
@ -1023,3 +1023,5 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (10000, 'TRDI', 'Общ
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (10001, 'TRDI', 'Сделка с номером в ТС = %s некорректна.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
/* Business objects */
INSERT INTO DB_VERSION(ID, DICTIONARY_VERSION) values (1, '3.12.101') ON CONFLICT (ID) DO UPDATE SET DICTIONARY_VERSION = EXCLUDED.DICTIONARY_VERSION

View file

@ -0,0 +1,23 @@
-- DB version: 3.12 -> 3.13
-- == alter exist tables ==
ALTER TABLE DB_VERSION ADD COLUMN IF NOT EXISTS DICTIONARY_VERSION varchar(100);
COMMENT ON COLUMN DB_VERSION.DICTIONARY_VERSION IS 'Версия справочника';
COMMENT ON COLUMN BANK_ACCOUNT.BANK_NAME IS 'Наименование компании в банке';
COMMENT ON COLUMN BANK_ACCOUNT_HISTORY.BANK_NAME IS 'Наименование компании в банке';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_FROM_DATE IS 'Дата начала сессии';
COMMENT ON COLUMN EXCLUDE_LIABILITIES_REGISTER.VALID_TO_DATE IS 'Дата окончания сессии';
-- == new table ==
DROP TABLE IF EXISTS BLACKLIST_MARKET;
CREATE TABLE BLACKLIST_MARKET(ID bigint PRIMARY KEY, CODE varchar(4), SECTION varchar(4));
COMMENT ON TABLE BLACKLIST_MARKET IS 'blacklist площадок';
COMMENT ON COLUMN BLACKLIST_MARKET.ID IS 'Идентификатор записи';
COMMENT ON COLUMN BLACKLIST_MARKET.CODE IS 'Код рынка';
COMMENT ON COLUMN BLACKLIST_MARKET.SECTION IS 'Секция';
GRANT ALL PRIVILEGES ON TABLE BLACKLIST_MARKET TO clearing;
INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.13') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION

View file

@ -0,0 +1,55 @@
package ru.spcex.clearing.imdg.object;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.clearing.classes.statics.data.misc.BlacklistMarket;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import java.sql.ResultSet;
import java.sql.SQLException;
@Component
public class BlacklistMarketMapStore extends TemplateMapStore<BlacklistMarket> {
public BlacklistMarketMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_BlacklistMarket;
}
@Override
public String getTableName() {
return "BLACKLIST_MARKET";
}
@Override
public String[] getFields() {
return new String[]{
"ID", "CODE", "SECTION"
};
}
@Override
public BlacklistMarket objectReader(ResultSet resultSet) throws SQLException {
BlacklistMarket object = new BlacklistMarket();
object.setId(resultSet.getObject("ID", Long.class));
object.setCode(resultSet.getObject("CODE", String.class));
object.setSection(resultSet.getObject("SECTION", String.class));
return object;
}
@Override
public Object[] objectToField(BlacklistMarket object) {
Object[] args = new Object[]{
object.getId(),
object.getCode(),
object.getSection()
};
return args;
}
}

View file

@ -0,0 +1,106 @@
package ru.spcex.clearing.imdg.object;
import com.hazelcast.core.MapLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Component;
import ru.clearing.classes.statics.data.misc.DbVersion;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.base.AutoconfiguredMap;
import ru.spcex.clearing.imdg.base.DictionaryMapStore;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import static ru.spcex.clearing.imdg.base.ObjectBaseMapStore.MAX_IN_CLAUSE_SIZE;
/**
* Read-only map
*/
@Component
public class DbVersionMapStore implements MapLoader<Long, DbVersion>, AutoconfiguredMap<DbVersion> {
private static final Logger log = LoggerFactory.getLogger(DictionaryMapStore.class);
protected final JdbcTemplate jdbcTemplate;
protected NamedParameterJdbcTemplate namedParameterJdbcTemplate;
protected DbVersionMapStore(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
this.namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_DbVersion;
}
@Override
public String[] getIndexingField() {
return null;
}
public String getTableName() {
return "DB_VERSION";
}
protected DbVersion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
DbVersion object = new DbVersion();
object.setId(resultSet.getObject("ID", Long.class));
object.setVersion(resultSet.getObject("VERSION", String.class));
object.setDictionaryVersion(resultSet.getObject("DICTIONARY_VERSION", String.class));
return object;
}
private Collection<DbVersion> loadCollection(Collection<Long> keys) {
Map<String, Collection<Long>> paramMap = Collections.singletonMap("ids", keys);
return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap, this::mapRow);
}
@Override
public DbVersion load(Long id) {
Collection<DbVersion> rows;
List<Long> list = Collections.singletonList(id);
try {
rows = loadCollection(list);
} catch (Throwable e) {
log.trace("Retry load after {}", e.toString());
rows = loadCollection(list);
}
return DataAccessUtils.singleResult(rows);
}
@Override
public Map<Long, DbVersion> loadAll(Collection keys) {
log.trace("loadAll from dictionary {} {} keys", getTableName(), keys.size());
Map<Long, DbVersion> result = new HashMap<>();
long start = System.currentTimeMillis();
// загрузить данные по ключам частями, чтобы не выйти за ограничения базы по кол-ву элементов в in clause
List<Long> keysSubList = new ArrayList<>(MAX_IN_CLAUSE_SIZE);
for (Iterator<Long> iterator = keys.iterator(); iterator.hasNext(); ) {
Long key = iterator.next();
keysSubList.add(key);
if (keysSubList.size() == MAX_IN_CLAUSE_SIZE || !iterator.hasNext()) {
Collection<DbVersion> rows = loadCollection(keysSubList);
for (DbVersion row : rows) {
result.put(row.getId(), row);
}
keysSubList.clear();
}
}
log.trace("loadAll from {} {} keys done in {} ms", getTableName(), keys.size(), (System.currentTimeMillis() - start));
return result;
}
@Override
public Iterable<Long> loadAllKeys() {
log.debug("loadAllKeys from " + getTableName());
return jdbcTemplate.query("select id from " + getTableName(), (rs, rowNum) -> rs.getLong("id"));
}
}

View file

@ -216,6 +216,7 @@ public final class IMDGDistributedNames {
public static final String Map_PairSdf = "Map_PairSdf";
public static final String Map_GatewayResult = "Map_GatewayResult";
public static final String Map_BlacklistMarket = "Map_BlacklistMarket";
public static final String Map_DbVersion = "Map_DbVersion";
//-------------------history and search tables
public static final String Map_SearchExecutionDeposit = "Map_SearchDeposit";