Compare commits

...

2 commits

10 changed files with 438 additions and 0 deletions

View file

@ -0,0 +1,26 @@
package ru.spcex.clearing.imdg.businessobject;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilter;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilterBuilder;
import ru.spcex.platform.enumeration.RegistryDesignation;
@Component
public class A_D_RegistryMapStore extends OptionalRegistryMapStore {
public A_D_RegistryMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
protected RegistrySqlFilter registrySqlFilter() {
return RegistrySqlFilterBuilder.BUILDER
.designationFilter(RegistryDesignation.A, RegistryDesignation.D)
.build();
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_A_D_Registry;
}
}

View file

@ -0,0 +1,32 @@
package ru.spcex.clearing.imdg.businessobject;
import java.time.LocalDate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilter;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilterBuilder;
import ru.spcex.clearing.imdg.filter.SqlCompareOperators;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
@Component
public class FailObligationRegistryMapStore extends OptionalRegistryMapStore {
public FailObligationRegistryMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
protected RegistrySqlFilter registrySqlFilter() {
return RegistrySqlFilterBuilder.BUILDER
.designationFilter(RegistryDesignation.O, RegistryDesignation.T)
.statusFilter(RegistryStatus.FAIL, RegistryStatus.UNCV, RegistryStatus.NACK, RegistryStatus.NACC)
.dateRangeFilter("settlement_date", SqlCompareOperators.EQUALS, LocalDate.now())
.build();
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_FailObligationRegistry;
}
}

View file

@ -0,0 +1,33 @@
package ru.spcex.clearing.imdg.businessobject;
import java.time.LocalDate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilter;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilterBuilder;
import ru.spcex.clearing.imdg.filter.SqlCompareOperators;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
@Component
public class OkObligationRegistryMapStore extends OptionalRegistryMapStore {
public OkObligationRegistryMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
protected RegistrySqlFilter registrySqlFilter() {
return RegistrySqlFilterBuilder.BUILDER
.designationFilter(RegistryDesignation.O, RegistryDesignation.T)
.statusFilter(RegistryStatus.OK, RegistryStatus.CLRD)
.dateRangeFilter("settlement_date", SqlCompareOperators.EQUALS, LocalDate.now())
.build();
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_OkObligationRegistry;
}
}

View file

