company-service http://jira.mfd.msk:8088/browse/CLS-347 ока только new заделал. Доделать update, transaction
This commit is contained in:
parent
5129a05bb8
commit
865af17158
4 changed files with 330 additions and 6 deletions
|
|
@ -9,19 +9,15 @@ import ru.clearing.classes.statics.data.liabilities.LiabilitiesClaimsAssets;
|
||||||
import ru.spcex.clearing.company.error.CompanyErrors;
|
import ru.spcex.clearing.company.error.CompanyErrors;
|
||||||
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.clearing.platform.messaging.domain.cud.account.AccountNewRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.InformationAccountNewRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountTerminationRequest;
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.sdf01.AccountTerminationRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
import ru.spcex.platform.enumeration.AccountType;
|
|
||||||
import ru.spcex.platform.enumeration.WorkflowStatus;
|
|
||||||
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 java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class AccountNotificationHelper {
|
public class AccountNotificationHelper {
|
||||||
|
|
@ -96,4 +92,11 @@ public class AccountNotificationHelper {
|
||||||
Long reqId = kafkaSender.sendRequestToQueue(Consts.INFORMATION_ACCOUNT_SYSTEM_NEW, r);
|
Long reqId = kafkaSender.sendRequestToQueue(Consts.INFORMATION_ACCOUNT_SYSTEM_NEW, r);
|
||||||
log.debug("Send request id={}", reqId);
|
log.debug("Send request id={}", reqId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void clientCodeNew(ClientCodeNewRequest clientCodeNewRequest) {
|
||||||
|
log.debug("Sending messages to account-service {} for company {}",
|
||||||
|
Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, clientCodeNewRequest.getCompanyId());
|
||||||
|
Long reqId = kafkaSender.sendRequestToQueue(Consts.DESTINATION_CLIENT_CODE_NEW_UM_COMPANY, clientCodeNewRequest);
|
||||||
|
log.debug("Send request id={}", reqId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -379,6 +379,104 @@ public class CompanyService extends QueueConsumer implements InitializingBean {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public synchronized Company createOrUpdateCompany(BaseRequest<CompanyNewRequest> companyNewRequestBaseRequest, Long existCompanyId) throws ValidationException {
|
||||||
|
CompanyNewRequest req = companyNewRequestBaseRequest.getRequestPayload();
|
||||||
|
log.debug("company new or update, request {}, existCOmpanyId={}", companyNewRequestBaseRequest.getId(), existCompanyId);
|
||||||
|
{ // Валидация
|
||||||
|
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(companyNewRequestBaseRequest);
|
||||||
|
if (requestInfoUpdate != null)
|
||||||
|
throw new ValidationException(CompanyErrors.GeneralError, requestInfoUpdate.getMessage());
|
||||||
|
// requestInfoUpdate = validationHelper.validateTillFirstError(companyNewRequestBaseRequest, companyNewRequestValidator);
|
||||||
|
// if (requestInfoUpdate != null) throw new ValidationException(CompanyErrors.GeneralError, requestInfoUpdate.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
Company company = null;
|
||||||
|
if (existCompanyId != null) {
|
||||||
|
company = companyIMap.getSingleObjectByID(existCompanyId);
|
||||||
|
if (company == null) {
|
||||||
|
throw new ValidationException(CompanyErrors.CompanyNotFound, String.valueOf(existCompanyId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (company == null) {
|
||||||
|
// #createCompany
|
||||||
|
company = new Company();
|
||||||
|
company.setId(idSequence.nextId());
|
||||||
|
Instant now = Instant.now();
|
||||||
|
company.setCreated(now);
|
||||||
|
company.setUpdated(now);
|
||||||
|
log.debug("Create new company {}", company.getId());
|
||||||
|
|
||||||
|
company.setShortName(req.getShortName());
|
||||||
|
company.setFullName(req.getFullName());
|
||||||
|
|
||||||
|
ImdgTransaction transaction = imdgProvider.newTransaction();
|
||||||
|
transaction.beginTransaction();
|
||||||
|
boolean txOk = false;
|
||||||
|
try {
|
||||||
|
if (req.getCompanySymbol() != null) {
|
||||||
|
CompanySymbols newSymbol = companySymbolService.createCompanySymbol(transaction, company.getId(), req.getCompanySymbol(), req.getCompanySymbolValue());
|
||||||
|
updateCompanyBySymbol(company, newSymbol, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
company.setWorkflowStatus(req.getWorkflowStatus());
|
||||||
|
fillNewCompanyInfo(company, req);
|
||||||
|
|
||||||
|
Imdg<Company> companyMap = transaction.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
|
companyMap.insert(company);
|
||||||
|
log.debug("company-new request processed, BaseRequest.id = {}, company.id={}",
|
||||||
|
companyNewRequestBaseRequest.getId(), company.getId());
|
||||||
|
txOk = true;
|
||||||
|
} finally {
|
||||||
|
if (txOk)
|
||||||
|
transaction.commitTransaction();
|
||||||
|
else
|
||||||
|
transaction.rollbackTransaction();
|
||||||
|
}
|
||||||
|
accountNotification.makeInfoAccount(company.getId());
|
||||||
|
} else {
|
||||||
|
log.debug("Update exist company {}", company.getId());
|
||||||
|
company.setUpdated(Instant.now());
|
||||||
|
// #updateCompany
|
||||||
|
|
||||||
|
company.setUpdated(Instant.now());
|
||||||
|
company.setShortName(req.getShortName());
|
||||||
|
company.setFullName(req.getFullName());
|
||||||
|
|
||||||
|
if (req.getCompanySymbol() != null || req.getCompanySymbolValue() != null) {
|
||||||
|
log.trace("Request field CompanySymbol, CompanySymbolValue ignore for update company request.");
|
||||||
|
}
|
||||||
|
// CompanySymbols не обновляем
|
||||||
|
ImdgTransaction transaction = imdgProvider.newTransaction();
|
||||||
|
transaction.beginTransaction();
|
||||||
|
boolean txOk = false;
|
||||||
|
try {
|
||||||
|
String prevStatus = company.getWorkflowStatus();
|
||||||
|
if (req.getWorkflowStatus() != null) {
|
||||||
|
company.setWorkflowStatus(req.getWorkflowStatus());
|
||||||
|
if (!Objects.equals(prevStatus, company.getWorkflowStatus())) {
|
||||||
|
relationService.onChangeWorkflowStatus(transaction, company, prevStatus, company.getWorkflowStatus());
|
||||||
|
} else {
|
||||||
|
log.trace("Status was not changed");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.trace("Null new WorkflowStatus");
|
||||||
|
}
|
||||||
|
Imdg<Company> companyMap = transaction.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
|
companyMap.update(company);
|
||||||
|
txOk = true;
|
||||||
|
} finally {
|
||||||
|
if (txOk)
|
||||||
|
transaction.commitTransaction();
|
||||||
|
else
|
||||||
|
transaction.rollbackTransaction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return company;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Блокировка компании после блокировки счетов
|
* Блокировка компании после блокировки счетов
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,223 @@
|
||||||
|
package ru.spcex.clearing.company.service;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.kafka.clients.consumer.Consumer;
|
||||||
|
import org.apache.kafka.clients.producer.Producer;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
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.company.Company;
|
||||||
|
import ru.clearing.classes.statics.data.company.CompanySymbols;
|
||||||
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.account.ClientCodeNewRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.company.*;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||||
|
import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate;
|
||||||
|
import ru.spcex.clearing.util.security.UserRoleVerification;
|
||||||
|
import ru.spcex.clearing.util.services.RequestHelper;
|
||||||
|
import ru.spcex.clearing.validation.common.ValidationHelper;
|
||||||
|
import ru.spcex.platform.enumeration.CompanySymbol;
|
||||||
|
import ru.spcex.platform.enumeration.UserRole;
|
||||||
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
import ru.spcex.platform.utils.error.ValidationException;
|
||||||
|
import ru.spcex.platform.utils.log.ExceptionUtils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Обрабатывает MultiCompanyRequest и распределяет сложный объект по...
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class MultiCompanyService
|
||||||
|
extends QueueConsumer implements InitializingBean {
|
||||||
|
|
||||||
|
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||||
|
private final RequestHelper requestHelper;
|
||||||
|
|
||||||
|
protected UserRoleVerification userRoleVerification;
|
||||||
|
private final ValidationHelper validationHelper;
|
||||||
|
|
||||||
|
final CompanyService companyService;
|
||||||
|
final CompanyInfoService companyInfoService;
|
||||||
|
final ProfileDocumentService profileDocumentService;
|
||||||
|
final CompanySymbolService companySymbolService;
|
||||||
|
final ContactService contactService;
|
||||||
|
final AccountNotificationHelper accountNotification;
|
||||||
|
final RelationService relationService;
|
||||||
|
|
||||||
|
final ImdgProvider imdgProvider;
|
||||||
|
final Imdg<Company> companyIMap;
|
||||||
|
final Imdg<CompanySymbols> companySymbolsImdg;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public MultiCompanyService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
||||||
|
ImdgProvider imdgProvider,
|
||||||
|
RequestHelper requestHelper,
|
||||||
|
|
||||||
|
CompanyService companyService,
|
||||||
|
CompanyInfoService companyInfoService,
|
||||||
|
ProfileDocumentService profileDocumentService,
|
||||||
|
CompanySymbolService companySymbolService,
|
||||||
|
ContactService contactService,
|
||||||
|
AccountNotificationHelper accountNotification,
|
||||||
|
RelationService relationService,
|
||||||
|
ValidationHelper validationHelper
|
||||||
|
) {
|
||||||
|
super(kafkaQueue, kafkaProducer);
|
||||||
|
this.imdgProvider = imdgProvider;
|
||||||
|
this.requestHelper = requestHelper.setLogger(log);
|
||||||
|
|
||||||
|
// this.idSequence = imdgProvider.getImdgIdGenerator();
|
||||||
|
this.userRoleVerification = userRoleVerification;
|
||||||
|
userRoleVerification.setRoleForVerification(UserRole.Admin);
|
||||||
|
this.validationHelper = validationHelper;
|
||||||
|
this.companyService = companyService;
|
||||||
|
this.companyInfoService = companyInfoService;
|
||||||
|
this.profileDocumentService = profileDocumentService;
|
||||||
|
this.companySymbolService = companySymbolService;
|
||||||
|
this.contactService = contactService;
|
||||||
|
this.accountNotification = accountNotification;
|
||||||
|
this.relationService = relationService;
|
||||||
|
|
||||||
|
companyIMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
|
||||||
|
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterPropertiesSet() {
|
||||||
|
callback(MultiCompanyRequest.class)
|
||||||
|
.setFunction(request -> requestHelper.requestFunction(this::processMultiRequest, request))
|
||||||
|
.forDestination(Consts.DESTINATION_COMPANY_MULTIREQUEST, callbacks::put);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
private synchronized RequestInfoUpdate processMultiRequest(BaseRequest<MultiCompanyRequest> baseRequest) {
|
||||||
|
MultiCompanyRequest req = baseRequest.getRequestPayload();
|
||||||
|
log.debug("company-batch-new request received, BaseRequest.id = {}", baseRequest.getId());
|
||||||
|
{ // Валидация
|
||||||
|
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(baseRequest);
|
||||||
|
if (requestInfoUpdate != null) return requestInfoUpdate;
|
||||||
|
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
todo:
|
||||||
|
1) добавить апдейт кейсы
|
||||||
|
2) сделать транзакции.
|
||||||
|
|
||||||
|
*/
|
||||||
|
Long companyId = null;
|
||||||
|
boolean txOk = false;
|
||||||
|
synchronized (companyService) {
|
||||||
|
try {
|
||||||
|
companyId = getCompanyIdForCompanySymbols(req.getUuid(), req.getCompany());
|
||||||
|
log.debug("For request {} (uuid {}) company {}.", baseRequest.getId(), req.getUuid(), companyId == null ? "not found" : ("found, id=" + companyId));
|
||||||
|
|
||||||
|
RequestInfoUpdate replyI;
|
||||||
|
Company company = companyService.createOrUpdateCompany(wrapRequest(baseRequest, req.getCompany()), companyId);
|
||||||
|
companyId = company.getId();
|
||||||
|
log.debug("The companyId={}", companyId);
|
||||||
|
fillCompanyId(req, companyId);
|
||||||
|
|
||||||
|
//todo update case:
|
||||||
|
replyI = companyInfoService.companyInfoUpdate(wrapRequest(baseRequest, req.getCompanyInfo()));
|
||||||
|
for (ProfileDocumentNewRequest partRequest : req.getProfileDocuments()) {
|
||||||
|
replyI = profileDocumentService.profileDocumentNew(wrapRequest(baseRequest, partRequest));
|
||||||
|
}
|
||||||
|
for (CompanySymbolNewRequest partRequest : req.getCompanySymbols()) {
|
||||||
|
replyI = companySymbolService.companySymbolNew(wrapRequest(baseRequest, partRequest));
|
||||||
|
}
|
||||||
|
for (ContactNewRequest partRequest : req.getContacts()) {
|
||||||
|
replyI = contactService.contactNew(wrapRequest(baseRequest, partRequest));
|
||||||
|
}
|
||||||
|
txOk = true;
|
||||||
|
} catch (ValidationException vex) {
|
||||||
|
log.error("For companyId={} error: {}", companyId, ExceptionUtils.getStackTrace(vex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (txOk) {
|
||||||
|
log.debug("Create or update sendNewClientCode for company {}", companyId);
|
||||||
|
for (ClientCodeNewRequest partRequest : req.getClientCodes()) {
|
||||||
|
accountNotification.clientCodeNew(partRequest); // Consts.DESTINATION_CLIENT_CODE_NEW Consts.DESTINATION_CLIENT_CODE_UPDATE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr) {
|
||||||
|
CompanySymbols companySymbol = null;
|
||||||
|
if (StringUtils.isNotEmpty(uuid)) {
|
||||||
|
log.trace("Search company by companySymbol uuid={}", uuid);
|
||||||
|
Collection<CompanySymbols> companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues(
|
||||||
|
Map.of(
|
||||||
|
"companySymbol", CompanySymbol.UUID.getKey(),
|
||||||
|
"companySymbolValue", uuid
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if (!companySymbolsFromImdg.isEmpty()) {
|
||||||
|
companySymbol = companySymbolsFromImdg.iterator().next();
|
||||||
|
if (companySymbolsFromImdg.size() > 1) {
|
||||||
|
log.warn("For UUID found > 1 company_symbols, use first (id = {})", companySymbol.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (companySymbol == null && StringUtils.isNotEmpty(cnr.getCompanySymbol())) {
|
||||||
|
log.trace("Search company by companySymbol {}={}", cnr.getCompanySymbol(), cnr.getCompanySymbolValue());
|
||||||
|
Collection<CompanySymbols> companySymbolsFromImdg = companySymbolsImdg.getCollectionObjectsByFieldValues(
|
||||||
|
Map.of(
|
||||||
|
"companySymbol", cnr.getCompanySymbol(),
|
||||||
|
"companySymbolValue", cnr.getCompanySymbolValue()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
if (!companySymbolsFromImdg.isEmpty()) {
|
||||||
|
companySymbol = companySymbolsFromImdg.iterator().next();
|
||||||
|
if (companySymbolsFromImdg.size() > 1) {
|
||||||
|
log.warn("For {} found > 1 company_symbols, use first (id = {})", cnr.getCompanySymbol(), cnr.getCompanySymbolValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (companySymbol != null)
|
||||||
|
return companySymbol.getCompanyId();
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T> BaseRequest<T> wrapRequest(BaseRequest<?> template, T payload) {
|
||||||
|
BaseRequest<T> r = new BaseRequest<>();
|
||||||
|
r.setId(template.getId());
|
||||||
|
r.setActionType(template.getActionType()); // todo?
|
||||||
|
r.setUserId(template.getUserId());
|
||||||
|
r.setCorrelationId(template.getCorrelationId());
|
||||||
|
r.setRequestPayload(payload);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fillCompanyId(MultiCompanyRequest req, Long companyId) {
|
||||||
|
req.getCompany().setId(companyId);
|
||||||
|
req.getCompanyInfo().setId(companyId);
|
||||||
|
if (req.getCompanySymbols() == null) req.setCompanySymbols(new ArrayList<>());
|
||||||
|
if (req.getClientCodes() == null) req.setClientCodes(new ArrayList<>());
|
||||||
|
if (req.getProfileDocuments() == null) req.setProfileDocuments(new ArrayList<>());
|
||||||
|
if (req.getContacts() == null) req.setContacts(new ArrayList<>());
|
||||||
|
for (CompanySymbolNewRequest cs : req.getCompanySymbols()) {
|
||||||
|
cs.setCompanyId(companyId);
|
||||||
|
}
|
||||||
|
for (ClientCodeNewRequest cc : req.getClientCodes()) {
|
||||||
|
cc.setCompanyId(companyId);
|
||||||
|
}
|
||||||
|
for (ProfileDocumentNewRequest pd : req.getProfileDocuments()) {
|
||||||
|
pd.setCompanyId(companyId);
|
||||||
|
}
|
||||||
|
for (ContactNewRequest c : req.getContacts()) {
|
||||||
|
c.setCompanyId(companyId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -94,7 +94,7 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private RequestInfoUpdate profileDocumentNew(BaseRequest<ProfileDocumentNewRequest> profileDocumentNewRequestBaseRequest) {
|
protected RequestInfoUpdate profileDocumentNew(BaseRequest<ProfileDocumentNewRequest> profileDocumentNewRequestBaseRequest) {
|
||||||
log.trace("Start processing ProfileDocumentNewRequest!");
|
log.trace("Start processing ProfileDocumentNewRequest!");
|
||||||
|
|
||||||
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(profileDocumentNewRequestBaseRequest);
|
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(profileDocumentNewRequestBaseRequest);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue