securities-service добавил обработку DESTINATION_GATEWAY_MONEY_MARKET_SECURITY

This commit is contained in:
AKurakin 2023-06-21 18:05:46 +03:00
parent 43dde65830
commit 8467b8ef9d
2 changed files with 107 additions and 74 deletions

View file

@ -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<FixedIncomeSecurity> fixedIncomeSecurityImdg;
private final Imdg<EquitySecurity> equitySecurityImdg;
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityImdg;
private final Imdg<Listing> listingImdg;
private final Imdg<CouponPeriod> couponPeriodImdg;
private final Imdg<FixedIncomeCashFlow> 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<CouponPeriodNewRequest>)req.getCouponPeriods()) {
for (CouponPeriodNewRequest partRequest : (List<CouponPeriodNewRequest>) 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<FixedIncomeCashFlowNewRequest>)req.getFixedIncomesCashFlow()) {
for (FixedIncomeCashFlowNewRequest partRequest : (List<FixedIncomeCashFlowNewRequest>) 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 <T> BaseRequest<T> wrapRequest(BaseRequest<?> template, T payload, ActionType action) {
BaseRequest<T> 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<MoneyMarketSecurityNewRequest> 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;
}
}

View file

@ -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<MoneyMarketSecurityNewRequest> 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<MoneyMarketSecurityUpdateRequest> 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<EnumMessage> 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<CommonDeleteRequest> 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<EnumMessage> 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) {