From 17b298b5a4da0ac2d9a298e21532ab6795e8c007 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 26 Dec 2022 14:22:21 +0300 Subject: [PATCH 01/11] meta.xml 2.4.1.0 --- .../src/main/resources/meta/meta.xml | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) 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 ce5377bf7..6b432b31c 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 @@ - + @@ -293,7 +293,7 @@ - + @@ -303,7 +303,7 @@ - + @@ -311,7 +311,7 @@ - + @@ -349,7 +349,7 @@ - + @@ -361,7 +361,7 @@ - + @@ -371,7 +371,7 @@ - + @@ -385,7 +385,7 @@ - + @@ -408,7 +408,7 @@ - + @@ -421,12 +421,12 @@ + + - - @@ -740,7 +740,7 @@ - + @@ -750,7 +750,7 @@ - + @@ -887,9 +887,9 @@ - - - + + + @@ -912,9 +912,9 @@ - - - + + + @@ -1059,7 +1059,7 @@ - + @@ -1122,7 +1122,7 @@ - + @@ -1153,7 +1153,7 @@ - + @@ -1613,9 +1613,9 @@ - - - + + + From a5320f36f3dbbc1341639251d97d710427bba80f Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 26 Dec 2022 15:22:52 +0300 Subject: [PATCH 02/11] MoneyMarketSecurity GET filter --- .../securities/CudMoneyMarketSecurityController.java | 5 ++++- .../spcex/clearing/backendapi/service/IStateLoader.java | 1 + .../backendapi/service/impl/StateLoaderImpl.java | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/securities/CudMoneyMarketSecurityController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/securities/CudMoneyMarketSecurityController.java index 7feceaedb..197c0fe52 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/securities/CudMoneyMarketSecurityController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/securities/CudMoneyMarketSecurityController.java @@ -20,6 +20,7 @@ import ru.spcex.clearing.backendapi.service.IOperator; import ru.spcex.clearing.backendapi.service.IStateLoader; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.platform.enumeration.Status; import java.util.Collection; import java.util.Map; @@ -75,7 +76,9 @@ public class CudMoneyMarketSecurityController extends AbstractQueueController { @RequestMapping(method = RequestMethod.GET) @ResponseBody public CommonGetAllResponse getAll() { - Collection> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + Collection> all = stateLoader.getAllMetaTransform(IMDGDistributedNames.Map_MoneyMarketSecurity, + MoneyMarketSecurity.class, + Map.of("workflowStatus", Status.Active.getKey())); CommonGetAllResponse response = new CommonGetAllResponse(); response.fromEntity(all); return response; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java index c8caa0caa..b5fd01105 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/IStateLoader.java @@ -13,4 +13,5 @@ public interface IStateLoader { Optional getById(Long id, String mapName, Class clazz); Collection getAll(String mapName, Class clazz); Collection> getAllMetaTransform(String mapName, Class clazz); + Collection> getAllMetaTransform(String mapName, Class clazz, Map> conditions); } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java index 8d21ba817..afd00a665 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/StateLoaderImpl.java @@ -44,6 +44,15 @@ public class StateLoaderImpl implements IStateLoader { return responseFactory.responseFromObjectCollection(all); } + @Override + public Collection> getAllMetaTransform(String mapName, + Class clazz, + Map> conditions) { + Imdg imdg = getImdg(mapName, clazz); + Collection all = imdg.getCollectionObjectsByFieldValues(conditions); + return responseFactory.responseFromObjectCollection(all); + } + @SuppressWarnings("unchecked") private Imdg getImdg(String mapName, Class clazz) { return (Imdg) allImdgMaps.computeIfAbsent(mapName, (mapName1) -> imdgProvider.getImdg(mapName, clazz)); From 2ad1b73300f9589325e3cbcc965f86b357f25d3e Mon Sep 17 00:00:00 2001 From: aalehin Date: Mon, 26 Dec 2022 16:55:51 +0300 Subject: [PATCH 03/11] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-78=20?= =?UTF-8?q?---=20=D0=9F=D1=80=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=20=D0=B2=20plannerTemplate=20=D0=B8=20clearingCalendar=20?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=D0=BB=D0=B5=20createdAt=20=D1=81=D0=BE?= =?UTF-8?q?=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D1=81=D1=82=D0=B2=D1=83=D1=8E?= =?UTF-8?q?=D1=89=D0=B8=D1=85=20=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=B7=D0=B0=D0=BF=D0=BE=D0=BB=D0=BD=D1=8F=D0=BB?= =?UTF-8?q?=D0=BE=D1=81=D1=8C=20=D0=B2=D1=80=D0=B5=D0=BC=D1=8F=20=D1=81?= =?UTF-8?q?=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ClearingCalendarService.java | 18 ++- .../service/PlannerTemplateService.java | 6 +- .../HazelcastServiceTestConfiguration.java | 68 +++++++++ .../service/ClearingCalendarServiceTest.java | 138 +++++++++++++++++ .../service/PlannerTemplateServiceTest.java | 141 ++++++++++++++++++ .../scheduler/utils/MatcherFactory.java | 38 +++++ 6 files changed, 401 insertions(+), 8 deletions(-) create mode 100644 clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java create mode 100644 clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java create mode 100644 clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java create mode 100644 clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java index 70bd24147..3a86684b7 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/ClearingCalendarService.java @@ -18,6 +18,8 @@ import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import java.time.Instant; + @Service public class ClearingCalendarService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); @@ -33,21 +35,23 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi @Override public void afterPropertiesSet() { callback(ClearingCalendarNewRequest.class) - .setConsumer(this::newTradingCalendar) + .setConsumer(this::newClearingCalendar) .forDestination(Consts.DESTINATION_CLEARING_CALENDAR_NEW, callbacks::put); callback(ClearingCalendarUpdateRequest.class) - .setConsumer(this::updateTradingCalendar) + .setConsumer(this::updateClearingCalendar) .forDestination(Consts.DESTINATION_CLEARING_CALENDAR_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::deleteTradingCalendar) + .setConsumer(this::deleteClearingCalendar) .forDestination(Consts.DESTINATION_CLEARING_CALENDAR_DELETE, callbacks::put); init(); } - private void newTradingCalendar(BaseRequest userRequest) { + private void newClearingCalendar(BaseRequest userRequest) { ClearingCalendarNewRequest req = userRequest.getRequestPayload(); log.debug("ClearingCalendarNewRequest received"); ClearingCalendar clearingCalendar = new ClearingCalendar(); + Instant created = Instant.now(); + clearingCalendar.setCreated(created); clearingCalendar.setClearingDate(req.getClearingDate()); clearingCalendar.setCompanyId(req.getCompanyId()); clearingCalendar.setDayStatus(req.getDayStatus()); @@ -55,18 +59,20 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi log.debug("successfully processed, new id {}", clearingCalendar.getId()); } - private void updateTradingCalendar(BaseRequest userRequest) { + private void updateClearingCalendar(BaseRequest userRequest) { ClearingCalendarUpdateRequest req = userRequest.getRequestPayload(); log.debug("ClearingCalendarUpdateRequest received"); + Instant updated = Instant.now(); ClearingCalendar clearingCalendar = clearingCalendarMap.getSingleObjectByID(req.getId()); clearingCalendar.setClearingDate(req.getClearingDate()); clearingCalendar.setCompanyId(req.getCompanyId()); clearingCalendar.setDayStatus(req.getDayStatus()); + clearingCalendar.setUpdated(updated); clearingCalendarMap.update(clearingCalendar); log.debug("successfully processed, new id {}", clearingCalendar.getId()); } - private void deleteTradingCalendar(BaseRequest userRequest) { + private void deleteClearingCalendar(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); log.debug("CommonDeleteRequest received id = {}", req.getId()); ClearingCalendar clearingCalendar = clearingCalendarMap.getSingleObjectByID(req.getId()); diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java index 491e884dc..77a1466a0 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/PlannerTemplateService.java @@ -50,7 +50,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin PlannerTemplateNewRequest req = userRequest.getRequestPayload(); log.debug("PlannerTemplateNewRequest received"); PlannerTemplate plannerTemplate = new PlannerTemplate(); - plannerTemplate.setCreated(Instant.now()); + Instant created = Instant.now(); + plannerTemplate.setCreated(created); plannerTemplate.setTask(req.getTask()); plannerTemplate.setTaskTime(req.getTaskTime()); plannerTemplate.setTaskStatus(req.getTaskStatus()); @@ -64,7 +65,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin PlannerTemplateUpdateRequest req = userRequest.getRequestPayload(); log.debug("PlannerTemplateUpdateRequest received"); PlannerTemplate plannerTemplate = plannerTemplateMap.getSingleObjectByID(req.getId()); - plannerTemplate.setUpdated(Instant.now()); + Instant updated = Instant.now(); + plannerTemplate.setUpdated(updated); plannerTemplate.setTask(req.getTask()); plannerTemplate.setTaskTime(req.getTaskTime()); plannerTemplate.setTaskStatus(req.getTaskStatus()); diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java new file mode 100644 index 000000000..af55150d0 --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/config/HazelcastServiceTestConfiguration.java @@ -0,0 +1,68 @@ +package ru.specx.clearing.scheduler.config; + +import com.hazelcast.config.*; +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.imdg.iml.hazelcast.util.HazelcastHelper; + +import java.util.List; +import java.util.Random; + +@Configuration +public class HazelcastServiceTestConfiguration { + private HazelcastInstance hazelcastInstance; + + private static ThreadPoolTaskExecutor createThreadPoolTaskExecutor(int maxPoolSz, boolean waitForCompletion) { + ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); + if (maxPoolSz > 2) { + pool.setKeepAliveSeconds(60); + pool.setAllowCoreThreadTimeOut(true); + } + pool.setCorePoolSize(maxPoolSz); + pool.setWaitForTasksToCompleteOnShutdown(waitForCompletion); + return pool; + } + + @Bean(name = "hazelcastServiceTest") + public HazelcastService hazelcastService(@Qualifier("taskExecutorHazelcastClientInitializer") ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer, @Qualifier("taskExecutorIdGeneratorAwaiter") ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter, HazelcastClientParams params) { + Config cfg = new Config(); + cfg.setInstanceName("localhost"); + + NetworkConfig networkConfig = new NetworkConfig(); + JoinConfig joinConfig = new JoinConfig(); + joinConfig.setMulticastConfig(new MulticastConfig().setEnabled(false)); + joinConfig.setTcpIpConfig(new TcpIpConfig().setEnabled(true).setMembers(List.of("127.0.0.1"))); + networkConfig.setJoin(joinConfig); + cfg.setNetworkConfig(networkConfig); + hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); + HazelcastHelper.otcSystem_setStorageState(true, hazelcastInstance); + return new HazelcastService(taskExecutorHazelcastClientInitializer, taskExecutorIdGeneratorAwaiter, params); + } + + @Bean(name = "taskExecutorHazelcastClientInitializer") + public ThreadPoolTaskExecutor taskExecutorHazelcastClientInitializer() { + return createThreadPoolTaskExecutor(1, true); + } + + @Bean(name = "taskExecutorIdGeneratorAwaiter") + public ThreadPoolTaskExecutor taskExecutorIdGeneratorAwaiter() { + return createThreadPoolTaskExecutor(1, false); + } + + @Bean(name = "hazelcastClientParams") + public HazelcastClientParams getHazelcastClientParams() { + HazelcastClientParams params = new HazelcastClientParams(); + params.setLogin("dev"); + params.setPassword("dev-pass"); + params.setClusterMembers("127.0.0.1"); + params.setInstanceName("hzTestClient" + new Random().nextInt()); + params.setNearCacheConfig(new NearCacheConfig()); + return params; + } +} diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java new file mode 100644 index 000000000..7307966f9 --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/ClearingCalendarServiceTest.java @@ -0,0 +1,138 @@ +package ru.specx.clearing.scheduler.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.EntryRemovedListener; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.consumer.OffsetResetStrategy; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.common.TopicPartition; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.profile.Contact; +import ru.clearing.classes.statics.data.scheduler.ClearingCalendar; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.ClearingCalendarNewRequest; +import ru.spcex.clearing.scheduler.service.ClearingCalendarService; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.specx.clearing.scheduler.config.HazelcastServiceTestConfiguration; + +import java.time.Instant; +import java.time.LocalDate; +import java.util.Collections; +import java.util.HashMap; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + HazelcastServiceTestConfiguration.class}) +class ClearingCalendarServiceTest { + + private static final int PARTITION = 0; + private static final String TOPIC_CLEARING_CALENDAR_NEW = Consts.DESTINATION_CLEARING_CALENDAR_NEW; + private static final Long ID = 0L; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + private MockConsumer mockConsumer; + private MockProducer mockProducer; + + @BeforeEach + void setUp() { + mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST); + mockProducer = new MockProducer<>(); + } + + /** + * {@link ClearingCalendarService#newTradingCalendar(BaseRequest)}(BaseRequest)}
+ * Тест проверяет создание сущности {@link ClearingCalendar} в Hazelcast при передаче из Apache Kafka.
+ * Входной запрос {@link ClearingCalendarNewRequest}:
+ */ + @Test + public void newClearingCalendarInQueue() throws InterruptedException { + //ARRANGE + + ClearingCalendar clearingCalendar = new ClearingCalendar(); + Instant created = Instant.now(); + clearingCalendar.setCreated(created); + clearingCalendar.setClearingDate(LocalDate.now()); + clearingCalendar.setCompanyId(0L); + clearingCalendar.setDayStatus("STATUS"); + + ClearingCalendarNewRequest clearingCalendarNewRequest = new ClearingCalendarNewRequest(); + clearingCalendarNewRequest.setClearingDate(clearingCalendar.getClearingDate()); + clearingCalendarNewRequest.setCompanyId(clearingCalendar.getCompanyId()); + clearingCalendarNewRequest.setDayStatus(clearingCalendar.getDayStatus()); + + BaseRequest baseNewRequest = new BaseRequest<>(); + baseNewRequest.setRequestPayload(clearingCalendarNewRequest); + baseNewRequest.setId(ID); + baseNewRequest.setActionType(ActionType.NEW); + String jsonBaseForRequest; + ObjectMapper objectMapper = new ObjectMapper(); + try { + jsonBaseForRequest = objectMapper.writeValueAsString(baseNewRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + //ACT + //service set up + ClearingCalendarService clearingCalendarService = new ClearingCalendarService(mockConsumer, mockProducer, hazelcastServiceTest); + + //callbacks set up + clearingCalendarService.afterPropertiesSet(); + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_ClearingCalendar); + //KAFKA + HashMap startOffsetsUpdating = new HashMap<>(); + TopicPartition topic = new TopicPartition(TOPIC_CLEARING_CALENDAR_NEW, PARTITION); + startOffsetsUpdating.put(topic, 0L); + mockConsumer.updateBeginningOffsets(startOffsetsUpdating); + + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_CLEARING_CALENDAR_NEW, PARTITION))); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_CLEARING_CALENDAR_NEW, PARTITION, 0, "key", jsonBaseForRequest)); + }); + + //waiting for hazelcast map item removes + Object waiter = new Object(); + String listenerID = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { + System.out.println("Checking If pushed.."); + + try { + waiter.wait(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + synchronized (waiter) { + waiter.notify(); + } + }, false); + + synchronized (waiter) { + waiter.wait(100); + } + ClearingCalendar clearingCalendarRes = iMap.get(iMap.keySet().stream().findFirst().get()); + //ASSERT + Assertions.assertEquals(1, iMap.size()); + + Assertions.assertNotNull(clearingCalendarRes.getCreated()); + Assertions.assertEquals(clearingCalendar.getClearingDate(), clearingCalendarRes.getClearingDate()); + Assertions.assertEquals(clearingCalendar.getCompanyId(), clearingCalendarRes.getCompanyId()); + Assertions.assertEquals(clearingCalendar.getDayStatus(), clearingCalendarRes.getDayStatus()); + + //preparing hazelcastImdgProvider for next test + iMap.removeEntryListener(listenerID); + } +} \ No newline at end of file diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java new file mode 100644 index 000000000..ff5ac8109 --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/service/PlannerTemplateServiceTest.java @@ -0,0 +1,141 @@ +package ru.specx.clearing.scheduler.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.hazelcast.core.IMap; +import com.hazelcast.map.listener.EntryRemovedListener; +import org.apache.kafka.clients.consumer.ConsumerRecord; +import org.apache.kafka.clients.consumer.MockConsumer; +import org.apache.kafka.clients.consumer.OffsetResetStrategy; +import org.apache.kafka.clients.producer.MockProducer; +import org.apache.kafka.common.TopicPartition; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import ru.clearing.classes.statics.data.profile.Contact; +import ru.clearing.classes.statics.data.scheduler.PlannerTemplate; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerTemplateNewRequest; +import ru.spcex.clearing.scheduler.service.PlannerTemplateService; +import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.specx.clearing.scheduler.config.HazelcastServiceTestConfiguration; + +import java.time.Instant; +import java.time.LocalTime; +import java.util.Collections; +import java.util.HashMap; + +@ExtendWith(SpringExtension.class) +@ContextConfiguration(classes = { + HazelcastServiceTestConfiguration.class}) +class PlannerTemplateServiceTest { + + private static final int PARTITION = 0; + private static final String TOPIC_PLANNER_TEMPLATE_NEW = Consts.DESTINATION_PLANNER_TEMPLATE_NEW; + private static final Long ID = 0L; + + @Autowired + @Qualifier("hazelcastServiceTest") + private HazelcastService hazelcastServiceTest; + private MockConsumer mockConsumer; + private MockProducer mockProducer; + + @BeforeEach + void setUp() { + mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST); + mockProducer = new MockProducer<>(); + } + + /** + * {@link PlannerTemplateService#newTimetable(BaseRequest)}(BaseRequest)}
+ * Тест проверяет создание сущности {@link ru.clearing.classes.statics.data.scheduler.PlannerTemplate} в Hazelcast при передаче из Apache Kafka.
+ * Входной запрос {@link PlannerTemplateNewRequest}:
+ */ + @Test + public void newPlannerTemplateInQueue() throws InterruptedException { + //ARRANGE + Instant created = Instant.now(); + PlannerTemplate plannerTemplate = new PlannerTemplate(); + plannerTemplate.setTask("TASK"); + plannerTemplate.setTaskTime(LocalTime.MIDNIGHT); + plannerTemplate.setTaskStatus("TASK_STATUS"); + plannerTemplate.setCompanyId(0L); + plannerTemplate.setSecurityId(10L); + + PlannerTemplateNewRequest plannerTemplateNewRequest = new PlannerTemplateNewRequest(); + plannerTemplateNewRequest.setTask(plannerTemplate.getTask()); + plannerTemplateNewRequest.setTaskTime(plannerTemplate.getTaskTime()); + plannerTemplateNewRequest.setTaskStatus(plannerTemplate.getTaskStatus()); + plannerTemplateNewRequest.setCompanyId(plannerTemplate.getCompanyId()); + plannerTemplateNewRequest.setSecurityId(plannerTemplate.getSecurityId()); + + BaseRequest plannerTemplateRequest = new BaseRequest<>(); + plannerTemplateRequest.setRequestPayload(plannerTemplateNewRequest); + plannerTemplateRequest.setId(ID); + plannerTemplateRequest.setActionType(ActionType.NEW); + String jsonBaseForDeleteRequest; + ObjectMapper objectMapper = new ObjectMapper(); + try { + jsonBaseForDeleteRequest = objectMapper.writeValueAsString(plannerTemplateRequest); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + //ACT + //service set up + PlannerTemplateService plannerTemplateService = new PlannerTemplateService(mockConsumer, mockProducer, hazelcastServiceTest); + + //callbacks set up + plannerTemplateService.afterPropertiesSet(); + IMap iMap = hazelcastServiceTest.getHazelcast().getMap(IMDGDistributedNames.Map_PlannerTemplate); + //KAFKA + HashMap startOffsetsUpdating = new HashMap<>(); + TopicPartition topic = new TopicPartition(TOPIC_PLANNER_TEMPLATE_NEW, PARTITION); + startOffsetsUpdating.put(topic, 0L); + mockConsumer.updateBeginningOffsets(startOffsetsUpdating); + + mockConsumer.schedulePollTask(() -> { + mockConsumer.rebalance(Collections.singletonList(new TopicPartition(TOPIC_PLANNER_TEMPLATE_NEW, PARTITION))); + mockConsumer.addRecord(new ConsumerRecord<>(TOPIC_PLANNER_TEMPLATE_NEW, PARTITION, 0, "key", jsonBaseForDeleteRequest)); + }); + + //waiting for hazelcast map item removes + Object waiter = new Object(); + String listenerID = iMap.addEntryListener((EntryRemovedListener) entryEvent -> { + System.out.println("Checking If pushed.."); + + try { + waiter.wait(100); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + synchronized (waiter) { + waiter.notify(); + } + }, false); + + synchronized (waiter) { + waiter.wait(100); + } + PlannerTemplate plannerTemplateRes = iMap.get(iMap.keySet().stream().findFirst().get()); + //ASSERT + Assertions.assertEquals(1, iMap.size()); + + Assertions.assertNotNull(plannerTemplateRes.getCreated()); + Assertions.assertEquals(plannerTemplate.getTask(), plannerTemplateRes.getTask()); + Assertions.assertEquals(plannerTemplate.getTaskTime(), plannerTemplateRes.getTaskTime()); + Assertions.assertEquals(plannerTemplate.getTaskStatus(), plannerTemplateRes.getTaskStatus()); + Assertions.assertEquals(plannerTemplate.getCompanyId(), plannerTemplateRes.getCompanyId()); + Assertions.assertEquals(plannerTemplate.getSecurityId(), plannerTemplateRes.getSecurityId()); + //preparing hazelcastImdgProvider for next test + iMap.removeEntryListener(listenerID); + } +} \ No newline at end of file diff --git a/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java new file mode 100644 index 000000000..c214393ea --- /dev/null +++ b/clearing-parent/scheduler-service/src/test/java/ru/specx/clearing/scheduler/utils/MatcherFactory.java @@ -0,0 +1,38 @@ +package ru.specx.clearing.scheduler.utils; + +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Factory for creating test matchers. + *

+ * Comparing actual and expected objects via AssertJ + */ +public class MatcherFactory { + + public static Matcher usingIgnoringFieldsComparator(String... fieldsToIgnore) { + return new Matcher<>(fieldsToIgnore); + } + + public static class Matcher { + private final String[] fieldsToIgnore; + + private Matcher(String... fieldsToIgnore) { + this.fieldsToIgnore = fieldsToIgnore; + } + + public void assertMatch(T actual, T expected) { + assertThat(actual).usingRecursiveComparison().ignoringFields(fieldsToIgnore).isEqualTo(expected); + } + + @SafeVarargs + public final void assertMatch(Iterable actual, T... expected) { + assertMatch(actual, Arrays.asList(expected)); + } + + public void assertMatch(Iterable actual, Iterable expected) { + assertThat(actual).usingRecursiveFieldByFieldElementComparatorIgnoringFields(fieldsToIgnore).isEqualTo(expected); + } + } +} From 1d63a859c6dda3a4ef8e36932141dca8c1b56564 Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 26 Dec 2022 20:20:04 +0300 Subject: [PATCH 04/11] =?UTF-8?q?http://jira.mfd.msk:8088/browse/CLS-213?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=80=D0=B8=20=D0=B2=20=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dictionary/DictionaryBackendGetAll.java | 34 +++++++++++++--- .../DictionaryBackendGetFields.java | 2 +- .../DictionaryBackendGetSingleValueV2.java | 25 ++++++++++++ .../entity/dictionary/IDictionaryPayload.java | 4 ++ .../system/DictionaryController.java | 28 +++++++------ .../meta/ClearingDictionaryExtracted.java | 22 +++++++++++ .../backendapi/meta/GetResponseFactory.java | 15 +++++++ .../clearing/backendapi/meta/MetaServer.java | 39 +++++++++++++++++++ .../backendapi/meta/ObjectExtracted.java | 12 +++--- 9 files changed, 158 insertions(+), 23 deletions(-) create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetSingleValueV2.java create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/IDictionaryPayload.java create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ClearingDictionaryExtracted.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetAll.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetAll.java index 3d6c11aeb..c6c9b71f3 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetAll.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetAll.java @@ -9,25 +9,34 @@ import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; @ApiModel(description = "Ответ при получении объектов словаря.") public class DictionaryBackendGetAll extends BasicSpcexResponse { @JsonProperty @ApiModelProperty(value = "Полезная нагрузка") - private DictionaryBackendPayload payload = new DictionaryBackendPayload(); + private IDictionaryPayload payload; public void fromEntity(Collection dictionaryValues) { - var payload = this.getPayload(); + this.payload = new GeneralDictionaryBackendPayload(); + GeneralDictionaryBackendPayload castedPayload = (GeneralDictionaryBackendPayload) payload; for (AbstractDictionary dictionaryValue : dictionaryValues) { var singleItem = new DictionaryBackendGetFields(); singleItem.fromEntity(dictionaryValue); - payload.getItems().add(singleItem); + castedPayload.getItems().add(singleItem); } } + public void addMap(Map m) { + if (this.payload == null) { + this.payload = new SpecificDictionaryBackendPayload(); + } + SpecificDictionaryBackendPayload payloadCasted = (SpecificDictionaryBackendPayload) this.payload; + payloadCasted.getItems().add(m); + } - private static class DictionaryBackendPayload { + public static class GeneralDictionaryBackendPayload implements IDictionaryPayload { private List items = new ArrayList<>(); public List getItems() { @@ -39,11 +48,24 @@ public class DictionaryBackendGetAll extends BasicSpcexResponse { } } - public DictionaryBackendPayload getPayload() { + public static class SpecificDictionaryBackendPayload implements IDictionaryPayload { + @JsonProperty + private List> items = new ArrayList<>(); + + public List> getItems() { + return items; + } + + public void setItems(List> items) { + this.items = items; + } + } + + public IDictionaryPayload getPayload() { return payload; } - public void setPayload(DictionaryBackendPayload payload) { + public void setPayload(IDictionaryPayload payload) { this.payload = payload; } } \ No newline at end of file diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetFields.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetFields.java index fa27898c9..eb91fba9a 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetFields.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetFields.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModelProperty; import ru.clearing.platform.dictionary.AbstractDictionary; -public class DictionaryBackendGetFields { +public class DictionaryBackendGetFields implements IDictionaryPayload { @JsonProperty @ApiModelProperty(value = "Идентификатор", example = "1234") private Long id; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetSingleValueV2.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetSingleValueV2.java new file mode 100644 index 000000000..4db4ef922 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/DictionaryBackendGetSingleValueV2.java @@ -0,0 +1,25 @@ +package ru.spcex.clearing.backendapi.controller.response.entity.dictionary; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; + +import java.util.HashMap; +import java.util.Map; + +@ApiModel(description = "Ответ при получении объекта словаря.") +public class DictionaryBackendGetSingleValueV2 extends BasicSpcexResponse { + + @JsonProperty + @ApiModelProperty(value = "Поля объекта") + private Map payload = new HashMap<>(); + + public Map getPayload() { + return payload; + } + + public void setPayload(Map payload) { + this.payload = payload; + } +} \ No newline at end of file diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/IDictionaryPayload.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/IDictionaryPayload.java new file mode 100644 index 000000000..2cba7bac3 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/dictionary/IDictionaryPayload.java @@ -0,0 +1,4 @@ +package ru.spcex.clearing.backendapi.controller.response.entity.dictionary; + +public interface IDictionaryPayload { +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/DictionaryController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/DictionaryController.java index 425bd1876..138735915 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/DictionaryController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/DictionaryController.java @@ -13,10 +13,11 @@ import org.springframework.web.bind.annotation.*; import ru.clearing.platform.dictionary.AbstractDictionary; import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; import ru.spcex.clearing.backendapi.controller.response.entity.dictionary.DictionaryBackendGetAll; -import ru.spcex.clearing.backendapi.controller.response.entity.dictionary.DictionaryBackendGetSingleValue; +import ru.spcex.clearing.backendapi.controller.response.entity.dictionary.DictionaryBackendGetSingleValueV2; import ru.spcex.clearing.backendapi.errors.ActionValidationException; import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.backendapi.errors.NotFound404Exception; +import ru.spcex.clearing.backendapi.meta.GetResponseFactory; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; @@ -33,10 +34,12 @@ public class DictionaryController { private final Logger log = LoggerFactory.getLogger(getClass()); private final Map> allDictionaryMaps; private final ImdgProvider imdgProvider; + private final GetResponseFactory responseFactory; @Autowired - public DictionaryController(ImdgProvider imdgProvider) { + public DictionaryController(ImdgProvider imdgProvider, GetResponseFactory responseFactory) { this.imdgProvider = imdgProvider; + this.responseFactory = responseFactory; this.allDictionaryMaps = new ConcurrentHashMap<>(); } @@ -49,39 +52,42 @@ public class DictionaryController { Imdg dictionary = extractDictionaryImdgFromUrlParameter(dictionaryName, AbstractDictionary.class); Collection allValues = dictionary.getAllValues(); DictionaryBackendGetAll response = new DictionaryBackendGetAll(); - response.fromEntity(allValues); + for (AbstractDictionary val : allValues) { + Map fromMeta = responseFactory.responseFromDictionary(dictionaryName, val); + response.addMap(fromMeta); + } return response; } @ApiOperation(value = "get dictionary value by id.") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = DictionaryBackendGetSingleValue.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = DictionaryBackendGetSingleValueV2.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) @RequestMapping(value = "/{dictionary-name}/{id}", method = RequestMethod.GET) @ResponseBody - public DictionaryBackendGetSingleValue getById(@ApiParam(value = "Название словаря", required = true, example = "moneyFlowSide") + public DictionaryBackendGetSingleValueV2 getById(@ApiParam(value = "Название словаря", required = true, example = "moneyFlowSide") @PathVariable("dictionary-name") String dictionaryName, @ApiParam(value = "Идентификатор объекта", required = true, example = "1234") @PathVariable("id") Long id) { Imdg dictionary = extractDictionaryImdgFromUrlParameter(dictionaryName, AbstractDictionary.class); AbstractDictionary value = dictionary.getSingleObjectByID(id); if (value == null) throw new NotFound404Exception(dictionaryName + " id='" + id + "'"); - DictionaryBackendGetSingleValue response = new DictionaryBackendGetSingleValue(); - response.fromEntity(value); + DictionaryBackendGetSingleValueV2 response = new DictionaryBackendGetSingleValueV2(); + response.setPayload(responseFactory.responseFromDictionary(dictionaryName, value)); return response; } @ApiOperation(value = "get dictionary value by code.") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = DictionaryBackendGetSingleValue.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = DictionaryBackendGetSingleValueV2.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) @RequestMapping(value = "/{dictionary-name}/code/{code}", method = RequestMethod.GET) @ResponseBody - public DictionaryBackendGetSingleValue getByCode(@ApiParam(value = "Название словаря", required = true, example = "moneyFlowSide") + public DictionaryBackendGetSingleValueV2 getByCode(@ApiParam(value = "Название словаря", required = true, example = "moneyFlowSide") @PathVariable("dictionary-name") String dictionaryName, @ApiParam(value = "Код словаря", required = true, example = "1234") @PathVariable("code") String code) { Imdg dictionary = extractDictionaryImdgFromUrlParameter(dictionaryName, AbstractDictionary.class); AbstractDictionary value = dictionary.getSingleObjectByFieldValues(Map.of("code", code)); if (value == null) throw new NotFound404Exception(dictionaryName + " code='" + code + "'"); - DictionaryBackendGetSingleValue response = new DictionaryBackendGetSingleValue(); - response.fromEntity(value); + DictionaryBackendGetSingleValueV2 response = new DictionaryBackendGetSingleValueV2(); + response.setPayload(responseFactory.responseFromDictionary(dictionaryName, value)); return response; } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ClearingDictionaryExtracted.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ClearingDictionaryExtracted.java new file mode 100644 index 000000000..dabb4f653 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ClearingDictionaryExtracted.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.backendapi.meta; + +import java.util.List; + +public class ClearingDictionaryExtracted extends ObjectExtracted { + + public ClearingDictionaryExtracted(String clazz, List actionFields) { + for (ActionField field : actionFields) { + if (field.getVirtual() != null && field.isVirtual()){ + continue; + } + FieldExtracted fe = getImplFieldExtracted(field); + fields.add(fe); + fieldByCode.put(field.getCode(), fe); + } + } + + @Override + public FieldExtracted getImplFieldExtracted(ActionField field) { + return new ClearingFieldExtracted(field); + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java index 86f3cb2c1..e6e23ff8d 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/GetResponseFactory.java @@ -31,11 +31,26 @@ public class GetResponseFactory { .collect(Collectors.toList()); } + /** + * dictionaryName - это имя тэга внутри + */ + public Map responseFromDictionary(String dictionaryName, Object o) { + ObjectExtracted objectExtracted = meta.getEnumsExtractedByTagName().get(dictionaryName); + if (objectExtracted == null) { + throw new RuntimeException("cannot find dictionary in meta for " + dictionaryName); + } + return responseFromObjectExtracted(o, objectExtracted); + } + public Map responseFromObject(Object o) { ObjectExtracted objExtr = meta.getObjectsExtractedByClazz().get(o.getClass().getCanonicalName()); if (objExtr == null) { throw new RuntimeException("cannot find object in meta for " + o.getClass().getCanonicalName()); } + return responseFromObjectExtracted(o, objExtr); + } + + private Map responseFromObjectExtracted(Object o, ObjectExtracted objExtr) { Map r = new LinkedHashMap<>(); FieldExtracted currentField = null; try { diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/MetaServer.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/MetaServer.java index be7392a9b..452a5e9af 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/MetaServer.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/MetaServer.java @@ -2,6 +2,7 @@ package ru.spcex.clearing.backendapi.meta; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ru.spcex.platform.utils.log.ExceptionUtils; import java.lang.reflect.Constructor; import java.lang.reflect.Method; @@ -17,6 +18,8 @@ public class MetaServer extends MetaBase { private Map objectsExtractedByDestination; private Map actionObjectsExtracted; private Map objectElementByDestination; + private Map enumsExtractedByTagName; + private final static Set dictionaryDefaultFields = Set.of("id", "code", "name"); protected ObjectExtracted getImplInstanceObjectExtracted(String clazz, List actionFields) { return new ClearingObjectExtracted(clazz, actionFields); @@ -31,6 +34,7 @@ public class MetaServer extends MetaBase { objectsExtractedByClazz = new ConcurrentHashMap<>(); objectsExtractedByDestination = new ConcurrentHashMap<>(); objectElementByDestination = new ConcurrentHashMap<>(); + enumsExtractedByTagName = new ConcurrentHashMap<>(); try { Map objects = getObjects(); log.info("Meta objects:\n{}", @@ -84,6 +88,37 @@ public class MetaServer extends MetaBase { } catch (Throwable e) { throw new ClearingMetaServerValidationException(e.getLocalizedMessage()); } + try { + Map enums = getEnums(); + for (String key : enums.keySet()) { + ObjectExtracted oe; + ObjectEnumElement objectElement = enums.get(key); + try { + oe = new ClearingDictionaryExtracted(objectElement.getClazz(), objectElement.getFields()); + } catch (Throwable e) { + log.warn("{} {}", key, ExceptionUtils.getStackTrace(e)); + continue; + } + /** + * можно было бы хранить только для нестандартных словарей (где не только id, name, code) + */ +// List dictFields = oe.getFields(); +// boolean add = false; +// for (FieldExtracted dictField : dictFields) { +// if (!dictionaryDefaultFields.contains(dictField.getMemberName())) { +// add = true; +// break; +// } +// } +// if (add) { +// enumsExtractedByTagName.put(key, oe); +// } + enumsExtractedByTagName.put(key, oe); + } + + } catch (Throwable e) { + throw new ClearingMetaServerValidationException(e.getLocalizedMessage()); + } } for (ObjectExtracted o : this.objectsExtracted) { try { @@ -196,4 +231,8 @@ public class MetaServer extends MetaBase { } return partSize; } + + public Map getEnumsExtractedByTagName() { + return enumsExtractedByTagName; + } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ObjectExtracted.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ObjectExtracted.java index 5f75b9de5..8e4fc3cda 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ObjectExtracted.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/meta/ObjectExtracted.java @@ -5,12 +5,14 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; public abstract class ObjectExtracted { - private String className; - private Class clazz; - private List fields = new LinkedList<>(); - private Map fieldByCode = new ConcurrentHashMap<>(); - private boolean isArray = false; + protected String className; + protected Class clazz; + protected List fields = new LinkedList<>(); + protected Map fieldByCode = new ConcurrentHashMap<>(); + protected boolean isArray = false; + public ObjectExtracted() { + } public ObjectExtracted(String clazz, List actionFields) { this.className = clazz; From d0267aa78ca892dafc9389001231bdbbc7920124 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 19:30:17 +0300 Subject: [PATCH 05/11] =?UTF-8?q?reports-service=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20kafka,=20=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B0=D0=BB=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- clearing-parent/reports-service/pom.xml | 4 ++ .../clearing/reports/config/KafkaConfig.java | 28 +++++++++++ .../element/ReportsServiceSettings.java | 22 ++++++--- .../reports/services/QCommandExecutor.java | 49 +++++++++++++++++++ .../src/main/resources/application.properties | 17 +++++++ 5 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 54846a228..457291ada 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -62,6 +62,10 @@ ru.spcex.platform platform-imdg-api-hazelcast-impl + + ru.spcex.platform + platform-messaging + org.junit.jupiter diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java new file mode 100644 index 000000000..cd3b73821 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/KafkaConfig.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.reports.config; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.spcex.clearing.platform.messaging.config.KafkaConsumerFactory; +import ru.spcex.clearing.platform.messaging.config.KafkaProducerFactory; +import ru.spcex.clearing.reports.config.element.ReportsServiceSettings; + +@Configuration +public class KafkaConfig { + @Autowired + @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) + @Bean + public Consumer createConsumer(ReportsServiceSettings settings) { + return KafkaConsumerFactory.consumer(settings.getKafkaConsumer()); + } + +// @Autowired +// @Bean +// public Producer createProducer(ReportsServiceSettings settings) { +// return KafkaProducerFactory.producer(settings.getKafkaProducer()); +// } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java index a79eaa702..d3aa03d8a 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/element/ReportsServiceSettings.java @@ -3,6 +3,8 @@ package ru.spcex.clearing.reports.config.element; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; +import ru.spcex.clearing.platform.messaging.config.element.KafkaConsumerSettings; +import ru.spcex.clearing.platform.messaging.config.element.KafkaProducerSettings; import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; /** @@ -15,7 +17,8 @@ import ru.spcex.platform.imdg.iml.hazelcast.config.HazelcastClientParams; @ConfigurationProperties("reports-service") public class ReportsServiceSettings { private HazelcastClientParams hazelcast; - private String reportModuleOut; + private KafkaConsumerSettings kafkaConsumer; + private KafkaProducerSettings kafkaProducer; public HazelcastClientParams getHazelcast() { return hazelcast; @@ -25,12 +28,19 @@ public class ReportsServiceSettings { this.hazelcast = hazelcast; } - - public String getReportModuleOut() { - return reportModuleOut; + public KafkaConsumerSettings getKafkaConsumer() { + return kafkaConsumer; } - public void setReportModuleOut(String reportModuleOut) { - this.reportModuleOut = reportModuleOut; + public void setKafkaConsumer(KafkaConsumerSettings kafkaConsumer) { + this.kafkaConsumer = kafkaConsumer; + } + + public KafkaProducerSettings getKafkaProducer() { + return kafkaProducer; + } + + public void setKafkaProducer(KafkaProducerSettings kafkaProducer) { + this.kafkaProducer = kafkaProducer; } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java new file mode 100644 index 000000000..a093f6eec --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/QCommandExecutor.java @@ -0,0 +1,49 @@ +package ru.spcex.clearing.reports.services; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; + +import org.apache.kafka.clients.consumer.Consumer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +//import ru.spcex.clearing.platform.messaging.domain.cud.balance.ExportToFileRequest; todo use class? +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.enumeration.Task; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.List; + +public class QCommandExecutor extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); +// private final ImdgId idGenerator; +// private final KafkaSender kafkaReqProducer; + + + public QCommandExecutor(Consumer kafkaQueue, ImdgProvider imdgProvider, + List listOfCollectors) { + super(kafkaQueue); +// todo constructor + } + + @Override + public void afterPropertiesSet() { + log.debug("Init queue listener {}", getClass().getSimpleName()); +// callback(Object.class) +// .setConsumer(this::newReportDo) +// .forDestination(Task.getVerification!!!.topic(), callbacks::put); // todo здесь надо указать команду из ТЗ или согласовать с фронтэндом +// init(); + } + + private void newReportDo(BaseRequest userRequest) { + log.debug("newReportDo request received"); + // todo logic + log.debug("successfully processed"); + } +} diff --git a/clearing-parent/reports-service/src/main/resources/application.properties b/clearing-parent/reports-service/src/main/resources/application.properties index 52d18bea7..c7765a7fe 100644 --- a/clearing-parent/reports-service/src/main/resources/application.properties +++ b/clearing-parent/reports-service/src/main/resources/application.properties @@ -2,7 +2,24 @@ server.port=8080 server.servlet.context-path=/reports_service spring.main.web-application-type=servlet + +reports-service.kafka-consumer.bootstrap-servers=localhost:9092 +reports-service.kafka-consumer.group-id=dev-group-balance-service +reports-service.kafka-consumer.enable-auto-commit=false +reports-service.kafka-consumer.session-timeout-ms=30000 +reports-service.kafka-consumer.auto-offset-reset=latest +reports-service.kafka-consumer.linger-ms=1 +reports-service.kafka-consumer.buffer-memory=33554432 + +#reports-service.kafka-producer.bootstrap-servers=localhost:9092 +#reports-service.kafka-producer.acks=all +#reports-service.kafka-producer.retries=0 +#reports-service.kafka-producer.batch-size=16384 +#reports-service.kafka-producer.linger-ms=1 +#reports-service.kafka-producer.buffer-memory=33554432 + reports-service.hazelcast.cluster-members=127.0.0.1:5701,10.200.200.181:5701 reports-service.hazelcast.login=dev reports-service.hazelcast.password=dev-pass + reports-service.ReportModuleOut=./report_out From af8ff434ec37895fcb8ef01e43f746c5bcbbee5f Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 19:36:34 +0300 Subject: [PATCH 06/11] reports-service refactoring --- .../reports/services/ReportDataCollector.java | 12 ---------- .../services/builders/FileReportBuilder.java | 4 ++++ .../services/builders/XMLReportBuilder.java | 4 +--- .../collector/Bt17_1_P1_collector.java | 7 ------ .../collector/Bt17_1_P2_collector.java | 6 ----- .../services/collector/Bt17_2_collector.java | 7 ------ .../collector/Bt17_5_P1_collector.java | 6 ----- .../services/ReportDataCollectorTest.java | 5 ---- .../services/impl/Bt17_1_collectorTest.java | 24 ------------------- 9 files changed, 5 insertions(+), 70 deletions(-) delete mode 100644 clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index 739c83759..f7dc466ba 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -32,18 +32,6 @@ public abstract class ReportDataCollector { // */ // abstract public List collectReportWithClearingStatus(LocalDate startDate, LocalDate endDate, String clearingStatus); - /** - * todo убрать метод, он уже лишний - * @param startDate - * @param endDate - * @param dateTimeNow LocalDateTime.now() - * @return - */ - @Deprecated - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - throw new IllegalArgumentException("deprecated"); - } - abstract public Class getReportClass(); protected String toString(Long val) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java index ee7db9533..d22e38111 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/FileReportBuilder.java @@ -9,4 +9,8 @@ public abstract class FileReportBuilder { this.reportClass = reportClass; } + protected String makeFileName(String reportName, String extension) { + if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_"); + return reportName + extension; + } } diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java index ed8ac24bf..0d25b8cf6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/builders/XMLReportBuilder.java @@ -31,10 +31,8 @@ public class XMLReportBuilder extends FileReportBuilde public File createReport(LocalDate startDate, LocalDate endDate) throws IOException { R report = collector.collectReportWithPeriod(startDate, endDate); String reportName = report.getReportName(LocalDateTime.now()); + String reportFileName = makeFileName(reportName, ".xml"); - if (System.getProperty("os.name").toLowerCase().contains("windows")) reportName = reportName.replace(":", "_"); - - String reportFileName = reportName + ".xml"; File reportFile = new File(reportFileName); if (reportFile.exists()) { if (reportFile.isFile()) { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index 229eb2a8a..d11b7e256 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -129,13 +129,6 @@ public class Bt17_1_P1_collector extends ReportDataCollector getReportClass() { return ReportBR_0420315_P1.class; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java index 8bc56a177..3c18e6922 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -53,12 +53,6 @@ public class Bt17_1_P2_collector extends ReportDataCollector getReportClass() { return ReportBR_0420315_P2.class; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java index 6081329ea..4d9b8ddae 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -68,13 +68,6 @@ public class Bt17_2_collector extends ReportDataCollector { return reportBR_0420317; } - - @Override - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - return String.format("REPBR.0420317.%s-%s.%s", DATE_FORMATTER.format(startDate), DATE_FORMATTER.format(endDate), - DATE_TIME_FORMATTER.format(dateTimeNow)); - } - @Override public Class getReportClass() { return ReportBR_0420317.class; diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java index 463f6ba36..23e4b2d38 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -56,12 +56,6 @@ public class Bt17_5_P1_collector extends ReportDataCollector getReportClass() { return ReportBR_0420312_P1.class; diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java index 7341332e7..0e730578b 100644 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java +++ b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/ReportDataCollectorTest.java @@ -33,11 +33,6 @@ class ReportDataCollectorTest extends ReportDataCollector { throw new IllegalStateException("test"); } - @Override - public String getFileName(LocalDate startDate, LocalDate endDate, LocalDateTime dateTimeNow) { - throw new IllegalStateException("test"); - } - @Override public Class getReportClass() { return AbstractReport.class; diff --git a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java b/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java deleted file mode 100644 index cef49c50c..000000000 --- a/clearing-parent/reports-service/src/test/java/ru/spcex/clearing/reports/services/impl/Bt17_1_collectorTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package ru.spcex.clearing.reports.services.impl; - -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; -import ru.spcex.clearing.reports.services.collector.Bt17_1_P1_collector; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -import static org.junit.jupiter.api.Assertions.*; - -class Bt17_1_collectorTest { - - @Test - void getFileName() { - Bt17_1_P1_collector collector = Mockito.mock(Bt17_1_P1_collector.class); - Mockito.when(collector.getFileName(Mockito.any(),Mockito.any(),Mockito.any())).thenCallRealMethod(); - - String str = collector.getFileName(LocalDate.of(2020,1,1), - LocalDate.of(2020,1,31), - LocalDateTime.of(2021,4,20,12,20,44)); - assertEquals("REPBR.0420315.P1.01.01.2020-31.01.2020.20.04.2021T12:20:44", str); - } -} \ No newline at end of file From 363a809afca71d49d99006a0aa73f1ec26f7b461 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 20:28:31 +0300 Subject: [PATCH 07/11] =?UTF-8?q?reports-service=20http://jira.mfd.msk:808?= =?UTF-8?q?8/browse/CLS-29=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=D0=BE,=20?= =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D0=B3=20=D0=BE=D0=BF=D1=8F=D1=82=D1=8C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reports/bt_17_5/ReportBR_0420312_P1.java | 35 +++++++--- .../reports/services/ReportDataCollector.java | 6 ++ .../collector/Bt17_1_P1_collector.java | 4 +- .../collector/Bt17_1_P2_collector.java | 4 +- .../services/collector/Bt17_2_collector.java | 4 +- .../collector/Bt17_5_P1_collector.java | 65 +++++++++++++------ 6 files changed, 79 insertions(+), 39 deletions(-) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java index af4884919..dce10d12a 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/reports/bt_17_5/ReportBR_0420312_P1.java @@ -6,6 +6,8 @@ import ru.spcex.clearing.reports.ReportWithPeriod; import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @XStreamAlias("clearingCoverage1") public class ReportBR_0420312_P1 extends ReportWithPeriod { @@ -13,9 +15,27 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { @XStreamAlias("destination") private String destination; - @XStreamAlias("part_1") - private final Info_0420312_P1 part_1; + @XStreamAlias("rows") + private final List rows = new ArrayList<>(); + + public ReportBR_0420312_P1(LocalDate startDate, + LocalDate endDate, + String destination) { + super("0.0.1", + "0420312", + "Сведения о клиринговом обеспечении, часть 1", + startDate, + endDate); + this.destination = destination; + } + + + public List getRows() { + return rows; + } + + @Deprecated public ReportBR_0420312_P1(LocalDate startDate, LocalDate endDate, String companyClearingCode, @@ -26,19 +46,14 @@ public class ReportBR_0420312_P1 extends ReportWithPeriod { String companySymbolValue, String companyInfoCountryCode, String clearingMemberCategoryClearingMemberCategory) { - super("0.0.1", - "0420312", - "Сведения о клиринговом обеспечении, часть 1", - startDate, - endDate); - this.destination = destination; - part_1 = new Info_0420312_P1(companyClearingCode, + this(startDate, endDate, destination); + getRows().add(new Info_0420312_P1(companyClearingCode, liabilitiesClaimsAssetsCompanyId, liabilitiesClaimsAssetsFullName, companySymbolCode, companySymbolValue, companyInfoCountryCode, - clearingMemberCategoryClearingMemberCategory); + clearingMemberCategoryClearingMemberCategory)); } public static class Info_0420312_P1 { diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java index f7dc466ba..82a8d0001 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportDataCollector.java @@ -34,6 +34,12 @@ public abstract class ReportDataCollector { abstract public Class getReportClass(); + protected void validateDateRange(LocalDate startDate, LocalDate endDate) throws IllegalArgumentException { + if (startDate.isAfter(endDate)) { + throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); + } + } + protected String toString(Long val) { if (val == null) return null; return val.toString(); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java index d11b7e256..824306394 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P1_collector.java @@ -56,9 +56,7 @@ public class Bt17_1_P1_collector extends ReportDataCollector endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); ReportBR_0420315_P1 reportBR_0420315_p1 = new ReportBR_0420315_P1(startDate, endDate, "BR", "I,V", // cmc.getClearingMemberCategory() diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java index 3c18e6922..bed4787d1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_1_P2_collector.java @@ -25,9 +25,7 @@ public class Bt17_1_P2_collector extends ReportDataCollector endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", startDate, endDate); Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java index 4d9b8ddae..b85eed586 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_2_collector.java @@ -32,9 +32,7 @@ public class Bt17_2_collector extends ReportDataCollector { @Override public ReportBR_0420317 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - if (startDate.isAfter(endDate)) { - throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); // todo обговорить про updatedAt updated, todo enum MKR diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java index 23e4b2d38..11ccb81d6 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/collector/Bt17_5_P1_collector.java @@ -5,52 +5,77 @@ import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.company.Company; import ru.clearing.classes.statics.data.company.CompanySymbols; import ru.clearing.classes.statics.data.company.relation.Relation; +import ru.clearing.classes.statics.data.generated.ClearingMemberCategory; +import ru.clearing.classes.transaction.data.execution.LiabilitiesClaimsAssets; +import ru.clearing.platform.dictionary.CountryCodeDictionary; import ru.spcex.clearing.imdg.IMDGDistributedNames; -import ru.spcex.clearing.reports.reports.bt_17_2.ReportBR_0420317; import ru.spcex.clearing.reports.reports.bt_17_5.ReportBR_0420312_P1; import ru.spcex.clearing.reports.services.ReportDataCollector; +import ru.spcex.platform.enumeration.DocumentTypes; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.Collection; +import java.util.List; import java.util.Map; @Component public class Bt17_5_P1_collector extends ReportDataCollector { private Imdg companyImdg; - private Imdg relationImdg; + // private Imdg relationImdg; private Imdg companySymbolsImdg; + private Imdg countryCodeDictionaryImdg; + private Imdg clearingMemberCategoryImdg; + private Imdg liabilitiesClaimsAssetsImdg; @Autowired public Bt17_5_P1_collector(ImdgProvider imdgProvider) { companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); - relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); + liabilitiesClaimsAssetsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_LiabilitiesClaimsAssets, LiabilitiesClaimsAssets.class); +// relationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Relation, Relation.class); companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class); + clearingMemberCategoryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ClearingMemberCategory, ClearingMemberCategory.class); + countryCodeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CountryCodeDictionary, CountryCodeDictionary.class); + } + + protected CompanySymbols findSymbol(DocumentTypes docType, Long companyId) { + CompanySymbols companySymbol = companySymbolsImdg.getSingleObjectByFieldValues(Map.of( + "companySymbol", docType.getKey(), + "companyId", companyId + )); + return companySymbol; } @Override public ReportBR_0420312_P1 collectReportWithPeriod(LocalDate startDate, LocalDate endDate) { - if (startDate.isAfter(endDate)) { - throw new IllegalArgumentException("startDate(" + startDate + ") > endDate(" + endDate + ")"); - } + validateDateRange(startDate, endDate); - // TODO ВСЁ по CLS-29... - String ql = String.format("'%s' <= updated and updated <= '%s' and service='MKR'", startDate, endDate); + ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(startDate, endDate, "BR"); // todo обговорить про updatedAt updated, todo enum MKR - Collection relations = relationImdg.getCollectionObjectsBySQL(ql); - ReportBR_0420312_P1 reportBR_0420312P1 = new ReportBR_0420312_P1(LocalDate.now(), - LocalDate.now(), - "companyClearingCode", - "BR", - "liabilitesClaimsAssetsCompanyId", - "liabilitesClaimsAssetsFullName", - "companySymbolCode", - "companySymbolValue", - "companyInfoCountryCode", - "clearingMemberCategory"); + String ql = String.format("'%s' <= refundDate and refundDate <= '%s'", + startDate, endDate); + Collection liabilities = liabilitiesClaimsAssetsImdg.getCollectionObjectsBySQL(ql); + Map> indexByCompany = MapUtil.indexList(liabilities, LiabilitiesClaimsAssets::getCompanyId); + for (Map.Entry> companyEntry : indexByCompany.entrySet()) { + final Long companyId = companyEntry.getKey(); + Company company = companyImdg.getSingleObjectByID(companyId); + CompanySymbols companySymbolINN = findSymbol(DocumentTypes.inn, company.getId()); + CompanySymbols companySymbolOGRN = findSymbol(DocumentTypes.ogrn, company.getId()); + ClearingMemberCategory cmc = clearingMemberCategoryImdg.getSingleObjectByFieldValues(Map.of("companyId", companyId)); + String clearingMemberCategory = cmc == null ? null : cmc.getClearingMemberCategory(); + ReportBR_0420312_P1.Info_0420312_P1 info_0420312_p1 = new ReportBR_0420312_P1.Info_0420312_P1( + company.getClearingCode(), + toString(companyId), + company.getFullName(), + companySymbolINN == null ? null : companySymbolINN.getCompanySymbolValue(), + companySymbolOGRN == null ? null : companySymbolOGRN.getCompanySymbolValue(), + company.getProfile().getCountryCode(), + clearingMemberCategory + ); + reportBR_0420312P1.getRows().add(info_0420312_p1); + } return reportBR_0420312P1; } From 960d0e6b68002453ce87c251be68951ba6faf652 Mon Sep 17 00:00:00 2001 From: AKurakin Date: Mon, 26 Dec 2022 20:31:40 +0300 Subject: [PATCH 08/11] =?UTF-8?q?reports-service=20=D0=B7=D0=B0=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D1=8B=20=D1=81=D1=80=D0=B0=D0=B7=D1=83=20(=D0=B4?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0,=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B8=D0=B7=20=D0=BA=D0=BE=D0=BD=D1=81=D0=BE?= =?UTF-8?q?=D0=BB=D0=B8=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D1=82?= =?UTF-8?q?=D1=81=D1=8F=20=D1=81=D1=80=D0=B0=D0=B7=D1=83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/spcex/clearing/reports/ReportsServiceApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java index 113de634c..c12ab17d1 100644 --- a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/ReportsServiceApplication.java @@ -36,6 +36,8 @@ public class ReportsServiceApplication { LocalDate date1 = LocalDate.of(date2.getYear(), date2.getMonth(), 1);//date2.minusMonths(1); xmlReportBuilder.createReport(date1, date2); } + log.info("Shutdown application after work"); + context.close(); // todo если будет запущен как сервис, сделать выход опционально, по другому. } catch (Throwable e) { LoggerFactory.getLogger(ReportsServiceApplication.class).error("Report-service start failed: {} -> {}", e.getClass().getSimpleName(), ExceptionUtils.getStackTrace(e)); System.exit(-1); From 19add71925d4a2aeb9e1b81210acf29fbf5e6e43 Mon Sep 17 00:00:00 2001 From: aalehin Date: Mon, 26 Dec 2022 20:35:51 +0300 Subject: [PATCH 09/11] http://jira.mfd.msk:8088/browse/CLS-201 --- ProfileDocumentService set up --- .../account/service/AccountService.java | 4 + .../company/DeleteCompanyController.java | 3 +- .../company/config/KafkaSenderConfig.java | 32 ++++++++ .../service/ProfileDocumentService.java | 77 +++++++++++++++++++ .../AccountUpdateWithBrakeRequest.java | 4 + 5 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaSenderConfig.java create mode 100644 clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/brake/document/AccountUpdateWithBrakeRequest.java diff --git a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java index ec596586e..f02a5e94e 100644 --- a/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java +++ b/clearing-parent/account-service/src/main/java/ru/spcex/clearing/account/service/AccountService.java @@ -59,6 +59,10 @@ public class AccountService extends QueueConsumer implements InitializingBean { log.debug("successfully processed, grouping id={}, processed number={}", req.getGroupingSdf01Id(), accountToStatement.size()); } + private void accountUpdateWithBrake(BaseRequest userRequest) { + + } + private AccountSdfToStatementRequestPart responsePart(Long sdf01Id) { AccountSdfToStatementRequestPart responsePart = new AccountSdfToStatementRequestPart(); responsePart.setSdfId(sdf01Id); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyController.java index 35dcd9432..d6555064d 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/company/DeleteCompanyController.java @@ -30,7 +30,8 @@ public class DeleteCompanyController extends AbstractQueueController { private final IStateLoader stateLoader; @Autowired - public DeleteCompanyController(IOperator operator, IStateLoader stateLoader) { + public DeleteCompanyController(IOperator operator, + IStateLoader stateLoader) { super(operator); this.stateLoader = stateLoader; } diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaSenderConfig.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaSenderConfig.java new file mode 100644 index 000000000..16e63b03d --- /dev/null +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/config/KafkaSenderConfig.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.company.config; + +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Configuration +public class KafkaSenderConfig { + + @Autowired + @Bean + public KafkaSender kafkaSender(Producer kafkaProducer, + ImdgProvider imdgProvider) { + ImdgId imdgIdGenerator = imdgProvider.getImdgIdGenerator(); + return KafkaSender + .setup() + .producer(kafkaProducer) + .idGenerator(imdgIdGenerator::nextId) + .imdgProvider(s -> { + Imdg imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + return imdg::insert; + }) + .build(); + } +} diff --git a/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java new file mode 100644 index 000000000..28990c9f5 --- /dev/null +++ b/clearing-parent/company-service/src/main/java/ru/spcex/clearing/company/service/ProfileDocumentService.java @@ -0,0 +1,77 @@ +package ru.spcex.clearing.company.service; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.NonNull; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.profile.ProfileDocument; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.company.ProfileDocumentNewRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +public class ProfileDocumentService extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private Imdg profileDocumentMap; + private Imdg companyMap; + private ImdgProvider imdgProvider; + private KafkaSender kafkaReqProducer; + + @Autowired + public ProfileDocumentService(Consumer kafkaQueue, + Producer kafkaProducer, + KafkaSender kafkaReqProducer, + ImdgProvider imdgProvider) { + super(kafkaQueue, kafkaProducer); + this.imdgProvider = imdgProvider; + this.kafkaReqProducer = kafkaReqProducer; + } + + @Override + public void afterPropertiesSet() { + this.profileDocumentMap = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class); + this.companyMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + + callback(ProfileDocumentNewRequest.class) + .setConsumer(this::newProfileDocument) + .forDestination(Consts.DESTINATION_PROFILE_DOCUMENT_NEW, callbacks::put); + init(); + } + + @NonNull + private void newProfileDocument(BaseRequest profileDocumentNewRequestBaseRequest) { + log.trace("Start processing ProfileDocumentNewRequest!"); + ProfileDocumentNewRequest profileDocumentNewRequest = profileDocumentNewRequestBaseRequest.getRequestPayload(); + Long companyId = profileDocumentNewRequest.getCompanyId(); + Company company = companyMap.getSingleObjectByID(companyId); + if (company != null && !company.getWorkflowStatus().equalsIgnoreCase("ACTV")) { + throw new IllegalStateException("Wrong company with ID " + companyId + " and workflow status " + company.getWorkflowStatus()); + } + ProfileDocument profileDocument = new ProfileDocument(); + profileDocument.setCompanyId(profileDocumentNewRequest.getCompanyId()); + profileDocument.setDocumentType(profileDocumentNewRequest.getDocumentType()); + profileDocument.setIssueDate(profileDocumentNewRequest.getIssueDate()); + profileDocument.setIssuePlace(profileDocumentNewRequest.getIssuePlace()); + profileDocument.setIssuer(profileDocumentNewRequest.getIssuer()); + profileDocument.setIssuerCode(profileDocumentNewRequest.getIssuerCode()); + profileDocument.setName(profileDocumentNewRequest.getName()); + profileDocument.setNumber(profileDocumentNewRequest.getNumber()); + profileDocument.setPlace(profileDocumentNewRequest.getPlace()); + profileDocument.setValidFromDate(profileDocumentNewRequest.getValidFromDate()); + profileDocument.setValidToDate(profileDocumentNewRequest.getValidToDate()); + profileDocument.setLink(profileDocumentNewRequest.getLink()); + profileDocumentMap.insert(profileDocument); + if (profileDocument.getDocumentType().equalsIgnoreCase("XCNT")) { + + //kafkaReqProducer.sendRequestToQueue(Consts.EXPORT_PROCESS, exportRequest); + } + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/brake/document/AccountUpdateWithBrakeRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/brake/document/AccountUpdateWithBrakeRequest.java new file mode 100644 index 000000000..8064c3ab5 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/account/brake/document/AccountUpdateWithBrakeRequest.java @@ -0,0 +1,4 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.account.brake.document; + +public class AccountUpdateWithBrakeRequest { +} From cf06177fa166c5ffe9f0b2b64827e59df553df8f Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 27 Dec 2022 14:29:52 +0300 Subject: [PATCH 10/11] meta.xml 2.4.2.0 --- .../src/main/resources/meta/meta.xml | 277 ++++++++++-------- 1 file changed, 149 insertions(+), 128 deletions(-) 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 6b432b31c..693d0161e 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/meta.xml @@ -1,25 +1,25 @@ - + - + - + - + - + @@ -39,7 +39,7 @@ - + @@ -49,200 +49,200 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -254,14 +254,14 @@ - + - + @@ -274,7 +274,7 @@ - + @@ -387,40 +387,61 @@ - + - + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + + + + + - + @@ -436,7 +457,7 @@ - + @@ -470,7 +491,7 @@ - + @@ -488,7 +509,7 @@ - + @@ -501,7 +522,7 @@ - + @@ -532,7 +553,7 @@ - + @@ -545,7 +566,7 @@ - + @@ -575,12 +596,12 @@ - + - + @@ -606,12 +627,12 @@ - + - + @@ -622,7 +643,7 @@ - + @@ -640,7 +661,7 @@ - + @@ -685,19 +706,19 @@ - + - + - + @@ -710,12 +731,12 @@ - + - + @@ -754,7 +775,7 @@ - + @@ -766,7 +787,7 @@ - + @@ -777,7 +798,7 @@ - + @@ -820,7 +841,7 @@ - + @@ -834,7 +855,7 @@ - + @@ -851,7 +872,7 @@ - + @@ -984,7 +1005,7 @@ - + @@ -996,7 +1017,7 @@ - + @@ -1015,7 +1036,7 @@ - + @@ -1098,7 +1119,7 @@ - + @@ -1112,7 +1133,7 @@ - + @@ -1122,24 +1143,24 @@ - + - + - + - + - - + + - + @@ -1151,7 +1172,7 @@ - + @@ -1169,7 +1190,7 @@ - + @@ -1181,7 +1202,7 @@ - + @@ -1194,7 +1215,7 @@ - + @@ -1218,7 +1239,7 @@ - + @@ -1236,7 +1257,7 @@ - + @@ -1255,7 +1276,7 @@ - + @@ -1307,7 +1328,7 @@ - + @@ -1359,7 +1380,7 @@ - +
@@ -1368,14 +1389,14 @@ - + - + @@ -1387,7 +1408,7 @@ - + @@ -1400,7 +1421,7 @@ - + @@ -1451,7 +1472,7 @@ - + @@ -1460,7 +1481,7 @@ - + @@ -1510,7 +1531,7 @@ - + @@ -1524,7 +1545,7 @@ - + @@ -1539,7 +1560,7 @@ - + @@ -1549,7 +1570,7 @@ - + @@ -1571,7 +1592,7 @@ - + @@ -1588,7 +1609,7 @@ - + @@ -1602,14 +1623,14 @@ - + - + From d80ab056d100d877f523eeb38a316927a49848b7 Mon Sep 17 00:00:00 2001 From: ialbert Date: Tue, 27 Dec 2022 15:06:49 +0300 Subject: [PATCH 11/11] data.xml --- .../backend-api/src/main/resources/meta/data.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/clearing-parent/backend-api/src/main/resources/meta/data.xml b/clearing-parent/backend-api/src/main/resources/meta/data.xml index fb7903874..dd892e3c3 100644 --- a/clearing-parent/backend-api/src/main/resources/meta/data.xml +++ b/clearing-parent/backend-api/src/main/resources/meta/data.xml @@ -12,15 +12,13 @@ - - + - - +