From 6887b627c7f9cb0c985c9d2c3dacf75b988bbfc4 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 13 Oct 2023 19:29:55 +0300 Subject: [PATCH] imdg-hist example 2 --- .../cud/history/HistoryConditionRequest.java | 51 +++++++++++++ .../controller/test/HistController.java | 75 +++++++++++++++++-- 2 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/history/HistoryConditionRequest.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/history/HistoryConditionRequest.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/history/HistoryConditionRequest.java new file mode 100644 index 000000000..58736077f --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/history/HistoryConditionRequest.java @@ -0,0 +1,51 @@ +package ru.spcex.clearing.backendapi.controller.request.cud.history; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import io.swagger.annotations.ApiModelProperty; +import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; +import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; + +import java.time.LocalDate; + +public class HistoryConditionRequest { + + @ApiModelProperty(value = "Таблица для поиска", example = "1200") + @JsonProperty + private String table; + @ApiModelProperty(value = "Начальный точка поиска по дате", example = "2022-12-25") + @JsonProperty + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) + private LocalDate from; + @ApiModelProperty(value = "Конечная точка поиска по дате ", example = "2022-12-25") + @JsonProperty + @JsonSerialize(using = LocalDateSerializer.class) + @JsonDeserialize(using = LocalDateDeserializer.class) + private LocalDate to; + + public String getTable() { + return table; + } + + public void setTable(String table) { + this.table = table; + } + + public LocalDate getFrom() { + return from; + } + + public void setFrom(LocalDate from) { + this.from = from; + } + + public LocalDate getTo() { + return to; + } + + public void setTo(LocalDate to) { + this.to = to; + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/test/HistController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/test/HistController.java index 1bd27d802..e67743c9f 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/test/HistController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/test/HistController.java @@ -1,22 +1,27 @@ package ru.spcex.clearing.backendapi.controller.test; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import ru.clearing.classes.statics.data.register.MoneyBalanceRegister; +import ru.spcex.clearing.backendapi.controller.request.cud.history.HistoryConditionRequest; import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse; import ru.spcex.clearing.backendapi.meta.GetResponseFactory; +import ru.spcex.clearing.backendapi.service.IStateLoader; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.platform.classes.base.SpcexObjectBase; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.api.predicate.ImdgPredicate; import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder; import ru.spcex.platform.utils.time.TimeUtil; @@ -26,6 +31,7 @@ import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; @Controller @RequestMapping("/history") @@ -33,20 +39,37 @@ public class HistController implements InitializingBean { private final ImdgProvider imdgProviderHist; private final ImdgProvider imdgProvider; private final GetResponseFactory responseFactory; + private final IStateLoader stateLoader; + private final ImdgPredicateBuilder pb; @Autowired public HistController(@Qualifier("imdgProviderHist") ImdgProvider imdgProviderHist, - @Qualifier("imdgProvider") ImdgProvider imdgProvider, GetResponseFactory responseFactory) { + @Qualifier("imdgProvider") ImdgProvider imdgProvider, + GetResponseFactory responseFactory, + IStateLoader stateLoader) { this.imdgProviderHist = imdgProviderHist; this.imdgProvider = imdgProvider; this.responseFactory = responseFactory; + this.stateLoader = stateLoader; + this.pb = imdgProviderHist + .getImdg(IMDGDistributedNames.Map_SearchMoneyBalanceRegister, SpcexObjectBase.class) + .predicateBuilder(); + } + + @Override + public void afterPropertiesSet() throws Exception { + //will stuck of not provided + imdgProviderHist.waitAvailable(); + imdgProvider.waitAvailable(); } @ApiOperation(value = "get all accounts.") @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) - @RequestMapping(path = "/money-balance-register", method = RequestMethod.GET) + @RequestMapping(path = "/money-balance-register", method = RequestMethod.POST) @ResponseBody - public CommonGetAllResponse getAll() { + public CommonGetAllResponse search( + @ApiParam(value = "Параметры команды в JSON формате.", required = true) + @RequestBody HistoryConditionRequest searchCondition) { Imdg searchMap = imdgProviderHist.getImdg(IMDGDistributedNames.Map_SearchMoneyBalanceRegister, SpcexObjectBase.class); ImdgPredicateBuilder prdct = searchMap.predicateBuilder(); LocalDate time = LocalDate.of(2023, Month.JUNE, 8);//2023-06-08 @@ -62,10 +85,48 @@ public class HistController implements InitializingBean { return response; } + @ApiOperation(value = "get all money balance registers.") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CommonGetAllResponse.class)}) + @RequestMapping(path = "/money-balance-register2", method = RequestMethod.POST) + @ResponseBody + public CommonGetAllResponse search2( + @ApiParam(value = "Параметры команды в JSON формате.", required = true) + @RequestBody HistoryConditionRequest searchCondition) { + //todo conditions by destination and filled fields + ImdgPredicate prdct = pb.and( + pb.greatEqual("created", TimeUtil.localDateToInstant(searchCondition.getFrom())), + pb.lessEqual("created", TimeUtil.localDateToInstant(searchCondition.getTo())) + ); + Collection> searchRes = getAllMetaTransform( + IMDGDistributedNames.Map_SearchMoneyBalanceRegister, + IMDGDistributedNames.Map_MoneyBalanceRegister, + MoneyBalanceRegister.class, + prdct + ); + CommonGetAllResponse response = new CommonGetAllResponse(); + response.fromEntity(searchRes); + return response; + } - @Override - public void afterPropertiesSet() throws Exception { - imdgProviderHist.waitAvailable(); - imdgProvider.waitAvailable(); + //mb move to IStateLoader getHistoryMetaTransofrm + Collection> getAllMetaTransform( + String searchMapName, + String mapName, + Class clazz, + ImdgPredicate conditions) { + Imdg imdgSearch = getImdg(searchMapName, clazz); + Imdg imdgHistory = getImdg(mapName, clazz); + Collection ids = imdgSearch.getCollectionIdsByPredicate(conditions); + return ids.stream() + .map(imdgHistory::getSingleObjectByID) + .filter(Objects::nonNull) + .map(o -> responseFactory.responseFromObject(o, clazz)) + .toList(); + } + + private final Map> allImdgMaps = new ConcurrentHashMap<>(); + @SuppressWarnings("unchecked") + private Imdg getImdg(String mapName, Class clazz) { + return (Imdg) allImdgMaps.computeIfAbsent(mapName, (mapName1) -> imdgProviderHist.getImdg(mapName, clazz)); } }