Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
ialbert 2026-05-06 14:04:58 +03:00
commit e885acf843
15 changed files with 141 additions and 34 deletions

View file

@ -17,7 +17,7 @@ preflight:
stage: preflight
script:
- pwd
- git clone "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git"
- git clone -b xml-files "http://gitlab-ci-token:$ACCESS_TOKEN@git.mfd.msk/mfd/clearing_test.git"
- find /builds/mfd/clearing/clearing_test -name ".gitkeep" -type f -delete
artifacts:
name: "$CI_COMMIT_REF_NAME"

View file

@ -1,6 +1,6 @@
{
"version": "3.23.295.169",
"version": "3.23.295.170",
"enums": {
@ -11064,31 +11064,31 @@
}
,
{"code": "currencyPair",
"name": "Код валютной пары","shortname": "Код валютной пары","type": 2,"length": 12
"name": "Код валютной пары","shortname": "Код валютной пары","type": 2,"length": 12,"visible": true
}
,
{"code": "currencyPairId",
"name": "Идентификатор валютной пары","shortname": "Валютная пара","type": 1
"name": "Идентификатор валютной пары","shortname": "Валютная пара","type": 1,"visible": true
}
,
{"code": "settlementType",
"name": "Код расчета","shortname": "Код расчета","type": 2,"length": 4
"name": "Код расчета","shortname": "Код расчета","type": 2,"length": 4,"visible": true
}
,
{"code": "value",
"name": "Ставка","shortname": "Ставка","type": 10
"name": "Ставка","shortname": "Ставка","type": 10,"visible": true
}
,
{"code": "penaltyValue",
"name": "Ставка переноса при нехватке валюты","shortname": "Ставка переноса при нехватке валюты","type": 10
"name": "Ставка переноса при нехватке валюты","shortname": "Ставка переноса при нехватке валюты","type": 10,"visible": true
}
,
{"code": "quoteValue",
"name": "Ставка переноса при нехватке рублей","shortname": "Ставка переноса при нехватке рублей","type": 10
"name": "Ставка переноса при нехватке рублей","shortname": "Ставка переноса при нехватке рублей","type": 10,"visible": true
}
,
{"code": "workflowStatus",
"name": "Статус","shortname": "Статус","type": 2,"length": 4,"link": "workflowStatus"
"name": "Статус","shortname": "Статус","type": 2,"length": 4,"link": "workflowStatus","visible": true
}
]
,"actions":[
@ -11176,23 +11176,23 @@
}
,
{"code": "currencyId",
"name": "Идентификатор валюты","shortname": "Валюта","type": 1
"name": "Идентификатор валюты","shortname": "Валюта","type": 1,"visible": true
}
,
{"code": "currency",
"name": "Код валюты","shortname": "Код валюты","type": 2,"length": 4
"name": "Код валюты","shortname": "Код валюты","type": 2,"length": 4,"visible": true
}
,
{"code": "valueDate",
"name": "Дата, на которую расчетный курс","shortname": "Дата","type": 6
"name": "Дата, на которую расчетный курс","shortname": "Дата","type": 6,"visible": true
}
,
{"code": "value",
"name": "Расчетный курс","shortname": "Расчетный курс","type": 10
"name": "Расчетный курс","shortname": "Расчетный курс","type": 10,"visible": true
}
,
{"code": "workflowStatus",
"name": "Статус","shortname": "Статус","type": 2,"length": 4,"link": "workflowStatus"
"name": "Статус","shortname": "Статус","type": 2,"length": 4,"link": "workflowStatus","visible": true
}
]
,"actions":[

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--?xml-stylesheet type="text/xsl" href="\..\corp-reports\src\data\meta\meta.server.xslt"?-->
<meta version="3.23.295.169">
<meta version="3.23.295.170">
<!-- _xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" _xsi:noNamespaceSchemaLocation="file:///E:/d/projects/meta/from/meta.xsd" -->
<!--Здесь словари-->
<enums>
@ -2564,13 +2564,13 @@
</blacklistMarket>
<riskParameter name="Параметры риска" destination="risk-parameter" class="ru.clearing.classes.statics.data.security.RiskParameter" table="risk-parameter">
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
<currencyPair name="Код валютной пары" shortname="Код валютной пары" type="2" length="12"/>
<currencyPairId name="Идентификатор валютной пары" shortname="Валютная пара" type="1"/>
<settlementType name="Код расчета" shortname="Код расчета" type="2" length="4"/>
<value name="Ставка" shortname="Ставка" type="10"/>
<penaltyValue name="Ставка переноса при нехватке валюты" shortname="Ставка переноса при нехватке валюты" type="10"/>
<quoteValue name="Ставка переноса при нехватке рублей" shortname="Ставка переноса при нехватке рублей" type="10"/>
<workflowStatus name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus"/>
<currencyPair name="Код валютной пары" shortname="Код валютной пары" type="2" length="12" visible="true"/>
<currencyPairId name="Идентификатор валютной пары" shortname="Валютная пара" type="1" visible="true"/>
<settlementType name="Код расчета" shortname="Код расчета" type="2" length="4" visible="true"/>
<value name="Ставка" shortname="Ставка" type="10" visible="true"/>
<penaltyValue name="Ставка переноса при нехватке валюты" shortname="Ставка переноса при нехватке валюты" type="10" visible="true"/>
<quoteValue name="Ставка переноса при нехватке рублей" shortname="Ставка переноса при нехватке рублей" type="10" visible="true"/>
<workflowStatus name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus" visible="true"/>
<actions>
<post name="Добавление параметров риска" confirmation="value,penaltyValue,quoteValue,settlementType,currencyPairId,workflowStatus" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RiskParameterNewAction">
<currencyPairId name="Идентификатор валютной пары" shortname="Валютная пара" type="1" link="currencyPair" linkCode="code" linkKeyCode="id"/>
@ -2591,11 +2591,11 @@
</riskParameter>
<rates name="Расчетные курсы" destination="rates" class="ru.clearing.classes.statics.data.security.Rates" table="rates">
<id type="1" name="Идентификатор записи" shortname="ID" searchable="true" sortable="true" visible="true"/>
<currencyId name="Идентификатор валюты" shortname="Валюта" type="1"/>
<currency name="Код валюты" shortname="Код валюты" type="2" length="4"/>
<valueDate name="Дата, на которую расчетный курс" shortname="Дата" type="6"/>
<value name="Расчетный курс" shortname="Расчетный курс" type="10"/>
<workflowStatus name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus"/>
<currencyId name="Идентификатор валюты" shortname="Валюта" type="1" visible="true"/>
<currency name="Код валюты" shortname="Код валюты" type="2" length="4" visible="true"/>
<valueDate name="Дата, на которую расчетный курс" shortname="Дата" type="6" visible="true"/>
<value name="Расчетный курс" shortname="Расчетный курс" type="10" visible="true"/>
<workflowStatus name="Статус" shortname="Статус" type="2" length="4" link="workflowStatus" visible="true"/>
<actions>
<post name="Добавление расчетного курса" confirmation="value,valueDate,currencyId,workflowStatus" class="ru.spcex.clearing.backendapi.controller.request.cud.securities.RatesNewAction">
<currencyId name="Идентификатор валюты" shortname="Валюта" type="1" link="currencyCode" linkCode="code" linkKeyCode="id"/>

View file

@ -1337,6 +1337,8 @@ INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (11003, 'DFLT', 'Доб
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (11004, 'DFLT', 'Изменение ДУК возможно только для балансирующих сделок ПЛ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (11005, 'DFLT', 'Неверное значение параметра %s') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (11006, 'DFLT', 'Запись с кодом %s в справочнике %s не найдена.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (11007, 'DFLT', 'Не заданы обязательные поля.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO ERROR_CODE_DICTIONARY(ID, CODE, NAME) values (11008, 'DFLT', 'Недопустимая операция.') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO RESIDENCE_DICTIONARY(ID, CODE, NAME) values (1, 'RUS', 'Резидент РФ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;
INSERT INTO RESIDENCE_DICTIONARY(ID, CODE, NAME) values (2, 'XTRN', 'Нерезидент РФ') ON CONFLICT (ID) DO UPDATE SET CODE = EXCLUDED.CODE, NAME = EXCLUDED.NAME;

View file

@ -6,6 +6,7 @@ import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@ -40,6 +41,7 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
import ru.spcex.platform.enumeration.CurrencyCode;
import ru.spcex.platform.enumeration.ObjectType;
import ru.spcex.platform.enumeration.OrderStatus;
import ru.spcex.platform.enumeration.OvernightType;
import ru.spcex.platform.enumeration.Priority;
import ru.spcex.platform.enumeration.Task;
@ -53,6 +55,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
protected final Logger log = LoggerFactory.getLogger(getClass());
private final ImdgQueryService imdgQueryService;
private final Imdg<Registry> registryImdg;
private final Imdg<OrderCurrency> orderCurrencyImdg;
private final SwapOvernightOrderService swapOvernightOrderService;
private final SpotOvernightOrderService spotOvernightOrderService;
private final OrderCurrencyTriExportService orderCurrencyTriExportService;
@ -74,6 +77,7 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
super(kafkaQueue, kafkaProducer);
this.imdgQueryService = imdgQueryService;
this.registryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Registry, Registry.class);
this.orderCurrencyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OrderCurrency, OrderCurrency.class);
this.swapOvernightOrderService = swapOvernightOrderService;
this.spotOvernightOrderService = spotOvernightOrderService;
this.orderCurrencyTriExportService = orderCurrencyTriExportService;
@ -96,6 +100,14 @@ public class TaskListener extends QueueConsumer implements InitializingBean {
private void createOrder(BaseRequest<LauncherCommandRequest> newReq) {
log.info("CROR createOrder started, request={}", newReq);
Collection<Long> cretOrderIds = imdgQueryService.getCretOrderCurrency();
for (Long cretOrderId : cretOrderIds) {
OrderCurrency orderCurrency = orderCurrencyImdg.getSingleObjectByID(cretOrderId);
orderCurrency.setStatus(OrderStatus.REJECTED.getKey());
orderCurrency.setUpdated(Instant.now());
orderCurrencyImdg.update(orderCurrency);
}
Collection<Long> registryIds = imdgQueryService.getCurrencyRegistry();
//todo очередность создания
if (registryIds == null || registryIds.isEmpty()) {

View file

@ -77,6 +77,13 @@ public class ImdgQueryService {
return registryImdg.getCollectionIdsByPredicate(registryPredicate);
}
public Collection<Long> getCretOrderCurrency() {
ImdgPredicateBuilder builder = orderCurrencyImdg.predicateBuilder();
return orderCurrencyImdg.getCollectionIdsByPredicate(
builder.equals("status", OrderStatus.CREATED.getKey())
);
}
public Collection<OrderCurrency> getClccOrderCurrencyIds() {
ImdgPredicateBuilder builder = orderCurrencyImdg.predicateBuilder();
CompanyRoleSet companyRoleSet = companyRoleSetImdg.getFirstObjectByPredicate(

View file

@ -133,11 +133,10 @@ public class OrderCalculationService {
private BigDecimal swapPriceCalc(String baseCurrency, BigDecimal s, BigDecimal n, int precision) {
Rates rate = imdgQueryService.getRate(baseCurrency, LocalDate.now());
BigDecimal p = BigDecimal.ONE.divide(n, MC);
log.info("Calculation swap price: {}*{}*{}", s, n, p);
BigDecimal p = n.divide(BigDecimal.valueOf(365), MC);
log.info("Calculation swap price: {}*{}*{}", rate.getValue(), s, p);
return rate.getValue()
.multiply(s, MC)
.multiply(n, MC)
.multiply(p, MC)
.setScale(precision, RoundingMode.HALF_UP);
}

View file

@ -7,8 +7,10 @@ kill -9 $(ps -ef | grep java | grep company-service.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep clearing-service.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep dbf-exporter.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep lim-exporter.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep xml-exporter.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep swt-exporter.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep dbf-importer.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep xml-importer.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep trade-importer.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep imdg.jar | awk '{print $2}')
kill -9 $(ps -ef | grep java | grep securities-service.jar | awk '{print $2}')

View file

@ -15,10 +15,13 @@ java -jar $CLEARING_HOME/bin/account-service.jar --spring.config.location=$CLEAR
java -jar $CLEARING_HOME/bin/clearing-service.jar --spring.config.location=$CLEARING_HOME/settings/clearing-service/ &
java -jar $CLEARING_HOME/bin/scheduler-service.jar --spring.config.location=$CLEARING_HOME/settings/scheduler-service/ &
java -jar $CLEARING_HOME/bin/dbf-exporter.jar --spring.config.location=$CLEARING_HOME/settings/dbf-exporter/ &
java -jar $CLEARING_HOME/bin/dbf-importer.jar --spring.config.location=$CLEARING_HOME/settings/dbf-importer/ &
#java -jar $CLEARING_HOME/bin/dbf-exporter.jar --spring.config.location=$CLEARING_HOME/settings/dbf-exporter/ &
#java -jar $CLEARING_HOME/bin/dbf-importer.jar --spring.config.location=$CLEARING_HOME/settings/dbf-importer/ &
java -jar $CLEARING_HOME/bin/swt-exporter.jar --spring.config.location=$CLEARING_HOME/settings/swt-exporter/ &
java -jar $CLEARING_HOME/bin/swt-importer.jar --spring.config.location=$CLEARING_HOME/settings/swt-importer/ &
java -jar $CLEARING_HOME/bin/xml-exporter.jar --spring.config.location=$CLEARING_HOME/settings/xml-exporter/ &
java -jar $CLEARING_HOME/bin/xml-importer.jar --spring.config.location=$CLEARING_HOME/settings/xml-importer/ &
echo all services launched starting. $?

View file

@ -0,0 +1,38 @@
spring.main.web-application-type=none
export-xml-service.hazelcast.cluster-members=localhost:5701
export-xml-service.hazelcast.login=dev
export-xml-service.hazelcast.password=dev-pass
export-xml-service.common.encoding=cp866
export-xml-service.common.threads-count=10
export-xml-service.store.local-temp-dir=/opt/clearing/files/xml/exporter/
export-xml-service.store.out-pay-val-dir.RUB=/out/prc/
export-xml-service.store.out-pay-val-dir.EUR=/out/prc/
export-xml-service.store.out-pay-val-dir.CNY=/out/prc/
export-xml-service.store.user=user
export-xml-service.store.password=Aa111111
export-xml-service.store.server-ip=sftp
export-xml-service.store.server-port=22
export-xml-service.kafka-consumer.bootstrap-servers=kafka:9092
export-xml-service.kafka-consumer.group-id=dev-group-balance-service
export-xml-service.kafka-consumer.enable-auto-commit=false
export-xml-service.kafka-consumer.session-timeout-ms=30000
export-xml-service.kafka-consumer.auto-offset-reset=latest
export-xml-service.kafka-consumer.linger-ms=1
export-xml-service.kafka-consumer.buffer-memory=33554432
export-xml-service.kafka-producer.bootstrap-servers=kafka:9092
export-xml-service.kafka-producer.acks=all
export-xml-service.kafka-producer.retries=0
export-xml-service.kafka-producer.batch-size=16384
export-xml-service.kafka-producer.linger-ms=1
export-xml-service.kafka-producer.buffer-memory=33554432
export-xml-service.section=S
export-xml-service.sender=LCC
export-xml-service.receiver=\u0422\u0435\u0441\u0442

View file

@ -0,0 +1,44 @@
spring.main.web-application-type=none
import-xml-service.process-files=true
import-xml-service.process-lks-files=false
import-xml-service.scheduler.check-src-dir-cron=*/3 * * * * *
import-xml-service.store.delete-src-files=false
import-xml-service.store.src-dir=/opt/clearing/files/xml/importer/in
import-xml-service.store.out-dir=/opt/clearing/files/xml/importer/out/
import-xml-service.store.out-dir-error=/opt/clearing/files/xml/importer/error/
import-xml-service.common.encoding-source=cp866
import-xml-service.common.insert-batch-size=100
import-xml-service.common.threads-count=10
#sftpSrcDir
import-xml-service.store.sftp-in.sftp-src-dir=/in/prc/
import-xml-service.store.sftp-in.sftp-src-pay-val-dir.rub=/in/prc/
import-xml-service.store.sftp-in.sftp-src-pay-val-dir.eur=/in/prc/
import-xml-service.store.sftp-in.user=user
import-xml-service.store.sftp-in.password=Aa111111
import-xml-service.store.sftp-in.server-ip=sftp
import-xml-service.store.sftp-in.server-port=22
import-xml-service.hazelcast.cluster-members=localhost:5701
import-xml-service.hazelcast.login=dev
import-xml-service.hazelcast.password=dev-pass
import-xml-service.kafka-producer.bootstrap-servers=kafka:9092
import-xml-service.kafka-producer.acks=all
import-xml-service.kafka-producer.retries=0
import-xml-service.kafka-producer.batch-size=16384
import-xml-service.kafka-producer.linger-ms=1
import-xml-service.kafka-producer.buffer-memory=33554432
import-xml-service.kafka-consumer.bootstrap-servers=kafka:9092
import-xml-service.kafka-consumer.group-id=dev-group-clearing-service
import-xml-service.kafka-consumer.enable-auto-commit=false
import-xml-service.kafka-consumer.session-timeout-ms=30000
import-xml-service.kafka-consumer.auto-offset-reset=latest
import-xml-service.kafka-consumer.linger-ms=1
import-xml-service.kafka-consumer.buffer-memory=33554432

View file

@ -10,7 +10,7 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(me
DATA_ROOT_DIR = os.environ['CLEARING_TEST_DIR']
CLR_TEST_DIR = os.environ['CLR_TEST_DIR']
RESULT_FILES_DIR = os.environ['RESULT_FILES_DIR']
DDL_VERSION_FROM = (3, 18, 0)
DDL_VERSION_FROM = (3, 23, 0)
def run_docker(folder_name: str) -> int:
@ -103,7 +103,7 @@ def apply_test_case(folder: str) -> None:
copy_directory(f"{DATA_ROOT_DIR}/{folder}/data",
f"{CLR_TEST_DIR}/db/data")
remove_files_with_extensions(".xml")
# remove_files_with_extensions(".xml")
# change_date(folder)
exit_code = run_docker(folder)
append_to_log_file(folder, exit_code)