@ -0,0 +1,181 @@
package ru.spcex.clearing.imdg.businessobject;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.List;
import com.hazelcast.config.MapIndexConfig;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import ru.clearing.classes.statics.data.registry.Registry;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilter;
import ru.spcex.clearing.imdg.base.TemplateMapStore;
import ru.spcex.platform.utils.time.TimeUtil;
public abstract class OptionalRegistryMapStore extends TemplateMapStore<Registry> {
private final MapIndexConfig[] indexes;
public OptionalRegistryMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
indexes = new MapIndexConfig[]{
new MapIndexConfig().setAttribute("sessionId").setOrdered(false),
new MapIndexConfig().setAttribute("tradingClearingRegistryId").setOrdered(false),
new MapIndexConfig().setAttribute("companyId").setOrdered(false),
new MapIndexConfig().setAttribute("accountId").setOrdered(false),
new MapIndexConfig().setAttribute("settlementDate").setOrdered(false),
new MapIndexConfig().setAttribute("groupId").setOrdered(false),
};
}
@Override
public String getTableName() {
return "REGISTRY";
}
@Override
public MapIndexConfig[] getIndexes() {
return indexes;
}
@Override
public Iterable<Long> loadAllKeys() {
LocalDate today = LocalDate.now();
log.debug("loadAllKeys from {} with condition and today {}", getTableName(), today);
List<Long> keys;
RegistrySqlFilter registrySqlFilter = registrySqlFilter();
String sql = "select id from " + getTableName() +
" WHERE " + registrySqlFilter.getSqlCondition();
try {
keys = jdbcTemplate.query(sql,
(resultSet, i) -> resultSet.getLong("id"),
registrySqlFilter.getArgs());
} catch (Throwable e) {
log.error("At load keys from {} (sql \"{}\"): {}", getTableName(), sql, ExceptionUtils.getStackTrace(e));
throw e;
}
return keys;
}
protected abstract RegistrySqlFilter registrySqlFilter();
protected String trueFilter() {
return "true";
}
@Override
public String[] getFields() {
return new String[]{
"COMPANY_ID", "TRADING_CODE", "CLEARING_CODE", "SHORT_NAME", "FULL_NAME", "ACCOUNT_ID", "ACCOUNT_TYPE", "ACCOUNT", "REGISTRY_DESIGNATION", "REGISTRY_INSTRUMENT_TYPE", "REGISTRY_CAPACITY", "REGISTRY_UNIT", "REGISTRY_CODE", "TRADING_CLEARING_REGISTRY_ID", "TRADING_CLEARING_REGISTRY", "REGISTRY_STATUS", "SECURITY_SYMBOL", "BALANCE", "OPEN_BALANCE", "CLOSE_BALANCE", "CREDIT", "DEBIT", "SETTLED_CREDIT", "SETTLED_DEBIT", "CHECK_BALANCE", "DIFF_BALANCE", "PLAN_BALANCE", "BALANCE_DIMENSION", "SETTLEMENT_DATE", "SETTLEMENT_CODE", "TRADING_DATE", "CLEARING_DATE", "REFUND_DATE", "VALUE_DATE", "PRICE", "CONTRACT", "COUNTER_PARTY_ID", "COMMENT", "PARENT_ID", "GROUP_ID", "SESSION_ID", "SESSION_TYPE", "PAYMENT_ID", "ID", "CREATED_AT", "UPDATED_AT", "SECURITY_ID", "SECTION"
};
}
@Override
public Registry objectReader(ResultSet resultSet) throws SQLException {
Registry object = new Registry();
object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class));
object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class));
object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class));
object.setShortName(resultSet.getObject("SHORT_NAME", String.class));
object.setFullName(resultSet.getObject("FULL_NAME", String.class));
object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class));
object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class));
object.setAccount(resultSet.getObject("ACCOUNT", String.class));
object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class));
object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class));
object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class));
object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class));
object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class));
object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class));
object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class));
object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class));
object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class));
object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class));
object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class));
object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class));
object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class));
object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class));
object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class));
object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class));
object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class));
object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class));
object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class));
object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class));
object.setSettlementDate(getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE"));
object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class));
object.setTradingDate(getLocalDateFromSqlDate(resultSet, "TRADING_DATE"));
object.setClearingDate(getLocalDateFromSqlDate(resultSet, "CLEARING_DATE"));
object.setRefundDate(getLocalDateFromSqlDate(resultSet, "REFUND_DATE"));
object.setValueDate(getLocalDateFromSqlDate(resultSet, "VALUE_DATE"));
object.setPrice(resultSet.getObject("PRICE", BigDecimal.class));
object.setContract(resultSet.getObject("CONTRACT", String.class));
object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class));
object.setComment(resultSet.getObject("COMMENT", String.class));
object.setParentId(resultSet.getObject("PARENT_ID", Long.class));
object.setGroupId(resultSet.getObject("GROUP_ID", Long.class));
object.setSessionId(resultSet.getObject("SESSION_ID", Long.class));
object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class));
object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class));
object.setId(resultSet.getObject("ID", Long.class));
object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT"));
object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT"));
object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class));
object.setSection(resultSet.getObject("SECTION", String.class));
return object;
}
@Override
public Object[] objectToField(Registry object) {
Object[] args = new Object[]{
object.getCompanyId(),
object.getTradingCode(),
object.getClearingCode(),
object.getShortName(),
object.getFullName(),
object.getAccountId(),
object.getAccountType(),
object.getAccount(),
object.getRegistryDesignation(),
object.getRegistryInstrumentType(),
object.getRegistryCapacity(),
object.getRegistryUnit(),
object.getRegistryCode(),
object.getTradingClearingRegistryId(),
object.getTradingClearingRegistry(),
object.getRegistryStatus(),
object.getSecuritySymbol(),
object.getBalance(),
object.getOpenBalance(),
object.getCloseBalance(),
object.getCredit(),
object.getDebit(),
object.getSettledCredit(),
object.getSettledDebit(),
object.getCheckBalance(),
object.getDiffBalance(),
object.getPlanBalance(),
object.getBalanceDimension(),
TimeUtil.toDateFromLocalDate(object.getSettlementDate()),
object.getSettlementCode(),
TimeUtil.toDateFromLocalDate(object.getTradingDate()),
TimeUtil.toDateFromLocalDate(object.getClearingDate()),
TimeUtil.toDateFromLocalDate(object.getRefundDate()),
TimeUtil.toDateFromLocalDate(object.getValueDate()),
object.getPrice(),
object.getContract(),
object.getCounterPartyId(),
object.getComment(),
object.getParentId(),
object.getGroupId(),
object.getSessionId(),
object.getSessionType(),
object.getPaymentId(),
object.getId(),
TimeUtil.toDateFromInstant(object.getCreated()),
TimeUtil.toDateFromInstant(object.getUpdated()),
object.getSecurityId(),
object.getSection()
};
return args;
}
}

View file

@ -0,0 +1,32 @@
package ru.spcex.clearing.imdg.businessobject;
import java.time.LocalDate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilter;
import ru.spcex.clearing.imdg.filter.RegistrySqlFilterBuilder;
import ru.spcex.clearing.imdg.filter.SqlCompareOperators;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
@Component
public class ProcObligationRegistryMapStore extends OptionalRegistryMapStore {
public ProcObligationRegistryMapStore(JdbcTemplate jdbcTemplate) {
super(jdbcTemplate);
}
@Override
protected RegistrySqlFilter registrySqlFilter() {
return RegistrySqlFilterBuilder.BUILDER
.designationFilter(RegistryDesignation.O, RegistryDesignation.T)
.statusFilter(RegistryStatus.PROC, RegistryStatus.MNG, RegistryStatus.SPLT)
.dateRangeFilter("settlement_date", SqlCompareOperators.GREATER_THAN, LocalDate.now())
.build();
}
@Override
public String getMapName() {
return IMDGDistributedNames.Map_ProcObligationRegistry;
}
}

View file

@ -0,0 +1,19 @@
package ru.spcex.clearing.imdg.filter;
public class RegistrySqlFilter {
private String sqlCondition;
private Object[] args;
public RegistrySqlFilter(String sqlCondition, Object[] args) {
this.sqlCondition = sqlCondition;
this.args = args;
}
public String getSqlCondition() {
return sqlCondition;
}
public Object[] getArgs() {
return args;
}
}

View file

@ -0,0 +1,68 @@
package ru.spcex.clearing.imdg.filter;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.util.StringUtils;
import ru.spcex.platform.enumeration.RegistryDesignation;
import ru.spcex.platform.enumeration.RegistryStatus;
public enum RegistrySqlFilterBuilder {
BUILDER;
private RegistryDesignation[] designations;
private RegistryStatus[] statuses;
private DateRangeFilter dateRangeFilter = null;
public RegistrySqlFilterBuilder designationFilter(RegistryDesignation... designations) {
this.designations = designations;
return this;
}
public RegistrySqlFilterBuilder statusFilter(RegistryStatus... statuses) {
this.statuses = statuses;
return this;
}
public RegistrySqlFilterBuilder dateRangeFilter(String filteringFieldName, SqlCompareOperators sqlOperator, LocalDate value) {
this.dateRangeFilter = new DateRangeFilter(filteringFieldName, sqlOperator, value);
return this;
}
public RegistrySqlFilter build() {
List<String> sqlFilters = new ArrayList<>();
if (designations != null) {
String filter = buildSqlFilter(SqlConditionOperators.OR, "registry_designation", SqlCompareOperators.EQUALS,
Arrays.stream(designations).map(RegistryDesignation::getKey).toArray(String[]::new));
sqlFilters.add(filter);
}
if (statuses != null) {
String filter = buildSqlFilter(SqlConditionOperators.OR, "registry_status", SqlCompareOperators.EQUALS,
Arrays.stream(statuses).map(RegistryStatus::getKey).toArray(String[]::new));
sqlFilters.add(filter);
}
if (dateRangeFilter != null) {
String filter = buildSqlFilter(SqlConditionOperators.UNDEFINED,
dateRangeFilter.filteringFieldName, dateRangeFilter.sqlOperator, "");
sqlFilters.add(filter);
}
return new RegistrySqlFilter(String.join(" and ", sqlFilters), new Object[]{dateRangeFilter.value});
}
private String buildSqlFilter(SqlConditionOperators operatorValue, String filteringFieldName, SqlCompareOperators sqlOperator, String... values) {
Collection<String> conditions = Arrays.stream(values)
.map(value -> String.format("%s %s %s", filteringFieldName, sqlOperator.getKey(),
StringUtils.hasText(value) ? String.format("'%s'", value) : "?"))
.toList();
if (operatorValue != SqlConditionOperators.UNDEFINED && !conditions.isEmpty()) {
return conditions.stream().collect(Collectors.joining(String.format(" %s ", operatorValue.getKey()), "(", ")"));
}
return String.join("", conditions);
}
private record DateRangeFilter(String filteringFieldName, SqlCompareOperators sqlOperator, LocalDate value) {
}
}

View file

@ -0,0 +1,22 @@
package ru.spcex.clearing.imdg.filter;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum SqlCompareOperators implements IEnumKey {
EQUALS("="),
GREATER_THAN(">="),
GREATER(">"),
LESS_THAN("<="),
LESS("<");
private final String key;
SqlCompareOperators(String key) {
this.key = key;
}
@Override
public String getKey() {
return this.key;
}
}

View file

@ -0,0 +1,20 @@
package ru.spcex.clearing.imdg.filter;
import ru.spcex.platform.utils.enumeration.IEnumKey;
public enum SqlConditionOperators implements IEnumKey {
OR("or"),
AND("and"),
UNDEFINED("undefined");
private final String key;
SqlConditionOperators(String key) {
this.key = key;
}
@Override
public String getKey() {
return this.key;
}
}

View file

@ -187,6 +187,11 @@ public final class IMDGDistributedNames {
public static final String Map_TradingClearingRegistry = "Map_TradingClearingRegistry";
public static final String Map_TradingClearingRegistryHistory = "Map_TradingClearingRegistryHistory";
public static final String Map_Registry = "Map_Registry";
//----------------SPECIFIC REGISTRY MAP STORES BY STATUS AND DESIGNATION---------------
public static final String Map_OkObligationRegistry = "Map_OkObligationRegistry";
public static final String Map_ProcObligationRegistry = "Map_ProcObligationRegistry";
public static final String Map_FailObligationRegistry = "Map_FailObligationRegistry";
public static final String Map_A_D_Registry = "Map_A_D_Registry";
public static final String Map_RegistryHistory = "Map_RegistryHistory";
public static final String Map_DepoAccount = "Map_DepoAccount";
public static final String Map_DepoAccountHistory = "Map_DepoAccountHistory";