diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java index 4f1156522..01fcc83e9 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/GatewaySecurityService.java @@ -14,6 +14,7 @@ import ru.clearing.classes.statics.data.instrument.issue.EquitySecurity; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow; import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeSecurity; import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.clearing.classes.statics.data.security.Security; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.ActionType; @@ -44,6 +45,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin private final Imdg fixedIncomeSecurityImdg; private final Imdg equitySecurityImdg; + private final Imdg moneyMarketSecurityImdg; private final Imdg listingImdg; private final Imdg couponPeriodImdg; private final Imdg fixedIncomeCashFlowImdg; @@ -54,6 +56,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin private final FixedIncomeSecurityService fixedIncomeSecurityService; private final EquitySecurityService equitySecurityService; + private final MoneyMarketSecurityService moneyMarketSecurityService; private final ListingService listingService; private final CouponPeriodService couponPeriodService; private final FixedIncomeCashFlowService fixedIncomeCashFlowService; @@ -74,6 +77,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin FixedIncomeSecurityService fixedIncomeSecurityService, EquitySecurityService equitySecurityService, + MoneyMarketSecurityService moneyMarketSecurityService, ListingService listingService, CouponPeriodService couponPeriodService, FixedIncomeCashFlowService fixedIncomeCashFlowService) { @@ -81,6 +85,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin this.validation = validation; this.fixedIncomeSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeSecurity, FixedIncomeSecurity.class); this.equitySecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_EquitySecurity, EquitySecurity.class); + this.moneyMarketSecurityImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.couponPeriodImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CouponPeriod, CouponPeriod.class); this.fixedIncomeCashFlowImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_FixedIncomeCashFlow, FixedIncomeCashFlow.class); @@ -94,6 +99,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin this.fixedIncomeSecurityService = fixedIncomeSecurityService; this.equitySecurityService = equitySecurityService; + this.moneyMarketSecurityService = moneyMarketSecurityService; this.listingService = listingService; this.couponPeriodService = couponPeriodService; this.fixedIncomeCashFlowService = fixedIncomeCashFlowService; @@ -104,6 +110,9 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin callback(SecurityFondGatewayRequest.class) .setFunction(this::newSecurities) .forDestination(Consts.DESTINATION_SECURITY_GATEWAY, callbacks::put); + callback(MoneyMarketSecurityNewRequest.class) + .setFunction(this::newMoneyMarketSecurity) + .forDestination(Consts.DESTINATION_GATEWAY_MONEY_MARKET_SECURITY, callbacks::put); imdgProvider.waitAvailable(); init(); } @@ -237,7 +246,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin return requestHelper.makeErrorResponse(baseRequest, expected.getEnumMsg()); } try { - for (CouponPeriodNewRequest partRequest : (List)req.getCouponPeriods()) { + for (CouponPeriodNewRequest partRequest : (List) req.getCouponPeriods()) { partRequest.setSecurityId(securityId); CouponPeriod existCouponPeriod = findCouponPeriod(partRequest); if (existCouponPeriod == null) { @@ -256,7 +265,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin return requestHelper.makeErrorResponse(baseRequest, expected.getEnumMsg()); } try { - for (FixedIncomeCashFlowNewRequest partRequest : (List)req.getFixedIncomesCashFlow()) { + for (FixedIncomeCashFlowNewRequest partRequest : (List) req.getFixedIncomesCashFlow()) { partRequest.setSecuritySymbol(String.valueOf(securityId)); // не getSecuritySymbol FixedIncomeCashFlow existFixedIncomeCashFlow = findFixedIncomeCashFlow(partRequest); if (existFixedIncomeCashFlow == null) { @@ -320,7 +329,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } FixedIncomeSecurityUpdateRequest toUpdateRequest(Security security, FixedIncomeSecurityNewRequest newRequest) { - FixedIncomeSecurityUpdateRequest updateRequest = new FixedIncomeSecurityUpdateRequest(); + var updateRequest = new FixedIncomeSecurityUpdateRequest(); updateRequest.setId(security.getId()); if (newRequest.getIssuerId() == null && security.getIssuerId() != null) { newRequest.setIssuerId(security.getIssuerId()); @@ -346,7 +355,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } EquitySecurityUpdateRequest toUpdateRequest(Security security, EquitySecurityNewRequest newRequest) { - EquitySecurityUpdateRequest updateRequest = new EquitySecurityUpdateRequest(); + var updateRequest = new EquitySecurityUpdateRequest(); updateRequest.setId(security.getId()); updateRequest.setSecuritySymbol(newRequest.getSecuritySymbol()); updateRequest.setShortName(newRequest.getShortName()); @@ -363,7 +372,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } ListingUpdateRequest toUpdateRequest(Listing listing, ListingNewRequest newRequest) { - ListingUpdateRequest updateRequest = new ListingUpdateRequest(); + var updateRequest = new ListingUpdateRequest(); updateRequest.setId(listing.getId()); updateRequest.setSecurityId(newRequest.getSecurityId()); updateRequest.setMarket(newRequest.getMarket()); @@ -374,7 +383,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } CouponPeriodUpdateRequest toUpdateRequest(CouponPeriod couponPeriod, CouponPeriodNewRequest newRequest) { - CouponPeriodUpdateRequest updateRequest = new CouponPeriodUpdateRequest(); + var updateRequest = new CouponPeriodUpdateRequest(); updateRequest.setId(couponPeriod.getId()); updateRequest.setSecurityId(newRequest.getSecurityId()); updateRequest.setCouponRate(newRequest.getCouponRate()); @@ -385,7 +394,7 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin } FixedIncomeCashFlowUpdateRequest toUpdateRequest(FixedIncomeCashFlow fxedIncomeCashFlow, FixedIncomeCashFlowNewRequest newRequest) { - FixedIncomeCashFlowUpdateRequest updateRequest = new FixedIncomeCashFlowUpdateRequest(); + var updateRequest = new FixedIncomeCashFlowUpdateRequest(); updateRequest.setId(fxedIncomeCashFlow.getId()); updateRequest.setSecuritySymbol(newRequest.getSecuritySymbol()); updateRequest.setAccruedCoupon(newRequest.getAccruedCoupon()); @@ -395,23 +404,52 @@ public class GatewaySecurityService extends QueueConsumer implements Initializin return updateRequest; } - private BaseRequest wrapRequest(BaseRequest template, T payload, ActionType action) { - BaseRequest r = new BaseRequest<>(); - r.setId(template.getId()); - if (action == null) { - r.setActionType(template.getActionType()); - } else { - r.setActionType(action); + // --- DESTINATION_GATEWAY_MONEY_MARKET_SECURITY --- + + private RequestInfoUpdate newMoneyMarketSecurity(BaseRequest baseRequest) { + log.debug("MoneyMarketSecurityNewRequest id={} received", baseRequest.getId()); + MoneyMarketSecurityNewRequest req = baseRequest.getRequestPayload(); + + synchronized (moneyMarketSecurityService) { + MoneyMarketSecurity existMMS = findSecurityBySecuritySymbol(moneyMarketSecurityImdg, req.getSecuritySymbol()); + try { + if (existMMS == null) { + existMMS = moneyMarketSecurityService.newMoneyMarket0(req); + log.debug("New moneyMarketSecurityService.id={}", existMMS.getId()); + } else { + MoneyMarketSecurityUpdateRequest updateRequest = toUpdateRequest(existMMS, req); + existMMS = moneyMarketSecurityService.updateMoneyMarket0(updateRequest); + log.debug("Was update moneyMarketSecurityService.id={}", existMMS.getId()); + } + } catch (ValidationException expected) { + log.warn("Error create or update issue: {}", expected.toString()); + return requestHelper.makeErrorResponse(baseRequest, expected.getEnumMsg()); + } } - r.setUserId(template.getUserId()); - r.setCorrelationId(template.getCorrelationId()); - r.setRequestPayload(payload); - return r; + return null; } - private void validateReply(Long companyId, String process, RequestInfoUpdate replyI) { - if (replyI != null && replyI.getMessage() != null) { - log.warn("Error process {} for companyId={}: {}", process, companyId, replyI.getMessage()); - } + MoneyMarketSecurityUpdateRequest toUpdateRequest(MoneyMarketSecurity moneyMarketSecurity, MoneyMarketSecurityNewRequest newRequest) { + var updateRequest = new MoneyMarketSecurityUpdateRequest(); + updateRequest.setId(moneyMarketSecurity.getId()); + updateRequest.setStartDate(newRequest.getStartDate()); + updateRequest.setEndDate(newRequest.getEndDate()); + updateRequest.setNominalValue(newRequest.getNominalValue()); + updateRequest.setNominalCurrency(newRequest.getNominalCurrency()); + updateRequest.setInstrumentType(newRequest.getInstrumentType()); + updateRequest.setShortName(newRequest.getShortName()); + updateRequest.setFullName(newRequest.getFullName()); + updateRequest.setConvention(newRequest.getConvention()); + updateRequest.setShortNameEng(newRequest.getShortNameEng()); + updateRequest.setFullNameEng(newRequest.getFullNameEng()); + updateRequest.setSecuritySymbol(newRequest.getSecuritySymbol()); + updateRequest.setLotSize(newRequest.getLotSize()); + updateRequest.setTermType(newRequest.getTermType()); + updateRequest.setDescription(newRequest.getDescription()); + updateRequest.setIssuerId(newRequest.getIssuerId()); + updateRequest.setIsin(newRequest.getIsin()); + updateRequest.setWorkflowStatus(newRequest.getWorkflowStatus()); + return updateRequest; } + } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java index 3a2e38883..6034750e6 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.instrument.issue.FixedIncomeCashFlow; import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.security.MoneyMarketSecurity; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -23,6 +24,7 @@ import ru.spcex.clearing.securities.component.ListingBuilder; import ru.spcex.clearing.securities.errors.SecuritiesError; import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.RequestHelper; import ru.spcex.clearing.validation.common.ValidationHelper; import ru.spcex.platform.enumeration.UserRole; import ru.spcex.platform.enumeration.WorkflowStatus; @@ -33,6 +35,7 @@ import ru.spcex.platform.imdg.api.ImdgTransaction; import ru.spcex.platform.imdg.validation.Stored; import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.error.ValidationException; import ru.spcex.platform.utils.log.ExceptionUtils; import ru.spcex.platform.utils.validation.IValidator; @@ -50,6 +53,7 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial private final ValidationProvider validation; private final UserRoleVerification userRoleVerification; private final ValidationHelper validationHelper; + private final RequestHelper requestHelper; private final IMessageResolver messageResolver; private final ListingService listingService; // для синхронизации @@ -60,12 +64,14 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial ValidationProvider validation, UserRoleVerification userRoleVerification, ValidationHelper validationHelper, + RequestHelper requestHelper, IMessageResolver messageResolver, ListingService listingService) { super(kafkaQueue, kafkaProducer); this.userRoleVerification = userRoleVerification.setRoleForVerification(UserRole.Admin); this.validationHelper = validationHelper; this.validation = validation; + this.requestHelper = requestHelper; this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.imdgProvider = imdgProvider; @@ -105,18 +111,19 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial } private RequestInfoUpdate newMoneyMarket(BaseRequest userRequest) { - MoneyMarketSecurityNewRequest req = userRequest.getRequestPayload(); - - { - RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); - if (requestInfoUpdate != null) return requestInfoUpdate; - } - { - RequestInfoUpdate requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, validation.mmsNewValidator()); - if (requestInfoUpdate != null) return requestInfoUpdate; + log.debug("MoneyMarketSecurityNewRequest received id = {}", userRequest.getId()); + try { + userRoleVerification.validateRoleAndThrow(userRequest); + MoneyMarketSecurity moneyMarketSecurity = newMoneyMarket0(userRequest.getRequestPayload()); + log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), moneyMarketSecurity.getId()); + return null; + } catch (ValidationException e) { + return requestHelper.makeErrorResponse(userRequest, e.getEnumMsg()); } + } - log.debug("MoneyMarketSecurityNewRequest received"); + protected synchronized MoneyMarketSecurity newMoneyMarket0(MoneyMarketSecurityNewRequest req) throws ValidationException { + validationHelper.validateTillFirstErrorAndThrow(req, validation.mmsNewValidator()); MoneyMarketSecurity mms = new MoneyMarketSecurity(); mms.setId(idGenerator.nextId()); mms.setStartDate(req.getStartDate()); @@ -158,33 +165,29 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial } catch (Throwable e) { log.error("Error at create security, rollback transaction. {}", ExceptionUtils.getStackTrace(e)); transaction.rollbackTransaction(); - String errorMsg = messageResolver.resolve(new EnumMessage(SecuritiesError.GeneralError)); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errorMsg); + throw e; } } - log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), mms.getId()); - return null; // default success + return mms; // default success } private RequestInfoUpdate updateMoneyMarket(BaseRequest userRequest) { - MoneyMarketSecurityUpdateRequest req = userRequest.getRequestPayload(); - log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId()); - - RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); - if (requestInfoUpdate != null) return requestInfoUpdate; + log.debug("MoneyMarketSecurityUpdateRequest received id = {}", userRequest.getId()); + try { + userRoleVerification.validateRoleAndThrow(userRequest); + MoneyMarketSecurity moneyMarketSecurity = updateMoneyMarket0(userRequest.getRequestPayload()); + log.debug("successfully processed, request id {}, update object id {}", userRequest.getId(), moneyMarketSecurity.getId()); + return null; + } catch (ValidationException e) { + return requestHelper.makeErrorResponse(userRequest, e.getEnumMsg()); + } + } + protected synchronized MoneyMarketSecurity updateMoneyMarket0(MoneyMarketSecurityUpdateRequest req) throws ValidationException { IValidator validator = validation.mmsUpdateValidator().apply(req); Optional validationError = validator.tillFirstError(); if (validationError.isPresent()) { - String errorMsg = messageResolver.resolve(validationError.get()); - log.error("cannot process MoneyMarketSecurityUpdateRequest id={}: {}", userRequest.getId(), errorMsg); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errorMsg); + throw new ValidationException(validationError.get()); } MoneyMarketSecurity mms = validator.getStored(Stored.PresentById); if (mms == null) log.error("Validator return null stored mms object."); @@ -231,32 +234,28 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial } catch (Throwable e) { log.error("Error at update security {}, rollback transaction. {}", req.getId(), ExceptionUtils.getStackTrace(e)); transaction.rollbackTransaction(); - String errorMsg = messageResolver.resolve(new EnumMessage(SecuritiesError.GeneralError)); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errorMsg); + throw e; } - return null; + return mms; } private RequestInfoUpdate deleteMoneyMarket(BaseRequest userRequest) { - CommonDeleteRequest req = userRequest.getRequestPayload(); - log.debug("CommonDeleteRequest received id = {}", req.getId()); - - RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); - if (requestInfoUpdate != null) return requestInfoUpdate; - + log.debug("CommonDeleteRequest received id = {}", userRequest.getId()); + try { + userRoleVerification.validateRoleAndThrow(userRequest); + Long mmsId = deleteMoneyMarket0(userRequest.getRequestPayload()); + log.debug("successfully processed, request id {}, delete object id {}", userRequest.getId(), mmsId); + return null; + } catch (ValidationException e) { + return requestHelper.makeErrorResponse(userRequest, e.getEnumMsg()); + } + } + protected synchronized Long deleteMoneyMarket0(CommonDeleteRequest req) throws ValidationException { IValidator validator = validation.mmsDeleteValidator().apply(req); Optional validationError = validator.tillFirstError(); if (validationError.isPresent()) { - String errorMsg = messageResolver.resolve(validationError.get()); - log.error("cannot process CommonDeleteRequest id={}: {}", userRequest.getId(), errorMsg); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errorMsg); + throw new ValidationException(validationError.get()); } Instant updateTime = Instant.now(); MoneyMarketSecurity mms = validator.getStored(Stored.PresentById); @@ -284,13 +283,9 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial } catch (Throwable e) { log.error("Error at block security {}, rollback transaction. {}", req.getId(), ExceptionUtils.getStackTrace(e)); transaction.rollbackTransaction(); - String errorMsg = messageResolver.resolve(new EnumMessage(SecuritiesError.GeneralError)); - return new RequestInfoUpdate() - .setId(userRequest.getId()) - .setStatus(Status.Error) - .setMessage(errorMsg); + throw e; } - return null; + return mms.getId(); } public Listing updateListingByMms(MoneyMarketSecurity mms, Listing listing) {