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.cud.securitites.MoneyMarketSecurityNewRequest;
|
||||
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.text.TextUtil;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class MoneyMarketSecurityNewAction implements IAction<MoneyMarketSecurityNewRequest> {
|
||||
public class MoneyMarketSecurityNewAction implements IAction<MoneyMarketSecurityNewRequest>, WithSecuritySymbol {
|
||||
@ApiModelProperty(value = "Дата начала действия", example = "2022-01-20")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow")
|
||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||
|
|
@ -48,9 +51,24 @@ public class MoneyMarketSecurityNewAction implements IAction<MoneyMarketSecurity
|
|||
|
||||
@Override
|
||||
public Collection<EnumMessage> validate() {
|
||||
List<EnumMessage> errors = new ArrayList<>();
|
||||
if (this.startDate == null)
|
||||
return List.of(new EnumMessage(BackEndError.ValidationError, "startDate"));
|
||||
else return Collections.emptyList();
|
||||
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 (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
|
||||
|
|
|
|||
|
|
@ -5,12 +5,19 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
|||
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
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.cud.securitites.MoneyMarketSecurityUpdateRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||
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.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public class MoneyMarketSecurityUpdateAction implements IAction<MoneyMarketSecurityUpdateRequest>, WithId {
|
||||
@ApiModelProperty(hidden = true)
|
||||
|
|
@ -56,6 +63,26 @@ public class MoneyMarketSecurityUpdateAction implements IAction<MoneyMarketSecur
|
|||
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)
|
||||
@Override
|
||||
public ActionType getActionType() {
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ public class RequestStatusController {
|
|||
}
|
||||
RequestInfoResponse response = new RequestInfoResponse();
|
||||
response.setStatus(singleObjectByID.getStatus());
|
||||
response.setMessage(singleObjectByID.getMessage());
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import org.springframework.stereotype.Component;
|
|||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalTime;
|
||||
import java.time.ZoneId;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
|
|
@ -17,6 +18,7 @@ import java.util.stream.Collectors;
|
|||
public class GetResponseFactory {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final MetaServer meta;
|
||||
private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
|
||||
|
||||
@Autowired
|
||||
public GetResponseFactory(MetaServer meta) {
|
||||
|
|
@ -71,6 +73,8 @@ public class GetResponseFactory {
|
|||
data = sdf.format(value);
|
||||
} else if (value instanceof Instant) {
|
||||
data = dateTimeFormatter.format((Instant) value);
|
||||
} else if (value instanceof LocalTime) {
|
||||
data = timeFormatter.format((LocalTime) value);
|
||||
} else {
|
||||
data = value;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ public class RequestInfoAccepter extends QueueConsumer implements InitializingBe
|
|||
return;
|
||||
}
|
||||
requestInfo.setStatus(statusInfo.getStatus());
|
||||
requestInfo.setMessage(statusInfo.getMessage());
|
||||
requestInfoImdg.update(requestInfo);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ import org.springframework.stereotype.Component;
|
|||
import ru.clearing.platform.dictionary.AbstractDictionary;
|
||||
import ru.spcex.clearing.backendapi.controller.request.cud.schedule.LauncherNew;
|
||||
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.PresentById;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||
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.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.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
|
@ -35,10 +37,6 @@ public class ActionValidationProvider implements InitializingBean {
|
|||
|
||||
@Override
|
||||
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_DELETE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity));
|
||||
validators.put(Consts.DESTINATION_RELATION_UPDATE, idPresent(IMDGDistributedNames.Map_Relation));
|
||||
|
|
@ -53,21 +51,35 @@ public class ActionValidationProvider implements InitializingBean {
|
|||
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) {
|
||||
Imdg<SpcexObjectBase> targetMap = getImdg(mapName, SpcexObjectBase.class);
|
||||
return iAction -> {
|
||||
ImdgValidationContext<T> ctx = new ImdgValidationContext<>();
|
||||
ctx.setValidatedObject(iAction);
|
||||
ctx.addImdg(mapName, targetMap);
|
||||
ValidatorImpl<ImdgValidationContext<T>> iValidator = new ValidatorImpl<>(ctx);
|
||||
iValidator.addRule(new PresentById(getImdg(mapName, SpcexObjectBase.class)));
|
||||
iValidator.addRule(new PresentById(mapName, BackEndError.ResourceNotFound));
|
||||
return iValidator;
|
||||
};
|
||||
}
|
||||
|
||||
private Function<LauncherNew, IValidator> taskRunnerNew() {
|
||||
Imdg<AbstractDictionary> tskDctnrImdg = getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class);
|
||||
return taskRunnerNew -> {
|
||||
ImdgValidationContext<LauncherNew> ctx = new ImdgValidationContext<>();
|
||||
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);
|
||||
iValidator.addRule(LauncherNewValidationRule.knownTaskDictionary);
|
||||
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 ru.spcex.clearing.balance.service.AbstractExecutor;
|
||||
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.enumeration.SdfTable;
|
||||
|
||||
|
|
@ -14,9 +16,13 @@ import java.util.Map;
|
|||
public class SdfExecutorsConfig {
|
||||
|
||||
@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<>();
|
||||
executors.put(SdfTable.SDF_01, sdf01Executor);
|
||||
executors.put(SdfTable.SDF_09, sdf09Executor);
|
||||
executors.put(SdfTable.SDF_16, sdf16Executor);
|
||||
return executors;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ public class ValidationConfig {
|
|||
Consumer<String> addImdg = (s) -> context.addImdg(s, getImdg(s));
|
||||
addImdg.accept(IMDGDistributedNames.Map_Account);
|
||||
addImdg.accept(IMDGDistributedNames.Map_Company);
|
||||
addImdg.accept(IMDGDistributedNames.Map_CompanySymbols);
|
||||
return new ValidatorImpl<>(context,
|
||||
Sdf16ValidationRule.CompanyPresent,
|
||||
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.validation.IValidator;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Instant;
|
||||
import java.time.LocalDate;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
|
@ -201,15 +200,15 @@ public class Sdf16Executor extends AbstractExecutor<SDf16> {
|
|||
successSdf.setGenerationId(generationIdForGroup);
|
||||
successSdf.setGenerationTime(Instant.now());
|
||||
successSdf.setInSDf16Id(sdf.getId());
|
||||
successSdf.setResult(BigDecimal.ZERO);
|
||||
successSdf.setResult(0);
|
||||
return successSdf;
|
||||
}
|
||||
|
||||
private BigDecimal obtainResultNum(EnumMessage error){
|
||||
private Integer obtainResultNum(EnumMessage error){
|
||||
if (BalanceError.AccountNotPresent.equalsById(error.getSubject().getId()))
|
||||
return BigDecimal.ONE;
|
||||
return 1;
|
||||
if (BalanceError.BalanceNotEnough.equalsById(error.getSubject().getId()))
|
||||
return BigDecimal.ONE;
|
||||
return BigDecimal.valueOf(9);
|
||||
return 1;
|
||||
return 9;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
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.platform.messaging.domain.BaseRequest;
|
||||
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 java.util.Collection;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
|
@ -33,7 +36,7 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
|||
|
||||
private final ImdgProvider imdgProvider;
|
||||
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;
|
||||
|
||||
@Autowired
|
||||
|
|
@ -43,9 +46,12 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
|||
@Qualifier("sdfExecutors") Map<SdfTable, AbstractExecutor<? extends WithAccount>> executorsMap) {
|
||||
super(kafkaQueue);
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.sdf01Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf01, SDf01.class);
|
||||
this.sdfImdgs = new EnumMap<>(SdfTable.class);
|
||||
this.kafkaReqProducer = kafkaReqProducer;
|
||||
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
|
||||
|
|
@ -61,13 +67,14 @@ public class StatementService extends QueueConsumer implements InitializingBean
|
|||
Collection<? extends WithAccount> sdfGroup;
|
||||
SdfTable table = statementRequest.getTable();
|
||||
//map = getMapByTable(table)
|
||||
Imdg<? extends WithAccount> sdfImdg = sdfImdgs.get(table);
|
||||
if (statementRequest.getAccountCreationResults().size() == 0) {
|
||||
sdfGroup = sdf01Imdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId()));
|
||||
sdfGroup = sdfImdg.getCollectionObjectsByFieldValues(Map.of("generationId", statementRequest.getGroupId()));
|
||||
} else {
|
||||
sdfGroup = statementRequest.getAccountCreationResults()
|
||||
.stream()
|
||||
.filter(part -> part.getErrorCode() == null) //fixme эти случае должны попадать в ошибочный sdf02
|
||||
.map(part -> sdf01Imdg.getSingleObjectByID(part.getSdfId()))
|
||||
.map(part -> sdfImdg.getSingleObjectByID(part.getSdfId()))
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
// sdf01Group = sdf01Group
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ public class SDf17 extends SpcexObjectBase implements WithAccount {
|
|||
private BigDecimal BIC;
|
||||
private String SPEC;
|
||||
private BigDecimal number;
|
||||
private BigDecimal result;
|
||||
private Integer result;
|
||||
private Instant generationTime;
|
||||
private Long generationId;
|
||||
private Long inSDf16Id;
|
||||
|
|
@ -93,11 +93,11 @@ public class SDf17 extends SpcexObjectBase implements WithAccount {
|
|||
this.number = value;
|
||||
}
|
||||
|
||||
public BigDecimal getResult() {
|
||||
public Integer getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setResult(BigDecimal value) {
|
||||
public void setResult(Integer value) {
|
||||
this.result = value;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,16 +3,12 @@ package ru.spcex.clearing.config;
|
|||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import ru.spcex.platform.utils.enumeration.IMessageResolver;
|
||||
|
||||
import java.util.Arrays;
|
||||
import ru.spcex.platform.utils.enumeration.SimpleMessageResolver;
|
||||
|
||||
@Configuration
|
||||
public class MessageResolverConfig {
|
||||
@Bean
|
||||
public IMessageResolver messageResolver() {
|
||||
return errorMessage -> {
|
||||
if (errorMessage == null) return "null";
|
||||
return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs()));
|
||||
};
|
||||
return new SimpleMessageResolver();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,9 +34,9 @@ public class S_DF17_Converter extends DFConverter<SDf17> {
|
|||
dbfFields.add(new DBFField("TYPE", DBFDataType.CHARACTER, 1));
|
||||
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("_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("RESULT", DBFDataType.CHARACTER, 3));
|
||||
dbfFields.add(new DBFField("RESULT", DBFDataType.NUMERIC, 1));
|
||||
return dbfFields.toArray(DBFField[]::new);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,9 @@ public class DbfImportKafkaMessenger implements InitializingBean {
|
|||
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
@ -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.setGroupId(groupId);
|
||||
statementRequest.setTable(SdfTable.SDF_01);
|
||||
statementRequest.setTable(table);
|
||||
kafka.get().sendRequestToQueue(Consts.STATEMENT_PROCESS, statementRequest);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,18 +42,22 @@ public class DBFImporterService {
|
|||
}
|
||||
|
||||
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(() -> {
|
||||
Map<ETable, List<File>> newFiles = null;
|
||||
try {
|
||||
log.info("checking new files... {}", specificTable != null ? specificTable.name() : "");
|
||||
log.trace("checking new files... {}", specificTable != null ? specificTable.name() : "");
|
||||
newFiles = getFiles(specificTable);
|
||||
if (newFiles.size() > 0 && log.isDebugEnabled()) {
|
||||
log.debug("following files will be processed {}", forLogging(newFiles));
|
||||
} else if (newFiles.size() > 0) {
|
||||
log.info("following files will be processed {}", forLoggingSizeOnly(newFiles));
|
||||
} else {
|
||||
log.info("no files were found");
|
||||
log.trace("no files were found");
|
||||
}
|
||||
for (Map.Entry<ETable, List<File>> newFilesEntry : newFiles.entrySet()) {
|
||||
ETable currTable = newFilesEntry.getKey();
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<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>
|
||||
</appender>
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ public class SDf17MapStore extends TemplateMapStore<SDf17> {
|
|||
object.setBIC(resultSet.getObject("_B_I_C", BigDecimal.class));
|
||||
object.setSPEC(resultSet.getObject("_S_P_E_C", String.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.setGenerationId(resultSet.getObject("GENERATION_ID", Long.class));
|
||||
object.setInSDf16Id(resultSet.getObject("IN_S_DF16_ID", Long.class));
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
</encoder>
|
||||
</appender>
|
||||
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||
<file>./logs/utility-service.log</file>
|
||||
<file>./logs/scheduler-service.log</file>
|
||||
<encoder>
|
||||
<!-- |%X{ru.nbch.scoring.web.logging.mdc_key}-->
|
||||
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{0}:%msg%n</Pattern>
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
</encoder>
|
||||
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
|
||||
<fileNamePattern>
|
||||
./logs/utility-service.%i.log
|
||||
./logs/scheduler-service.%i.log
|
||||
</fileNamePattern>
|
||||
<minIndex>1</minIndex>
|
||||
<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.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import ru.clearing.classes.statics.data.misc.Listing;
|
||||
import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity;
|
||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||
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.service.QueueConsumer;
|
||||
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.securities.component.ListingBuilder;
|
||||
import ru.spcex.clearing.securities.validation.ValidationProvider;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgId;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
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.time.Instant;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service
|
||||
public class MoneyMarketSecurityService extends QueueConsumer implements InitializingBean {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final Imdg<MoneyMarketSecurity> moneyMarketSecurityMap;
|
||||
private final Imdg<Listing> listingImdg;
|
||||
private final ImdgProvider imdgProvider;
|
||||
private final ImdgId idGenerator;
|
||||
private final ValidationProvider validation;
|
||||
private final IMessageResolver messageResolver;
|
||||
private final ListingBuilder listingBuilder = new ListingBuilder();
|
||||
|
||||
@Autowired
|
||||
public MoneyMarketSecurityService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
||||
ImdgProvider imdgProvider) {
|
||||
public MoneyMarketSecurityService(Consumer<String, Object> kafkaQueue,
|
||||
Producer<String, Object> kafkaProducer,
|
||||
ImdgProvider imdgProvider,
|
||||
ValidationProvider validation,
|
||||
IMessageResolver messageResolver) {
|
||||
super(kafkaQueue, kafkaProducer);
|
||||
this.validation = validation;
|
||||
this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class);
|
||||
this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class);
|
||||
this.imdgProvider = imdgProvider;
|
||||
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
||||
this.messageResolver = messageResolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -59,23 +79,32 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
|||
@Override
|
||||
public void afterPropertiesSet() {
|
||||
callback(MoneyMarketSecurityNewRequest.class)
|
||||
.setConsumer(this::newMoneyMarket)
|
||||
.setFunction(this::newMoneyMarket)
|
||||
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_NEW, callbacks::put);
|
||||
callback(MoneyMarketSecurityUpdateRequest.class)
|
||||
.setConsumer(this::updateMoneyMarket)
|
||||
.setFunction(this::updateMoneyMarket)
|
||||
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, callbacks::put);
|
||||
callback(CommonDeleteRequest.class)
|
||||
.setConsumer(this::deleteMoneyMarket)
|
||||
.setFunction(this::deleteMoneyMarket)
|
||||
.forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, callbacks::put);
|
||||
imdgProvider.waitAvailable();
|
||||
init();
|
||||
}
|
||||
|
||||
private void newMoneyMarket(BaseRequest<MoneyMarketSecurityNewRequest> userRequest) {
|
||||
// Imdg<RequestInfo> requestInfoImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class);
|
||||
// RequestInfo reqInfo = requestInfoImdg.getSingleObjectByID(userRequest.getId());
|
||||
private RequestInfoUpdate newMoneyMarket(BaseRequest<MoneyMarketSecurityNewRequest> userRequest) {
|
||||
ImdgTransaction transaction = imdgProvider.newTransaction();
|
||||
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");
|
||||
MoneyMarketSecurity mms = new MoneyMarketSecurity();
|
||||
mms.setId(idGenerator.nextId());
|
||||
|
|
@ -92,10 +121,11 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
|||
try {
|
||||
transaction.beginTransaction();
|
||||
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);
|
||||
// RequestInfo.update(reqInfo, Status.Success, "success");
|
||||
Listing listing = listingBuilder.byNewMms(mms, req);
|
||||
listingMap.insert(listing);
|
||||
//и сохраняем обновленный
|
||||
// reqInfoMap.insert(reqInfo);
|
||||
transaction.commitTransaction();
|
||||
|
|
@ -105,13 +135,25 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial
|
|||
// requestInfoImdg.insert(reqInfo);
|
||||
}
|
||||
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();
|
||||
log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId());
|
||||
MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId());
|
||||
mms.setUpdated(Instant.now());
|
||||
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);
|
||||
}
|
||||
MoneyMarketSecurity mms = validator.getStored(Stored.PresentById);
|
||||
Instant updateTime = Instant.now();
|
||||
mms.setUpdated(updateTime);
|
||||
mms.setStartDate(req.getStartDate());
|
||||
mms.setEndDate(req.getEndDate());
|
||||
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.setFullName(req.getFullName());
|
||||
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();
|
||||
log.debug("CommonDeleteRequest received id = {}", req.getId());
|
||||
MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId());
|
||||
moneyMarketSecurityMap.delete(mms);
|
||||
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);
|
||||
}
|
||||
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.service.cud.MoneyMarketSecurityService;
|
||||
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.utils.enumeration.SimpleMessageResolver;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
|
@ -84,7 +86,8 @@ public class MoneyMarketSecurityServiceDisabled {
|
|||
|
||||
private void startService() throws InterruptedException {
|
||||
MoneyMarketSecurityService keyRateService =
|
||||
new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService);
|
||||
new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService,
|
||||
new ValidationProvider(hazelcastService), new SimpleMessageResolver());
|
||||
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;
|
||||
|
||||
public enum Market implements IEnumKey {
|
||||
MKRS("MKRS"); // Денежный рынок МКР
|
||||
mkrs("MKRS");
|
||||
|
||||
private final String key;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@ package ru.spcex.platform.enumeration;
|
|||
import ru.spcex.platform.utils.enumeration.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) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
private String key;
|
||||
private final String key;
|
||||
|
||||
@Override
|
||||
public String getKey() {
|
||||
|
|
|
|||
|
|
@ -164,6 +164,7 @@ public class ImdgHazelcast<T extends SpcexObjectBase> implements Imdg<T> {
|
|||
this.hzInstance = hzInstance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMapName() {
|
||||
return mapName;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,10 @@ import java.util.Collection;
|
|||
import java.util.Map;
|
||||
|
||||
public interface Imdg<T extends SpcexObjectBase> {
|
||||
default String getMapName() {
|
||||
throw new UnsupportedOperationException("not implemented name");
|
||||
}
|
||||
|
||||
default void insert(T paramT) {
|
||||
throw new UnsupportedOperationException("not implemented insert");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,9 @@ public class ImdgValidationContext<T> implements IValidatorContext {
|
|||
return validatedObject;
|
||||
}
|
||||
|
||||
/**
|
||||
* !!!не использовать один Enum в разных местах
|
||||
*/
|
||||
public void storeObject(Enum<?> storedObject, Object 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 ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer;
|
||||
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;
|
||||
|
||||
public class MoneyMarketSecurityNewRequest {
|
||||
public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt {
|
||||
@JsonProperty
|
||||
@JsonSerialize(using = LocalDateSerializer.class)
|
||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||
|
|
|
|||
|
|
@ -6,10 +6,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
|||
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.serialize.LocalDateSerializer;
|
||||
import ru.spcex.platform.classes.base.interfaces.WithEndDt;
|
||||
import ru.spcex.platform.classes.base.interfaces.WithStartDt;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
public class MoneyMarketSecurityUpdateRequest {
|
||||
public class MoneyMarketSecurityUpdateRequest implements WithStartDt, WithEndDt {
|
||||
@JsonProperty
|
||||
public Long id;
|
||||
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow")
|
||||
|
|
|
|||
|
|
@ -3,20 +3,40 @@ package ru.spcex.clearing.platform.messaging.service;
|
|||
public class RequestInfoUpdate {
|
||||
private Long id;
|
||||
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() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Long id) {
|
||||
public RequestInfoUpdate setId(Long id) {
|
||||
this.id = id;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Status getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Status status) {
|
||||
public RequestInfoUpdate setStatus(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_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_scheduler-service>${folder_root_clearing}/clearing-parent/scheduler-service</folder_root_scheduler-service>
|
||||
<!-- IMDG -->
|
||||
<external_libraries.hazelcast.version>3.12.4</external_libraries.hazelcast.version>
|
||||
<external_libraries.slf4j.version>1.7.33</external_libraries.slf4j.version>
|
||||
|
|
|
|||
|
|
@ -248,6 +248,25 @@
|
|||
</fileSets>
|
||||
</configuration>
|
||||
</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>
|
||||
<id>copy-reports-service-bin</id>
|
||||
<phase>prepare-package</phase>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue