diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java index 1b795ee56..3ff22bb3e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/config/validation/ClientCodeValidationConfig.java @@ -13,6 +13,7 @@ import ru.clearing.platform.dictionary.ServiceStatusDictionary; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.account.validation.BackendClientCodeValidationRule; import ru.spcex.clearing.account.validation.GatewayClientCodeValidationRule; +import ru.spcex.clearing.account.validation.GatewayEksClientCodeValidationRule; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest; import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeUpdateRequest; @@ -117,7 +118,7 @@ public class ClientCodeValidationConfig { Account.class, AccountError.RequiredFieldEmpty, AccountError.AccountNotFound, - true, + false, acc -> Objects.equals(context.getValidatedObject().getCompanyId(), acc.getCompanyId()) ? null : AccountError.AccountNotFound ), @@ -196,9 +197,9 @@ public class ClientCodeValidationConfig { addImdg.accept(IMDGDistributedNames.Map_DepoAccount); return new ValidatorImpl<>(context, FieldRequiredRule.instance("client_code", TkrAccount::getClientCode, AccountError.RequiredFieldEmpty), - GatewayClientCodeValidationRule.CompanyPresent, + GatewayEksClientCodeValidationRule.CompanyPresent, // GatewayClientCodeValidationRule.AllAccountsPresent, - GatewayClientCodeValidationRule.DepoAccountsPresent + GatewayEksClientCodeValidationRule.DepoAccountsPresent // GatewayClientCodeValidationRule.TcrIsNotPresent, // GatewayClientCodeValidationRule.TcrListIsNotPresent ); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java index b78f2f0d1..7f4b35960 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/BackendClientCodeValidationRule.java @@ -43,7 +43,9 @@ public enum BackendClientCodeValidationRule implements IValidationRule currencyIds = validatedObject.getCurrencyAccountList(); Long moneyAccountId = validatedObject.getMoneyAccountId(); - + if (moneyAccountId == null) { + return empty(); + } Imdg tradingClearingRegistryImdg = context.obtainMap(IMDGDistributedNames.Map_TradingClearingRegistry, TradingClearingRegistry.class); Imdg tradingClearingRegistryListImdg = @@ -58,6 +60,9 @@ public enum BackendClientCodeValidationRule implements IValidationRule accountSymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class); - ImdgPredicateBuilder predicateBuilder = accountSymbolsImdg.predicateBuilder(); - AccountSymbols accountSymbols = accountSymbolsImdg.getSingleObjectByPredicate( - predicateBuilder.equals("accountSymbolValue", depoAccountVal) - ); - - if (accountSymbols == null) { - return of(AccountError.DepoAccountNotFound, "depo_account"); - } - Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); - DepoAccount depoAccount = imdg.getFirstObjectByPredicate( - predicateBuilder.equals("accountId", accountSymbols.getAccountId()) + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); + Account depoAccount = imdg.getFirstObjectByFieldValues( + Map.of("account", depoAccountVal) ); if (depoAccount == null) { context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty()); diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java index 9e6a85bc0..ee88998fb 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/validation/GatewayEksClientCodeValidationRule.java @@ -8,6 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; import ru.clearing.classes.statics.data.account.Account; +import ru.clearing.classes.statics.data.account.AccountSymbols; +import ru.clearing.classes.statics.data.account.DepoAccount; import ru.clearing.classes.statics.data.company.Company; import ru.spcex.clearing.account.errors.AccountError; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -15,6 +17,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.account.TkrAccount; import ru.spcex.clearing.platform.messaging.domain.cud.gateway.MoneyAccountMsgRequest; import ru.spcex.platform.enumeration.CurrencyCode; import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.imdg.validation.ImdgValidationContext; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidationRule; @@ -75,9 +78,18 @@ public enum GatewayEksClientCodeValidationRule implements IValidationRule imdg = context.obtainMap(IMDGDistributedNames.Map_Account, Account.class); - Account depoAccount = imdg.getFirstObjectByFieldValues( - Map.of("account", depoAccountVal) + Imdg accountSymbolsImdg = context.obtainMap(IMDGDistributedNames.Map_AccountSymbols, AccountSymbols.class); + ImdgPredicateBuilder predicateBuilder = accountSymbolsImdg.predicateBuilder(); + AccountSymbols accountSymbols = accountSymbolsImdg.getSingleObjectByPredicate( + predicateBuilder.equals("accountSymbolValue", depoAccountVal) + ); + + if (accountSymbols == null) { + return of(AccountError.DepoAccountNotFound, "depo_account"); + } + Imdg imdg = context.obtainMap(IMDGDistributedNames.Map_DepoAccount, DepoAccount.class); + DepoAccount depoAccount = imdg.getFirstObjectByPredicate( + predicateBuilder.equals("accountId", accountSymbols.getAccountId()) ); if (depoAccount == null) { context.storeObject(ClientCodeStoreObjects.DEPO_ACCOUNT, Optional.empty()); diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.json b/clearing-parent/backend-api/src/main/resources/meta/meta.json index 977c8578e..b866d66ba 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.json +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.json @@ -1,6 +1,6 @@ { - "version": "3.25.300.176", + "version": "3.26.301.178", "enums": { @@ -4200,18 +4200,6 @@ {"code": "tradingClearingRegistryId", "type": 1,"dbname": "Идентификатор торгово-клирингового регистра","name": "Торгово-клиринговый регистр","shortname": "ТКР","searchable": true,"sortable": true,"link": "tradingClearingRegistry","linkCode": "code" } - , - {"code": "moneyAccountId", - "type": 1,"dbname": "Идентификатор денежного счета","name": "Номер денежного счета","shortname": "Денежный счет","searchable": true,"sortable": true,"link": "account","linkCode": "account" - } - , - {"code": "depoAccountId", - "type": 1,"dbname": "Идентификатор депозитарного счета","name": "Номер депозитарного счета","shortname": "Депозитарный счет","searchable": true,"sortable": true,"link": "account","linkCode": "account" - } - , - {"code": "currencyAccountId", - "type": 1,"dbname": "Идентификатор валютного счета","name": "Номер валютного счета","shortname": "Валютный счет","searchable": true,"sortable": true,"link": "account","linkCode": "account" - } , {"code": "status", "type": 12,"dbname": "Код статуса","name": "Наименование статуса","shortname": "Статус","searchable": true,"sortable": true,"link": "workflowStatus" @@ -4230,7 +4218,7 @@ "name": "Добавление кода клиента", - "confirmation": "companyId,code,tradingClearingRegistryId,moneyAccountId,depoAccountId,status", + "confirmation": "companyId,code,tradingClearingRegistryId,status", "class": "ru.spcex.clearing.backendapi.controller.request.cud.account.ClientCodeNewAction", @@ -4246,18 +4234,6 @@ {"code": "tradingClearingRegistryId", "type": 1,"name": "Торгово-клиринговый регистр","shortname": "ТКР","link": "tradingClearingRegistry","linkCode": "code" } - , - {"code": "moneyAccountId", - "type": 1,"name": "Номер денежного счета","shortname": "Денежный счет","link": "account","linkCode": "account" - } - , - {"code": "depoAccountId", - "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account" - } - , - {"code": "currencyAccountList", - "type": 7,"name": "Список валютных счетов","shortname": "Список валютных счетов","link": "account","linkCode": "account" - } , {"code": "status", "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "workflowStatus" @@ -4269,7 +4245,7 @@ "name": "Изменение кода клиента", - "confirmation": "companyId,code,tradingClearingRegistryId,moneyAccountId,depoAccountId,status", + "confirmation": "companyId,code,tradingClearingRegistryId,status", "class": "ru.spcex.clearing.backendapi.controller.request.cud.account.ClientCodeUpdateAction", @@ -4289,18 +4265,6 @@ {"code": "tradingClearingRegistryId", "type": 1,"name": "Торгово-клиринговый регистр","shortname": "ТКР","link": "tradingClearingRegistry","linkCode": "code" } - , - {"code": "moneyAccountId", - "type": 1,"name": "Номер денежного счета","shortname": "Денежный счет","link": "account","linkCode": "account" - } - , - {"code": "depoAccountId", - "type": 1,"name": "Номер депозитарного счета","shortname": "Депозитарный счет","link": "account","linkCode": "account" - } - , - {"code": "currencyAccountList", - "type": 7,"name": "Список валютных счетов","shortname": "Список валютных счетов","link": "account","linkCode": "account" - } , {"code": "status", "type": 12,"name": "Наименование статуса","shortname": "Статус","link": "workflowStatus" diff --git a/clearing-parent/backend-api/src/main/resources/meta/meta.xml b/clearing-parent/backend-api/src/main/resources/meta/meta.xml index 7d890d4b8..827094134 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,6 +1,6 @@ - + @@ -971,30 +971,21 @@ - - - - + - - - - + - - - diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql index adb350bbd..871f9aaa4 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql @@ -5852,4 +5852,4 @@ GRANT ALL PRIVILEGES ON TABLE ORDER_CURRENCY_HISTORY TO clearing; -- Data types -INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.24') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file +INSERT INTO DB_VERSION(ID, VERSION) values (1, '3.26') ON CONFLICT (ID) DO UPDATE SET VERSION = EXCLUDED.VERSION \ No newline at end of file diff --git a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.26.sql b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.26.sql index b35990120..361230c08 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.26.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/updateDDL_3.26.sql @@ -1,4 +1,4 @@ --- DB version: 3.24 -> 3.25 +-- DB version: 3.25 -> 3.26 ALTER TABLE ORDER_CURRENCY ADD COLUMN IF NOT EXISTS EXCHANGE_ORDER_ID BIGINT; diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java index 8fcd80eaa..267eb6e38 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OrderCurrencyListener.java @@ -11,6 +11,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang3.StringUtils; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; @@ -51,6 +52,7 @@ import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.utils.collection.Pair; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.number.BigDecimalUtil; import static ru.spcex.platform.utils.number.BigDecimalUtil.safeBD; import ru.spcex.platform.utils.validation.IValidator; @@ -429,38 +431,50 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing private void updateByImporter(BaseRequest req) { OrderCurrencyStatusUpdateRequest payload = req.getRequestPayload(); for (Long orderId : payload.getIds()) { - SOrders sOrder = sOrdersImdg.getSingleObjectByID(orderId); - OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(orderId); - if (orderCurrency == null) { - log.warn("OrderCurrency[{}] not found", orderId); - continue; + try { + SOrders sOrder = sOrdersImdg.getSingleObjectByID(orderId); + OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(orderId); + if (orderCurrency == null) { + log.warn("OrderCurrency[{}] not found", orderId); + continue; + } + OrderStatus status = resolveStatusByImportState(sOrder.getState()); + if (status == null) { + continue; + } + orderCurrency.setStatus(status.getKey()); + if (orderCurrency.getExchangeOrderId() == null) { + orderCurrency.setExchangeOrderId(normalize(sOrder.getExchangeOrderNum())); + } + orderCurrency.setUpdated(Instant.now()); + orderCurrencyImdg.update(orderCurrency); + } catch (Exception e) { + log.error("Error updating status by orderNum {} with error:{}", orderId, ExceptionUtils.getStackTrace(e)); } - OrderStatus status = resolveStatusByImportState(sOrder.getState()); - if (status == null) { - continue; - } - orderCurrency.setStatus(status.getKey()); - orderCurrency.setExchangeOrderId(Long.valueOf(sOrder.getExchangeOrderNum())); - orderCurrency.setUpdated(Instant.now()); - orderCurrencyImdg.update(orderCurrency); } } private void updateByFix(BaseRequest req) { OrderCurrencyStatusUpdateRequest payload = req.getRequestPayload(); for (Long orderId : payload.getIds()) { - log.debug("Process updating status by orderNum {}", orderId); - SOrders sOrder = sOrdersImdg.getSingleObjectByPredicate( - sOrdersImdg.predicateBuilder().equals("orderNum", orderId) - ); - OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(orderId); - OrderStatus status = resolveStatusByFixState(sOrder.getState()); - if (status == null) { - continue; + try { + log.debug("Process updating status by orderNum {}", orderId); + SOrders sOrder = sOrdersImdg.getSingleObjectByPredicate( + sOrdersImdg.predicateBuilder().equals("orderNum", orderId) + ); + OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(orderId); + OrderStatus status = resolveStatusByFixState(sOrder.getState()); + if (status == null) { + continue; + } + orderCurrency.setStatus(status.getKey()); + if (orderCurrency.getExchangeOrderId() == null) { + orderCurrency.setExchangeOrderId(normalize(sOrder.getExchangeOrderNum())); + } + orderCurrency.setUpdated(Instant.now()); + orderCurrencyImdg.update(orderCurrency); + } catch (Exception e) { + log.error("Error updating status by orderNum {} with error:{}", orderId, ExceptionUtils.getStackTrace(e)); } - orderCurrency.setStatus(status.getKey()); - orderCurrency.setExchangeOrderId(Long.valueOf(sOrder.getExchangeOrderNum())); - orderCurrency.setUpdated(Instant.now()); - orderCurrencyImdg.update(orderCurrency); } } @@ -486,4 +500,17 @@ public class OrderCurrencyListener extends QueueConsumer implements Initializing default -> null; }; } + + private Long normalize(String value) { + if (StringUtils.isEmpty(value) || value.equals("0")){ + return 0L; + } + String[] parts = value.split("-", 3); + + if (parts.length != 3) { + throw new IllegalArgumentException("Ожидается формат: digits-text-digits"); + } + String digits = parts[0] + parts[2]; + return Long.valueOf(digits); + } } diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java index a9d01a5e3..bffb64867 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/service/OrderTemplateBuilder.java @@ -155,7 +155,7 @@ public class OrderTemplateBuilder { order.setTradingCode(registry.getTradingCode()); order.setCounterPartyId(clcc.companyId()); order.setCounterTradingCode(clcc.tradingCode()); - order.setComment("Type=3"); + order.setComment("Type=1"); order.setType("PLOV"); return order; } @@ -171,7 +171,7 @@ public class OrderTemplateBuilder { order.setTradingCode(clcc.tradingCode()); order.setCounterPartyId(registry.getCompanyId()); order.setCounterTradingCode(registry.getTradingCode()); - order.setComment("Type=3"); + order.setComment("Type=1"); order.setType("PLOV"); return order; }