Merge branch 'dev' into report_25_26_29
# Conflicts: # platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java
This commit is contained in:
commit
ddb8d47f3c
44 changed files with 578 additions and 94 deletions
|
|
@ -9,14 +9,17 @@ import ru.spcex.clearing.backendapi.errors.BackEndError;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol;
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.text.TextUtil;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MoneyMarketSecurityNewAction implements IAction<MoneyMarketSecurityNewRequest> {
|
public class MoneyMarketSecurityNewAction implements IAction<MoneyMarketSecurityNewRequest>, WithSecuritySymbol {
|
||||||
@ApiModelProperty(value = "Дата начала действия", example = "2022-01-20")
|
@ApiModelProperty(value = "Дата начала действия", example = "2022-01-20")
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow")
|
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow")
|
||||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
|
@ -48,9 +51,24 @@ public class MoneyMarketSecurityNewAction implements IAction<MoneyMarketSecurity
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<EnumMessage> validate() {
|
public Collection<EnumMessage> validate() {
|
||||||
|
List<EnumMessage> errors = new ArrayList<>();
|
||||||
if (this.startDate == null)
|
if (this.startDate == null)
|
||||||
return List.of(new EnumMessage(BackEndError.ValidationError, "startDate"));
|
errors.add(new EnumMessage(BackEndError.ValidationError, "startDate"));
|
||||||
else return Collections.emptyList();
|
if (this.endDate == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "endDate"));
|
||||||
|
if (this.nominalValue == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "nominalValue"));
|
||||||
|
if (TextUtil.isEmpty(nominalCurrency))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "nominalCurrency"));
|
||||||
|
if (TextUtil.isEmpty(instrumentType))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "instrumentType"));
|
||||||
|
if (TextUtil.isEmpty(fullName))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "fullName"));
|
||||||
|
if (TextUtil.isEmpty(securitySymbol))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "securitySymbol"));
|
||||||
|
if (this.lotSize == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "lotSize"));
|
||||||
|
return errors.size() > 0 ? errors : Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,19 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
||||||
|
import ru.spcex.clearing.backendapi.errors.BackEndError;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||||
import ru.spcex.platform.classes.base.interfaces.WithId;
|
import ru.spcex.platform.classes.base.interfaces.WithId;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.text.TextUtil;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class MoneyMarketSecurityUpdateAction implements IAction<MoneyMarketSecurityUpdateRequest>, WithId {
|
public class MoneyMarketSecurityUpdateAction implements IAction<MoneyMarketSecurityUpdateRequest>, WithId {
|
||||||
@ApiModelProperty(hidden = true)
|
@ApiModelProperty(hidden = true)
|
||||||
|
|
@ -56,6 +63,26 @@ public class MoneyMarketSecurityUpdateAction implements IAction<MoneyMarketSecur
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<EnumMessage> validate() {
|
||||||
|
List<EnumMessage> errors = new ArrayList<>();
|
||||||
|
if (this.startDate == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "startDate"));
|
||||||
|
if (this.endDate == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "endDate"));
|
||||||
|
if (this.nominalValue == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "nominalValue"));
|
||||||
|
if (TextUtil.isEmpty(nominalCurrency))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "nominalCurrency"));
|
||||||
|
if (TextUtil.isEmpty(instrumentType))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "instrumentType"));
|
||||||
|
if (TextUtil.isEmpty(fullName))
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "fullName"));
|
||||||
|
if (this.lotSize == null)
|
||||||
|
errors.add(new EnumMessage(BackEndError.ValidationError, "lotSize"));
|
||||||
|
return errors.size() > 0 ? errors : Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
@ApiModelProperty(hidden = true)
|
@ApiModelProperty(hidden = true)
|
||||||
@Override
|
@Override
|
||||||
public ActionType getActionType() {
|
public ActionType getActionType() {
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ public class RequestStatusController {
|
||||||
}
|
}
|
||||||
RequestInfoResponse response = new RequestInfoResponse();
|
RequestInfoResponse response = new RequestInfoResponse();
|
||||||
response.setStatus(singleObjectByID.getStatus());
|
response.setStatus(singleObjectByID.getStatus());
|
||||||
|
response.setMessage(singleObjectByID.getMessage());
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.time.LocalTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
@ -17,6 +18,7 @@ import java.util.stream.Collectors;
|
||||||
public class GetResponseFactory {
|
public class GetResponseFactory {
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final MetaServer meta;
|
private final MetaServer meta;
|
||||||
|
private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public GetResponseFactory(MetaServer meta) {
|
public GetResponseFactory(MetaServer meta) {
|
||||||
|
|
@ -71,6 +73,8 @@ public class GetResponseFactory {
|
||||||
data = sdf.format(value);
|
data = sdf.format(value);
|
||||||
} else if (value instanceof Instant) {
|
} else if (value instanceof Instant) {
|
||||||
data = dateTimeFormatter.format((Instant) value);
|
data = dateTimeFormatter.format((Instant) value);
|
||||||
|
} else if (value instanceof LocalTime) {
|
||||||
|
data = timeFormatter.format((LocalTime) value);
|
||||||
} else {
|
} else {
|
||||||
data = value;
|
data = value;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ public class RequestInfoAccepter extends QueueConsumer implements InitializingBe
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
requestInfo.setStatus(statusInfo.getStatus());
|
requestInfo.setStatus(statusInfo.getStatus());
|
||||||
|
requestInfo.setMessage(statusInfo.getMessage());
|
||||||
requestInfoImdg.update(requestInfo);
|
requestInfoImdg.update(requestInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@ import org.springframework.stereotype.Component;
|
||||||
import ru.clearing.platform.dictionary.AbstractDictionary;
|
import ru.clearing.platform.dictionary.AbstractDictionary;
|
||||||
import ru.spcex.clearing.backendapi.controller.request.cud.schedule.LauncherNew;
|
import ru.spcex.clearing.backendapi.controller.request.cud.schedule.LauncherNew;
|
||||||
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
import ru.spcex.clearing.backendapi.domain.actions.IAction;
|
||||||
|
import ru.spcex.clearing.backendapi.errors.BackEndError;
|
||||||
import ru.spcex.clearing.backendapi.service.validation.rules.LauncherNewValidationRule;
|
import ru.spcex.clearing.backendapi.service.validation.rules.LauncherNewValidationRule;
|
||||||
import ru.spcex.clearing.backendapi.service.validation.rules.PresentById;
|
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
|
@ -14,9 +14,11 @@ import ru.spcex.platform.classes.base.interfaces.WithId;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.imdg.validation.rule.PresentById;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
import ru.spcex.platform.utils.validation.ValidatorImpl;
|
import ru.spcex.platform.utils.validation.ValidatorImpl;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
@ -35,10 +37,6 @@ public class ActionValidationProvider implements InitializingBean {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class);
|
|
||||||
getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class);
|
|
||||||
getImdg(IMDGDistributedNames.Map_Relation, SpcexObjectBase.class);
|
|
||||||
|
|
||||||
validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity));
|
validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity));
|
||||||
validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity));
|
validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity));
|
||||||
validators.put(Consts.DESTINATION_RELATION_UPDATE, idPresent(IMDGDistributedNames.Map_Relation));
|
validators.put(Consts.DESTINATION_RELATION_UPDATE, idPresent(IMDGDistributedNames.Map_Relation));
|
||||||
|
|
@ -53,21 +51,35 @@ public class ActionValidationProvider implements InitializingBean {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private <T extends IAction<?>> Function<T, IValidator> defaultConstructor(Class<T> clazz, Imdg<?>... imdgs) {
|
||||||
|
return iAcc -> {
|
||||||
|
ImdgValidationContext<T> ctx = new ImdgValidationContext<>();
|
||||||
|
ctx.setValidatedObject(iAcc);
|
||||||
|
Arrays.stream(imdgs).forEach(imdg -> ctx.addImdg(imdg.getMapName(), imdg));
|
||||||
|
return new ValidatorImpl<>(ctx);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
private <T extends IAction<?> & WithId> Function<T, IValidator> idPresent(String mapName) {
|
private <T extends IAction<?> & WithId> Function<T, IValidator> idPresent(String mapName) {
|
||||||
|
Imdg<SpcexObjectBase> targetMap = getImdg(mapName, SpcexObjectBase.class);
|
||||||
return iAction -> {
|
return iAction -> {
|
||||||
ImdgValidationContext<T> ctx = new ImdgValidationContext<>();
|
ImdgValidationContext<T> ctx = new ImdgValidationContext<>();
|
||||||
ctx.setValidatedObject(iAction);
|
ctx.setValidatedObject(iAction);
|
||||||
|
ctx.addImdg(mapName, targetMap);
|
||||||
ValidatorImpl<ImdgValidationContext<T>> iValidator = new ValidatorImpl<>(ctx);
|
ValidatorImpl<ImdgValidationContext<T>> iValidator = new ValidatorImpl<>(ctx);
|
||||||
iValidator.addRule(new PresentById(getImdg(mapName, SpcexObjectBase.class)));
|
iValidator.addRule(new PresentById(mapName, BackEndError.ResourceNotFound));
|
||||||
return iValidator;
|
return iValidator;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private Function<LauncherNew, IValidator> taskRunnerNew() {
|
private Function<LauncherNew, IValidator> taskRunnerNew() {
|
||||||
|
Imdg<AbstractDictionary> tskDctnrImdg = getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class);
|
||||||
return taskRunnerNew -> {
|
return taskRunnerNew -> {
|
||||||
ImdgValidationContext<LauncherNew> ctx = new ImdgValidationContext<>();
|
ImdgValidationContext<LauncherNew> ctx = new ImdgValidationContext<>();
|
||||||
ctx.setValidatedObject(taskRunnerNew);
|
ctx.setValidatedObject(taskRunnerNew);
|
||||||
ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class));
|
ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, tskDctnrImdg);
|
||||||
ValidatorImpl<ImdgValidationContext<LauncherNew>> iValidator = new ValidatorImpl<>(ctx);
|
ValidatorImpl<ImdgValidationContext<LauncherNew>> iValidator = new ValidatorImpl<>(ctx);
|
||||||
iValidator.addRule(LauncherNewValidationRule.knownTaskDictionary);
|
iValidator.addRule(LauncherNewValidationRule.knownTaskDictionary);
|
||||||
return iValidator;
|
return iValidator;
|
||||||
|
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
package ru.spcex.clearing.backendapi.service.validation.rules;
|
|
||||||
import ru.spcex.clearing.backendapi.errors.BackEndError;
|
|
||||||
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
|
||||||
import ru.spcex.platform.classes.base.interfaces.WithId;
|
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
|
||||||
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
|
||||||
import ru.spcex.platform.utils.validation.IValidationRule;
|
|
||||||
|
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class PresentById implements IValidationRule<ImdgValidationContext<WithId>> {
|
|
||||||
private final Imdg<SpcexObjectBase> map;
|
|
||||||
|
|
||||||
public PresentById(Imdg<SpcexObjectBase> map) {
|
|
||||||
this.map = map;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Optional<EnumMessage> validate(ImdgValidationContext<WithId> context) {
|
|
||||||
WithId actionById = context.getValidatedObject();
|
|
||||||
if (map.getSingleObjectByID(actionById.getId()) == null) {
|
|
||||||
return of(BackEndError.ResourceNotFound, actionById.getId());
|
|
||||||
} else {
|
|
||||||
return empty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -4,6 +4,8 @@ import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import ru.spcex.clearing.balance.service.AbstractExecutor;
|
import ru.spcex.clearing.balance.service.AbstractExecutor;
|
||||||
import ru.spcex.clearing.balance.service.Sdf01Executor;
|
import ru.spcex.clearing.balance.service.Sdf01Executor;
|
||||||
|
import ru.spcex.clearing.balance.service.Sdf09Executor;
|
||||||
|
import ru.spcex.clearing.balance.service.Sdf16Executor;
|
||||||
import ru.spcex.platform.classes.base.interfaces.WithAccount;
|
import ru.spcex.platform.classes.base.interfaces.WithAccount;
|
||||||
import ru.spcex.platform.enumeration.SdfTable;
|
import ru.spcex.platform.enumeration.SdfTable;
|
||||||
|
|
||||||
|
|
@ -14,9 +16,13 @@ import java.util.Map;
|
||||||
public class SdfExecutorsConfig {
|
public class SdfExecutorsConfig {
|
||||||
|
|
||||||
@Bean("sdfExecutors")
|
@Bean("sdfExecutors")
|
||||||
public Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap(Sdf01Executor sdf01Executor) {
|
public Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap(Sdf01Executor sdf01Executor,
|
||||||
|
Sdf09Executor sdf09Executor,
|
||||||
|
Sdf16Executor sdf16Executor) {
|
||||||
Map<SdfTable, AbstractExecutor<? extends WithAccount>> executors = new HashMap<>();
|
Map<SdfTable, AbstractExecutor<? extends WithAccount>> executors = new HashMap<>();
|
||||||
executors.put(SdfTable.SDF_01, sdf01Executor);
|
executors.put(SdfTable.SDF_01, sdf01Executor);
|
||||||
|
executors.put(SdfTable.SDF_09, sdf09Executor);
|
||||||
|
executors.put(SdfTable.SDF_16, sdf16Executor);
|
||||||
return executors;
|
return executors;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -71,6 +71,7 @@ public class ValidationConfig {
|
||||||
Consumer<String> addImdg = (s) -> context.addImdg(s, getImdg(s));
|
Consumer<String> addImdg = (s) -> context.addImdg(s, getImdg(s));
|
||||||
addImdg.accept(IMDGDistributedNames.Map_Account);
|
addImdg.accept(IMDGDistributedNames.Map_Account);
|
||||||
addImdg.accept(IMDGDistributedNames.Map_Company);
|
addImdg.accept(IMDGDistributedNames.Map_Company);
|
||||||
|
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols);
|
||||||
return new ValidatorImpl<>(context,
|
return new ValidatorImpl<>(context,
|
||||||
Sdf16ValidationRule.CompanyPresent,
|
Sdf16ValidationRule.CompanyPresent,
|
||||||
ExistClrnAccountValidationRule.AccountPresent,
|
ExistClrnAccountValidationRule.AccountPresent,
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,6 @@ import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
import ru.spcex.platform.utils.validation.IValidator;
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
|
|
@ -201,15 +200,15 @@ public class Sdf16Executor extends AbstractExecutor<SDf16> {
|
||||||
successSdf.setGenerationId(generationIdForGroup);
|
successSdf.setGenerationId(generationIdForGroup);
|
||||||
successSdf.setGenerationTime(Instant.now());
|
successSdf.setGenerationTime(Instant.now());
|
||||||
successSdf.setInSDf16Id(sdf.getId());
|
successSdf.setInSDf16Id(sdf.getId());
|
||||||
successSdf.setResult(BigDecimal.ZERO);
|
successSdf.setResult(0);
|
||||||
return successSdf;
|
return successSdf;
|
||||||
}
|
}
|
||||||
|
|
||||||
private BigDecimal obtainResultNum(EnumMessage error){
|
private Integer obtainResultNum(EnumMessage error){
|
||||||
if (BalanceError.AccountNotPresent.equalsById(error.getSubject().getId()))
|
if (BalanceError.AccountNotPresent.equalsById(error.getSubject().getId()))
|
||||||
return BigDecimal.ONE;
|
return 1;
|
||||||
if (BalanceError.BalanceNotEnough.equalsById(error.getSubject().getId()))
|
if (BalanceError.BalanceNotEnough.equalsById(error.getSubject().getId()))
|
||||||
return BigDecimal.ONE;
|
return 1;
|
||||||
return BigDecimal.valueOf(9);
|
return 9;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.sdf.SDf01;
|
import ru.clearing.classes.statics.data.sdf.SDf01;
|
||||||
|
import ru.clearing.classes.statics.data.sdf.SDf09;
|
||||||
|
import ru.clearing.classes.statics.data.sdf.SDf16;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
|
|
@ -23,6 +25,7 @@ import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.EnumMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
@ -33,7 +36,7 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
||||||
|
|
||||||
private final ImdgProvider imdgProvider;
|
private final ImdgProvider imdgProvider;
|
||||||
private final KafkaSender kafkaReqProducer;
|
private final KafkaSender kafkaReqProducer;
|
||||||
private final Imdg<? extends WithAccount> sdf01Imdg;
|
private final Map<SdfTable, Imdg<? extends WithAccount>> sdfImdgs;
|
||||||
private final Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap;
|
private final Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -43,9 +46,12 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
||||||
@Qualifier("sdfExecutors") Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap) {
|
@Qualifier("sdfExecutors") Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap) {
|
||||||
super(kafkaQueue);
|
super(kafkaQueue);
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.sdf01Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class);
|
this.sdfImdgs = new EnumMap<>(SdfTable.class);
|
||||||
this.kafkaReqProducer = kafkaReqProducer;
|
this.kafkaReqProducer = kafkaReqProducer;
|
||||||
this.executorsMap = executorsMap;
|
this.executorsMap = executorsMap;
|
||||||
|
this.sdfImdgs.put(SdfTable.SDF_01, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class));
|
||||||
|
this.sdfImdgs.put(SdfTable.SDF_09, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf09, SDf09.class));
|
||||||
|
this.sdfImdgs.put(SdfTable.SDF_16, imdgProvider.getImdg(IMDGDistributedNames.Map_SDf16, SDf16.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -61,13 +67,14 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
||||||
Collection<? extends WithAccount> sdfGroup;
|
Collection<? extends WithAccount> sdfGroup;
|
||||||
SdfTable table = statementRequest.getTable();
|
SdfTable table = statementRequest.getTable();
|
||||||
//map = getMapByTable(table)
|
//map = getMapByTable(table)
|
||||||
|
Imdg<? extends WithAccount> sdfImdg = sdfImdgs.get(table);
|
||||||
if (statementRequest.getAccountCreationResults().size() == 0) {
|
if (statementRequest.getAccountCreationResults().size() == 0) {
|
||||||
sdfGroup = sdf01Imdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId()));
|
sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId()));
|
||||||
} else {
|
} else {
|
||||||
sdfGroup = statementRequest.getAccountCreationResults()
|
sdfGroup = statementRequest.getAccountCreationResults()
|
||||||
.stream()
|
.stream()
|
||||||
.filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02
|
.filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02
|
||||||
.map(part -> sdf01Imdg.getSingleObjectByID(part.getSdfId()))
|
.map(part -> sdfImdg.getSingleObjectByID(part.getSdfId()))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
// sdf01Group = sdf01Group
|
// sdf01Group = sdf01Group
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ public class SDf17 extends SpcexObjectBase implements WithAccount {
|
||||||
private BigDecimal BIC;
|
private BigDecimal BIC;
|
||||||
private String SPEC;
|
private String SPEC;
|
||||||
private BigDecimal number;
|
private BigDecimal number;
|
||||||
private BigDecimal result;
|
private Integer result;
|
||||||
private Instant generationTime;
|
private Instant generationTime;
|
||||||
private Long generationId;
|
private Long generationId;
|
||||||
private Long inSDf16Id;
|
private Long inSDf16Id;
|
||||||
|
|
@ -93,11 +93,11 @@ public class SDf17 extends SpcexObjectBase implements WithAccount {
|
||||||
this.number = value;
|
this.number = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BigDecimal getResult() {
|
public Integer getResult() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setResult(BigDecimal value) {
|
public void setResult(Integer value) {
|
||||||
this.result = value;
|
this.result = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,16 +3,12 @@ package ru.spcex.clearing.config;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
public class MessageResolverConfig {
|
public class MessageResolverConfig {
|
||||||
@Bean
|
@Bean
|
||||||
public IMessageResolver messageResolver() {
|
public IMessageResolver messageResolver() {
|
||||||
return errorMessage -> {
|
return new SimpleMessageResolver();
|
||||||
if (errorMessage == null) return "null";
|
|
||||||
return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs()));
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,9 +34,9 @@ public class S_DF17_Converter extends DFConverter<SDf17> {
|
||||||
dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1));
|
dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1));
|
||||||
dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18));
|
dbfFields.add(new DBFField("_I_N_N", DBFDataType.NUMERIC, 32, 18));
|
||||||
dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18));
|
dbfFields.add(new DBFField("_B_I_C", DBFDataType.NUMERIC, 32, 18));
|
||||||
dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.NUMERIC, 32, 18));
|
dbfFields.add(new DBFField("_S_P_E_C", DBFDataType.CHARACTER, 254));
|
||||||
dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18));
|
dbfFields.add(new DBFField("NUMBER", DBFDataType.NUMERIC, 32, 18));
|
||||||
dbfFields.add(new DBFField("RESULT", DBFDataType.CHARACTER, 3));
|
dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 1));
|
||||||
return dbfFields.toArray(DBFField[]::new);
|
return dbfFields.toArray(DBFField[]::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,9 @@ public class DbfImportKafkaMessenger implements InitializingBean {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
messengers.put(ETable.DF_01, this::messageDf01);
|
messengers.put(ETable.DF_01, groupId -> messageBalance(groupId, SdfTable.SDF_01));
|
||||||
|
messengers.put(ETable.DF_09, groupId -> messageBalance(groupId, SdfTable.SDF_09));
|
||||||
|
messengers.put(ETable.DF_16, groupId -> messageBalance(groupId, SdfTable.SDF_16));
|
||||||
messengers.put(ETable.DF_04, this::messageDf04);
|
messengers.put(ETable.DF_04, this::messageDf04);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -41,10 +43,10 @@ public class DbfImportKafkaMessenger implements InitializingBean {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void messageDf01(Long groupId) {
|
private void messageBalance(Long groupId, SdfTable table) {
|
||||||
StatementRequest statementRequest = new StatementRequest();
|
StatementRequest statementRequest = new StatementRequest();
|
||||||
statementRequest.setGroupId(groupId);
|
statementRequest.setGroupId(groupId);
|
||||||
statementRequest.setTable(SdfTable.SDF_01);
|
statementRequest.setTable(table);
|
||||||
kafka.get().sendRequestToQueue(Consts.STATEMENT_PROCESS, statementRequest);
|
kafka.get().sendRequestToQueue(Consts.STATEMENT_PROCESS, statementRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,18 +42,22 @@ public class DBFImporterService {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void run(ETable specificTable) {
|
public void run(ETable specificTable) {
|
||||||
log.info("adding import task {}", specificTable != null ? specificTable.name() : "");
|
if (specificTable == null) {
|
||||||
|
log.trace("adding import task");
|
||||||
|
} else {
|
||||||
|
log.info("adding import task {}", specificTable);
|
||||||
|
}
|
||||||
executorService.execute(() -> {
|
executorService.execute(() -> {
|
||||||
Map<ETable, List<File>> newFiles = null;
|
Map<ETable, List<File>> newFiles = null;
|
||||||
try {
|
try {
|
||||||
log.info("checking new files... {}", specificTable != null ? specificTable.name() : "");
|
log.trace("checking new files... {}", specificTable != null ? specificTable.name() : "");
|
||||||
newFiles = getFiles(specificTable);
|
newFiles = getFiles(specificTable);
|
||||||
if (newFiles.size() > 0 && log.isDebugEnabled()) {
|
if (newFiles.size() > 0 && log.isDebugEnabled()) {
|
||||||
log.debug("following files will be processed {}", forLogging(newFiles));
|
log.debug("following files will be processed {}", forLogging(newFiles));
|
||||||
} else if (newFiles.size() > 0) {
|
} else if (newFiles.size() > 0) {
|
||||||
log.info("following files will be processed {}", forLoggingSizeOnly(newFiles));
|
log.info("following files will be processed {}", forLoggingSizeOnly(newFiles));
|
||||||
} else {
|
} else {
|
||||||
log.info("no files were found");
|
log.trace("no files were found");
|
||||||
}
|
}
|
||||||
for (Map.Entry<ETable, List<File>> newFilesEntry : newFiles.entrySet()) {
|
for (Map.Entry<ETable, List<File>> newFilesEntry : newFiles.entrySet()) {
|
||||||
ETable currTable = newFilesEntry.getKey();
|
ETable currTable = newFilesEntry.getKey();
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<charset>UTF-8</charset>
|
<charset>UTF-8</charset>
|
||||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
<pattern>%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ public class SDf17MapStore extends TemplateMapStore<SDf17> {
|
||||||
object.setBIC(resultSet.getObject("_B_I_C", BigDecimal.class));
|
object.setBIC(resultSet.getObject("_B_I_C", BigDecimal.class));
|
||||||
object.setSPEC(resultSet.getObject("_S_P_E_C", String.class));
|
object.setSPEC(resultSet.getObject("_S_P_E_C", String.class));
|
||||||
object.setNumber(resultSet.getObject("NUMBER", BigDecimal.class));
|
object.setNumber(resultSet.getObject("NUMBER", BigDecimal.class));
|
||||||
object.setResult(resultSet.getObject("RESULT", BigDecimal.class));
|
object.setResult(resultSet.getObject("RESULT", Integer.class));
|
||||||
object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME"));
|
object.setGenerationTime(getInstantFromTimestamp(resultSet, "GENERATION_TIME"));
|
||||||
object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class));
|
object.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class));
|
||||||
object.setInSDf16Id(resultSet.getObject("IN_S_DF16_ID", Long.class));
|
object.setInSDf16Id(resultSet.getObject("IN_S_DF16_ID", Long.class));
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<file>./logs/utility-service.log</file>
|
<file>./logs/scheduler-service.log</file>
|
||||||
<encoder>
|
<encoder>
|
||||||
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
|
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
|
||||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
|
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
</encoder>
|
</encoder>
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
|
||||||
<fileNamePattern>
|
<fileNamePattern>
|
||||||
./logs/utility-service.%i.log
|
./logs/scheduler-service.%i.log
|
||||||
</fileNamePattern>
|
</fileNamePattern>
|
||||||
<minIndex>1</minIndex>
|
<minIndex>1</minIndex>
|
||||||
<maxIndex>10</maxIndex>
|
<maxIndex>10</maxIndex>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package ru.spcex.clearing.securities.component;
|
||||||
|
|
||||||
|
import ru.clearing.classes.statics.data.misc.Listing;
|
||||||
|
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
|
||||||
|
import ru.spcex.platform.enumeration.Market;
|
||||||
|
import ru.spcex.platform.enumeration.Status;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
public class ListingBuilder {
|
||||||
|
public Listing byNewMms(MoneyMarketSecurity mms, MoneyMarketSecurityNewRequest mmsReq) {
|
||||||
|
Listing listing = new Listing();
|
||||||
|
listing.setCreated(mms.getCreated());
|
||||||
|
listing.setSecurityId(mms.getId());
|
||||||
|
listing.setLotSize(BigDecimal.valueOf(mmsReq.getLotSize()));
|
||||||
|
listing.setMarket(Market.mkrs.getKey());
|
||||||
|
listing.setSymbolCode(mms.getSecuritySymbol());
|
||||||
|
listing.setSymbolName(mms.getFullName());
|
||||||
|
listing.setTradingCurrency(mms.getNominalCurrency());
|
||||||
|
listing.setWorkflowStatus(Status.Active.getKey());
|
||||||
|
return listing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
package ru.spcex.clearing.securities.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||||
|
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class ErrorResolverConfig {
|
||||||
|
@Bean
|
||||||
|
public IMessageResolver messageResolver() {
|
||||||
|
return new SimpleMessageResolver();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package ru.spcex.clearing.securities.errors;
|
||||||
|
|
||||||
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
|
||||||
|
public enum SecuritiesError implements IEnumId {
|
||||||
|
WrongFieldValue(1004L),
|
||||||
|
InstrumentAlreadyExists(1010L),
|
||||||
|
InstrumentNotActive(1012L),
|
||||||
|
InstrumentNotFound(1011L),
|
||||||
|
;
|
||||||
|
private final Long id;
|
||||||
|
|
||||||
|
SecuritiesError(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.clearing.classes.statics.data.misc.Listing;
|
||||||
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
|
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
|
|
@ -16,29 +17,48 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSe
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||||
import ru.spcex.clearing.platform.messaging.service.RequestInfo;
|
import ru.spcex.clearing.platform.messaging.service.RequestInfo;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
import ru.spcex.clearing.platform.messaging.service.Status;
|
import ru.spcex.clearing.platform.messaging.service.Status;
|
||||||
|
import ru.spcex.clearing.securities.component.ListingBuilder;
|
||||||
|
import ru.spcex.clearing.securities.validation.ValidationProvider;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgId;
|
import ru.spcex.platform.imdg.api.ImdgId;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
import ru.spcex.platform.imdg.api.ImdgTransaction;
|
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.validation.IValidator;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MoneyMarketSecurityService extends QueueConsumer implements InitializingBean {
|
public class MoneyMarketSecurityService extends QueueConsumer implements InitializingBean {
|
||||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityMap;
|
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityMap;
|
||||||
|
private final Imdg<Listing> listingImdg;
|
||||||
private final ImdgProvider imdgProvider;
|
private final ImdgProvider imdgProvider;
|
||||||
private final ImdgId idGenerator;
|
private final ImdgId idGenerator;
|
||||||
|
private final ValidationProvider validation;
|
||||||
|
private final IMessageResolver messageResolver;
|
||||||
|
private final ListingBuilder listingBuilder = new ListingBuilder();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public MoneyMarketSecurityService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
public MoneyMarketSecurityService(Consumer<String, Object> kafkaQueue,
|
||||||
ImdgProvider imdgProvider) {
|
Producer<String, Object> kafkaProducer,
|
||||||
|
ImdgProvider imdgProvider,
|
||||||
|
ValidationProvider validation,
|
||||||
|
IMessageResolver messageResolver) {
|
||||||
super(kafkaQueue, kafkaProducer);
|
super(kafkaQueue, kafkaProducer);
|
||||||
|
this.validation = validation;
|
||||||
this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
||||||
|
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
||||||
this.imdgProvider = imdgProvider;
|
this.imdgProvider = imdgProvider;
|
||||||
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
||||||
|
this.messageResolver = messageResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -59,23 +79,32 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
||||||
@Override
|
@Override
|
||||||
public void afterPropertiesSet() {
|
public void afterPropertiesSet() {
|
||||||
callback(MoneyMarketSecurityNewRequest.class)
|
callback(MoneyMarketSecurityNewRequest.class)
|
||||||
.setConsumer(this::newMoneyMarket)
|
.setFunction(this::newMoneyMarket)
|
||||||
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_NEW, callbacks::put);
|
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_NEW, callbacks::put);
|
||||||
callback(MoneyMarketSecurityUpdateRequest.class)
|
callback(MoneyMarketSecurityUpdateRequest.class)
|
||||||
.setConsumer(this::updateMoneyMarket)
|
.setFunction(this::updateMoneyMarket)
|
||||||
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, callbacks::put);
|
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, callbacks::put);
|
||||||
callback(CommonDeleteRequest.class)
|
callback(CommonDeleteRequest.class)
|
||||||
.setConsumer(this::deleteMoneyMarket)
|
.setFunction(this::deleteMoneyMarket)
|
||||||
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, callbacks::put);
|
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, callbacks::put);
|
||||||
imdgProvider.waitAvailable();
|
imdgProvider.waitAvailable();
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void newMoneyMarket(BaseRequest<MoneyMarketSecurityNewRequest> userRequest) {
|
private RequestInfoUpdate newMoneyMarket(BaseRequest<MoneyMarketSecurityNewRequest> userRequest) {
|
||||||
// Imdg<RequestInfo> requestInfoImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
|
|
||||||
// RequestInfo reqInfo = requestInfoImdg.getSingleObjectByID(userRequest.getId());
|
|
||||||
ImdgTransaction transaction = imdgProvider.newTransaction();
|
ImdgTransaction transaction = imdgProvider.newTransaction();
|
||||||
MoneyMarketSecurityNewRequest req = userRequest.getRequestPayload();
|
MoneyMarketSecurityNewRequest req = userRequest.getRequestPayload();
|
||||||
|
Optional<EnumMessage> validationError = validation.mmsNewValidator()
|
||||||
|
.apply(req)
|
||||||
|
.tillFirstError();
|
||||||
|
if (validationError.isPresent()) {
|
||||||
|
String errorMsg = messageResolver.resolve(validationError.get());
|
||||||
|
log.error("cannot process MoneyMarketSecurityNewRequest id={}: {}", userRequest.getId(), errorMsg);
|
||||||
|
return new RequestInfoUpdate()
|
||||||
|
.setId(userRequest.getId())
|
||||||
|
.setStatus(Status.Error)
|
||||||
|
.setMessage(errorMsg);
|
||||||
|
}
|
||||||
log.debug("MoneyMarketSecurityNewRequest received");
|
log.debug("MoneyMarketSecurityNewRequest received");
|
||||||
MoneyMarketSecurity mms = new MoneyMarketSecurity();
|
MoneyMarketSecurity mms = new MoneyMarketSecurity();
|
||||||
mms.setId(idGenerator.nextId());
|
mms.setId(idGenerator.nextId());
|
||||||
|
|
@ -92,10 +121,11 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
||||||
try {
|
try {
|
||||||
transaction.beginTransaction();
|
transaction.beginTransaction();
|
||||||
Imdg<MoneyMarketSecurity> moneyMarketSecurityMap = transaction.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
Imdg<MoneyMarketSecurity> moneyMarketSecurityMap = transaction.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
||||||
Imdg<RequestInfo> reqInfoMap = transaction.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
|
Imdg<Listing> listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
||||||
//одним скопом выполняем реквест
|
//одним скопом выполняем реквест
|
||||||
moneyMarketSecurityMap.insert(mms);
|
moneyMarketSecurityMap.insert(mms);
|
||||||
// RequestInfo.update(reqInfo, Status.Success, "success");
|
Listing listing = listingBuilder.byNewMms(mms, req);
|
||||||
|
listingMap.insert(listing);
|
||||||
//и сохраняем обновленный
|
//и сохраняем обновленный
|
||||||
// reqInfoMap.insert(reqInfo);
|
// reqInfoMap.insert(reqInfo);
|
||||||
transaction.commitTransaction();
|
transaction.commitTransaction();
|
||||||
|
|
@ -105,13 +135,25 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
||||||
// requestInfoImdg.insert(reqInfo);
|
// requestInfoImdg.insert(reqInfo);
|
||||||
}
|
}
|
||||||
log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), mms.getId());
|
log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), mms.getId());
|
||||||
|
return null; // default success
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMoneyMarket(BaseRequest<MoneyMarketSecurityUpdateRequest> userRequest) {
|
private RequestInfoUpdate updateMoneyMarket(BaseRequest<MoneyMarketSecurityUpdateRequest> userRequest) {
|
||||||
MoneyMarketSecurityUpdateRequest req = userRequest.getRequestPayload();
|
MoneyMarketSecurityUpdateRequest req = userRequest.getRequestPayload();
|
||||||
log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId());
|
log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId());
|
||||||
MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId());
|
IValidator validator = validation.mmsUpdateValidator().apply(req);
|
||||||
mms.setUpdated(Instant.now());
|
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);
|
||||||
|
}
|
||||||
|
MoneyMarketSecurity mms = validator.getStored(Stored.PresentById);
|
||||||
|
Instant updateTime = Instant.now();
|
||||||
|
mms.setUpdated(updateTime);
|
||||||
mms.setStartDate(req.getStartDate());
|
mms.setStartDate(req.getStartDate());
|
||||||
mms.setEndDate(req.getEndDate());
|
mms.setEndDate(req.getEndDate());
|
||||||
mms.setNominalValue(req.getNominalValue() != null ? BigDecimal.valueOf(req.getNominalValue()) : null);
|
mms.setNominalValue(req.getNominalValue() != null ? BigDecimal.valueOf(req.getNominalValue()) : null);
|
||||||
|
|
@ -119,12 +161,43 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
||||||
mms.setInstrumentType(req.getInstrumentType());
|
mms.setInstrumentType(req.getInstrumentType());
|
||||||
mms.setFullName(req.getFullName());
|
mms.setFullName(req.getFullName());
|
||||||
moneyMarketSecurityMap.update(mms);
|
moneyMarketSecurityMap.update(mms);
|
||||||
|
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId()));
|
||||||
|
if (listing == null) {
|
||||||
|
log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
listing.setLotSize(BigDecimal.valueOf(req.getLotSize()));
|
||||||
|
listing.setUpdated(updateTime);
|
||||||
|
listingImdg.update(listing);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteMoneyMarket(BaseRequest<CommonDeleteRequest> userRequest) {
|
private RequestInfoUpdate deleteMoneyMarket(BaseRequest<CommonDeleteRequest> userRequest) {
|
||||||
CommonDeleteRequest req = userRequest.getRequestPayload();
|
CommonDeleteRequest req = userRequest.getRequestPayload();
|
||||||
log.debug("CommonDeleteRequest received id = {}", req.getId());
|
log.debug("CommonDeleteRequest received id = {}", req.getId());
|
||||||
MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId());
|
IValidator validator = validation.mmsDeleteValidator().apply(req);
|
||||||
moneyMarketSecurityMap.delete(mms);
|
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);
|
||||||
|
}
|
||||||
|
MoneyMarketSecurity mms = validator.getStored(Stored.PresentById);
|
||||||
|
mms.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
|
||||||
|
Instant.now();
|
||||||
|
mms.setUpdated(Instant.now());
|
||||||
|
moneyMarketSecurityMap.update(mms);
|
||||||
|
Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId()));
|
||||||
|
if (listing == null) {
|
||||||
|
log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey());
|
||||||
|
listing.setUpdated(Instant.now());
|
||||||
|
listingImdg.update(listing);
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
package ru.spcex.clearing.securities.validation;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
||||||
|
import ru.spcex.clearing.securities.errors.SecuritiesError;
|
||||||
|
import ru.spcex.clearing.securities.validation.rule.EndDtAfterStartDt;
|
||||||
|
import ru.spcex.clearing.securities.validation.rule.MmsNewValidationRule;
|
||||||
|
import ru.spcex.clearing.securities.validation.rule.MmsUpdateValidationRule;
|
||||||
|
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.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.imdg.validation.rule.PresentById;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidator;
|
||||||
|
import ru.spcex.platform.utils.validation.ValidatorImpl;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ValidationProvider {
|
||||||
|
private final Imdg<SpcexObjectBase> mmsMap;
|
||||||
|
|
||||||
|
|
||||||
|
public ValidationProvider(ImdgProvider imdgProvider) {
|
||||||
|
this.mmsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Function<MoneyMarketSecurityNewRequest, IValidator> mmsNewValidator() {
|
||||||
|
return mmsRequest -> {
|
||||||
|
ImdgValidationContext<MoneyMarketSecurityNewRequest> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(mmsRequest);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap);
|
||||||
|
return new ValidatorImpl<>(context,
|
||||||
|
EndDtAfterStartDt.instance(MoneyMarketSecurityNewRequest.class),
|
||||||
|
MmsNewValidationRule.SecuritySymbolUniq
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Function<MoneyMarketSecurityUpdateRequest, IValidator> mmsUpdateValidator() {
|
||||||
|
return mmsRequest -> {
|
||||||
|
ImdgValidationContext<MoneyMarketSecurityUpdateRequest> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(mmsRequest);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap);
|
||||||
|
return new ValidatorImpl<>(context,
|
||||||
|
EndDtAfterStartDt.instance(MoneyMarketSecurityUpdateRequest.class),
|
||||||
|
new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true),
|
||||||
|
MmsUpdateValidationRule.StatusIsActive
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public Function<CommonDeleteRequest, IValidator> mmsDeleteValidator() {
|
||||||
|
return mmsRequest -> {
|
||||||
|
ImdgValidationContext<CommonDeleteRequest> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(mmsRequest);
|
||||||
|
context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap);
|
||||||
|
return new ValidatorImpl<>(context,
|
||||||
|
new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
package ru.spcex.clearing.securities.validation.rule;
|
||||||
|
|
||||||
|
import ru.spcex.clearing.securities.errors.SecuritiesError;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithEndDt;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithStartDt;
|
||||||
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class EndDtAfterStartDt<T extends WithStartDt & WithEndDt> implements IValidationRule<ImdgValidationContext<T>> {
|
||||||
|
|
||||||
|
public EndDtAfterStartDt() {}
|
||||||
|
|
||||||
|
public static <T1 extends WithStartDt & WithEndDt> EndDtAfterStartDt<T1> instance(Class<T1> clazz) {
|
||||||
|
return new EndDtAfterStartDt<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<T> context) {
|
||||||
|
T validatedObject = context.getValidatedObject();
|
||||||
|
if (validatedObject.getEndDate().isBefore(validatedObject.getStartDate())) {
|
||||||
|
return of(SecuritiesError.WrongFieldValue, "endDate");
|
||||||
|
}
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package ru.spcex.clearing.securities.validation.rule;
|
||||||
|
|
||||||
|
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest;
|
||||||
|
import ru.spcex.clearing.securities.errors.SecuritiesError;
|
||||||
|
import ru.spcex.platform.enumeration.Status;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public enum MmsNewValidationRule implements IValidationRule<ImdgValidationContext<MoneyMarketSecurityNewRequest>> {
|
||||||
|
SecuritySymbolUniq() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<MoneyMarketSecurityNewRequest> context) {
|
||||||
|
MoneyMarketSecurityNewRequest action = context.getValidatedObject();
|
||||||
|
Imdg<MoneyMarketSecurity> mmsImdg = context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
||||||
|
MoneyMarketSecurity mms = mmsImdg.getSingleObjectByFieldValues(Map.of(
|
||||||
|
"securitySymbol", action.getSecuritySymbol(),
|
||||||
|
"workflowStatus", Status.Active.getKey()));
|
||||||
|
if (mms != null) {
|
||||||
|
return of(SecuritiesError.InstrumentAlreadyExists);
|
||||||
|
} else {
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String ruleName() {
|
||||||
|
return "MmsNewValidationRule." + name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
package ru.spcex.clearing.securities.validation.rule;
|
||||||
|
|
||||||
|
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
||||||
|
import ru.spcex.clearing.securities.errors.SecuritiesError;
|
||||||
|
import ru.spcex.platform.enumeration.Status;
|
||||||
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.imdg.validation.Stored;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public enum MmsUpdateValidationRule implements IValidationRule<ImdgValidationContext<MoneyMarketSecurityUpdateRequest>> {
|
||||||
|
StatusIsActive() {
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<MoneyMarketSecurityUpdateRequest> context) {
|
||||||
|
MoneyMarketSecurity mms = context.getStoredObject(Stored.PresentById);
|
||||||
|
//проверка только если PresentById найдет объект и сохранит его
|
||||||
|
if (mms != null && !Status.Active.getKey().equals(mms.getWorkflowStatus())) {
|
||||||
|
return of(SecuritiesError.InstrumentNotActive);
|
||||||
|
} else {
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String ruleName() {
|
||||||
|
return "MmsNewValidationRule." + name();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -29,7 +29,9 @@ import ru.spcex.clearing.securities.config.HazelcastInstanceTestConfiguration;
|
||||||
import ru.spcex.clearing.securities.config.HazelcastServiceTestConfiguration;
|
import ru.spcex.clearing.securities.config.HazelcastServiceTestConfiguration;
|
||||||
import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService;
|
import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService;
|
||||||
import ru.spcex.clearing.securities.utils.MatcherFactory;
|
import ru.spcex.clearing.securities.utils.MatcherFactory;
|
||||||
|
import ru.spcex.clearing.securities.validation.ValidationProvider;
|
||||||
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
|
import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService;
|
||||||
|
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|
@ -84,7 +86,8 @@ public class MoneyMarketSecurityServiceDisabled {
|
||||||
|
|
||||||
private void startService() throws InterruptedException {
|
private void startService() throws InterruptedException {
|
||||||
MoneyMarketSecurityService keyRateService =
|
MoneyMarketSecurityService keyRateService =
|
||||||
new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService);
|
new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService,
|
||||||
|
new ValidationProvider(hazelcastService), new SimpleMessageResolver());
|
||||||
keyRateService.afterPropertiesSet();
|
keyRateService.afterPropertiesSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ru.spcex.platform.classes.base.interfaces;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
public interface WithEndDt {
|
||||||
|
LocalDate getEndDate();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
package ru.spcex.platform.classes.base.interfaces;
|
||||||
|
|
||||||
|
public interface WithSecuritySymbol {
|
||||||
|
String getSecuritySymbol();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ru.spcex.platform.classes.base.interfaces;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
public interface WithStartDt {
|
||||||
|
LocalDate getStartDate();
|
||||||
|
}
|
||||||
|
|
@ -3,7 +3,7 @@ package ru.spcex.platform.enumeration;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
||||||
public enum Market implements IEnumKey {
|
public enum Market implements IEnumKey {
|
||||||
MKRS("MKRS"); // Денежный рынок МКР
|
mkrs("MKRS");
|
||||||
|
|
||||||
private final String key;
|
private final String key;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@ package ru.spcex.platform.enumeration;
|
||||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||||
|
|
||||||
public enum SdfTable implements IEnumKey {
|
public enum SdfTable implements IEnumKey {
|
||||||
SDF_01("SDF_01");
|
SDF_01("SDF_01"), SDF_09("SDF_09"), SDF_16("SDF_16");
|
||||||
|
|
||||||
SdfTable(String key) {
|
SdfTable(String key) {
|
||||||
this.key = key;
|
this.key = key;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String key;
|
private final String key;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getKey() {
|
public String getKey() {
|
||||||
|
|
|
||||||
|
|
@ -164,6 +164,7 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
|
||||||
this.hzInstance = hzInstance;
|
this.hzInstance = hzInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String getMapName() {
|
public String getMapName() {
|
||||||
return mapName;
|
return mapName;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,10 @@ import java.util.Collection;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface Imdg<T extends SpcexObjectBase> {
|
public interface Imdg<T extends SpcexObjectBase> {
|
||||||
|
default String getMapName() {
|
||||||
|
throw new UnsupportedOperationException("not implemented name");
|
||||||
|
}
|
||||||
|
|
||||||
default void insert(T paramT) {
|
default void insert(T paramT) {
|
||||||
throw new UnsupportedOperationException("not implemented insert");
|
throw new UnsupportedOperationException("not implemented insert");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,9 @@ public class ImdgValidationContext<T> implements IValidatorContext {
|
||||||
return validatedObject;
|
return validatedObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* !!!не использовать один Enum в разных местах
|
||||||
|
*/
|
||||||
public void storeObject(Enum<?> storedObject, Object anyObject) {
|
public void storeObject(Enum<?> storedObject, Object anyObject) {
|
||||||
storedObjects.put(storedObject, anyObject);
|
storedObjects.put(storedObject, anyObject);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package ru.spcex.platform.imdg.validation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* !!!не использовать один Enum в разных местах - по энуму на один класс IValidationRule.
|
||||||
|
*/
|
||||||
|
public enum Stored {
|
||||||
|
/**
|
||||||
|
* если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById)
|
||||||
|
*/
|
||||||
|
PresentById
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
package ru.spcex.platform.imdg.validation.rule;
|
||||||
|
import ru.spcex.platform.classes.base.SpcexObjectBase;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithId;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
|
||||||
|
import ru.spcex.platform.imdg.validation.Stored;
|
||||||
|
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
||||||
|
import ru.spcex.platform.utils.enumeration.IEnumId;
|
||||||
|
import ru.spcex.platform.utils.validation.IValidationRule;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class PresentById implements IValidationRule<ImdgValidationContext<WithId>> {
|
||||||
|
private final String mapName;
|
||||||
|
private final IEnumId errorEnum;
|
||||||
|
private boolean storeEnabled = false;
|
||||||
|
|
||||||
|
public PresentById(String mapName, IEnumId errorEnum) {
|
||||||
|
this.mapName = mapName;
|
||||||
|
this.errorEnum = errorEnum;
|
||||||
|
}
|
||||||
|
public PresentById(String mapName, IEnumId errorEnum, Boolean storeEnabled) {
|
||||||
|
this.mapName = mapName;
|
||||||
|
this.errorEnum = errorEnum;
|
||||||
|
this.storeEnabled = storeEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<EnumMessage> validate(ImdgValidationContext<WithId> context) {
|
||||||
|
WithId actionById = context.getValidatedObject();
|
||||||
|
Imdg<SpcexObjectBase> targetMap = context.obtainMap(mapName, SpcexObjectBase.class);
|
||||||
|
SpcexObjectBase obj = targetMap.getSingleObjectByID(actionById.getId());
|
||||||
|
if (obj == null) {
|
||||||
|
return of(errorEnum, actionById.getId());
|
||||||
|
} else {
|
||||||
|
if (storeEnabled) {
|
||||||
|
context.storeObject(Stored.PresentById, obj);
|
||||||
|
}
|
||||||
|
return empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,10 +5,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithEndDt;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithStartDt;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|
||||||
public class MoneyMarketSecurityNewRequest {
|
public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt {
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
@JsonSerialize(using = LocalDateSerializer.class)
|
@JsonSerialize(using = LocalDateSerializer.class)
|
||||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithEndDt;
|
||||||
|
import ru.spcex.platform.classes.base.interfaces.WithStartDt;
|
||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|
||||||
public class MoneyMarketSecurityUpdateRequest {
|
public class MoneyMarketSecurityUpdateRequest implements WithStartDt, WithEndDt {
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
public Long id;
|
public Long id;
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow")
|
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow")
|
||||||
|
|
|
||||||
|
|
@ -3,20 +3,40 @@ package ru.spcex.clearing.platform.messaging.service;
|
||||||
public class RequestInfoUpdate {
|
public class RequestInfoUpdate {
|
||||||
private Long id;
|
private Long id;
|
||||||
private Status status;
|
private Status status;
|
||||||
|
private String message;
|
||||||
|
|
||||||
|
public RequestInfoUpdate() {}
|
||||||
|
|
||||||
|
public RequestInfoUpdate(Long id, Status status, Long errorId, String message) {
|
||||||
|
this.id = id;
|
||||||
|
this.status = status;
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setId(Long id) {
|
public RequestInfoUpdate setId(Long id) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Status getStatus() {
|
public Status getStatus() {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(Status status) {
|
public RequestInfoUpdate setStatus(Status status) {
|
||||||
this.status = status;
|
this.status = status;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RequestInfoUpdate setMessage(String message) {
|
||||||
|
this.message = message;
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
package ru.spcex.platform.utils.enumeration;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
public class SimpleMessageResolver implements IMessageResolver {
|
||||||
|
@Override
|
||||||
|
public String resolve(EnumMessage errorMessage) {
|
||||||
|
if (errorMessage == null) return "null";
|
||||||
|
return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs()));
|
||||||
|
}
|
||||||
|
}
|
||||||
1
pom.xml
1
pom.xml
|
|
@ -42,6 +42,7 @@
|
||||||
<folder_root_company-service>${folder_root_clearing}/clearing-parent/company-service</folder_root_company-service>
|
<folder_root_company-service>${folder_root_clearing}/clearing-parent/company-service</folder_root_company-service>
|
||||||
<folder_root_reports-service>${folder_root_clearing}/clearing-parent/reports-service</folder_root_reports-service>
|
<folder_root_reports-service>${folder_root_clearing}/clearing-parent/reports-service</folder_root_reports-service>
|
||||||
<folder_root_utility-service>${folder_root_clearing}/clearing-parent/utility-service</folder_root_utility-service>
|
<folder_root_utility-service>${folder_root_clearing}/clearing-parent/utility-service</folder_root_utility-service>
|
||||||
|
<folder_root_scheduler-service>${folder_root_clearing}/clearing-parent/scheduler-service</folder_root_scheduler-service>
|
||||||
<!-- IMDG -->
|
<!-- IMDG -->
|
||||||
<external_libraries.hazelcast.version>3.12.4</external_libraries.hazelcast.version>
|
<external_libraries.hazelcast.version>3.12.4</external_libraries.hazelcast.version>
|
||||||
<external_libraries.slf4j.version>1.7.33</external_libraries.slf4j.version>
|
<external_libraries.slf4j.version>1.7.33</external_libraries.slf4j.version>
|
||||||
|
|
|
||||||
|
|
@ -248,6 +248,25 @@
|
||||||
</fileSets>
|
</fileSets>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>copy-scheduler-service-bin</id>
|
||||||
|
<phase>prepare-package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>copy</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<fileSets>
|
||||||
|
<fileSet>
|
||||||
|
<sourceFile>${folder_root_scheduler-service}/target/scheduler-service.jar</sourceFile>
|
||||||
|
<destinationFile>${folder.clearing.distr.modules}/scheduler-service/scheduler-service.jar</destinationFile>
|
||||||
|
</fileSet>
|
||||||
|
<fileSet>
|
||||||
|
<sourceFile>${folder_root_scheduler-service}/src/main/resources/application.properties</sourceFile>
|
||||||
|
<destinationFile>${folder.clearing.distr.modules}/scheduler-service/application.properties</destinationFile>
|
||||||
|
</fileSet>
|
||||||
|
</fileSets>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
<execution>
|
<execution>
|
||||||
<id>copy-reports-service-bin</id>
|
<id>copy-reports-service-bin</id>
|
||||||
<phase>prepare-package</phase>
|
<phase>prepare-package</phase>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue