company-service http://jira.mfd.msk:8088/browse/CLS-347 MultiCompanyService добавил обновления

This commit is contained in:
AKurakin 2023-06-09 13:44:10 +03:00
parent 79c56c4571
commit 5cffd47463
4 changed files with 336 additions and 19 deletions

View file

@ -10,7 +10,10 @@ 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.clearing.classes.statics.data.profile.Contact;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
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;
@ -21,7 +24,6 @@ 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;
@ -29,6 +31,7 @@ import ru.spcex.platform.utils.log.ExceptionUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
@ -55,6 +58,8 @@ public class MultiCompanyService
final ImdgProvider imdgProvider;
final Imdg<Company> companyIMap;
final Imdg<CompanySymbols> companySymbolsImdg;
final Imdg<ProfileDocument> profileDocumentImdg;
final Imdg<Contact> contactImdg;
@Autowired
public MultiCompanyService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
@ -88,6 +93,8 @@ public class MultiCompanyService
companyIMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class);
companySymbolsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
profileDocumentImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
contactImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Contact, Contact.class);
}
@Override
@ -106,35 +113,62 @@ public class MultiCompanyService
if (requestInfoUpdate != null) return requestInfoUpdate;
}
/*
todo:
1) добавить апдейт кейсы
2) сделать транзакции.
*/
Long companyId = null;
boolean txOk = false;
boolean txOk = false; // todo IMDG transaction
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);
Company company = companyService.createOrUpdateCompany(wrapRequest(baseRequest, req.getCompany(), null), companyId);
companyId = company.getId();
log.debug("The companyId={}", companyId);
fillCompanyId(req, companyId);
//todo update case:
replyI = companyInfoService.companyInfoUpdate(wrapRequest(baseRequest, req.getCompanyInfo()));
if (req.getCompanyInfo() != null) {
log.trace("For company {} do update CompanyInfo", companyId);
replyI = companyInfoService.companyInfoUpdate(wrapRequest(baseRequest, req.getCompanyInfo(), null));
validateReply(companyId, "CompanyInfo", replyI);
}
for (ProfileDocumentNewRequest partRequest : req.getProfileDocuments()) {
replyI = profileDocumentService.profileDocumentNew(wrapRequest(baseRequest, partRequest));
ProfileDocument existDocument = findCompanyDocument(partRequest);
if (existDocument == null) {
log.trace("For company[{}] do new profileDocument", companyId);
replyI = profileDocumentService.profileDocumentNew(wrapRequest(baseRequest, partRequest, ActionType.NEW));
validateReply(companyId, "profileDocumentNew", replyI);
} else {
log.trace("For company[{}] do update profileDocument[{}]", companyId, existDocument.getId());
ProfileDocumentUpdateRequest partUpdateRequest = createUpdateRequest(existDocument, partRequest);
replyI = profileDocumentService.profileDocumentUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE));
validateReply(companyId, "profileDocumentUpdate", replyI);
}
}
for (CompanySymbolNewRequest partRequest : req.getCompanySymbols()) {
replyI = companySymbolService.companySymbolNew(wrapRequest(baseRequest, partRequest));
CompanySymbols existSymbol = findCompanySymbols(partRequest);
if (existSymbol == null) {
log.trace("For company[{}] do new companySymbol", companyId);
replyI = companySymbolService.companySymbolNew(wrapRequest(baseRequest, partRequest, ActionType.NEW));
validateReply(companyId, "companySymbolNew", replyI);
} else {
log.trace("For company[{}] do update companySymbol[{}]", companyId, existSymbol.getId());
CompanySymbolUpdateRequest partUpdateRequest = createUpdateRequest(existSymbol, partRequest);
replyI = companySymbolService.companySymbolUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE));
validateReply(companyId, "companySymbolUpdate", replyI);
}
}
for (ContactNewRequest partRequest : req.getContacts()) {
replyI = contactService.contactNew(wrapRequest(baseRequest, partRequest));
Contact existContact = findContact(partRequest);
if (existContact == null) {
log.trace("For company[{}] do new contact", companyId);
replyI = contactService.contactNew(wrapRequest(baseRequest, partRequest, ActionType.NEW));
validateReply(companyId, "contactNew", replyI);
} else {
log.trace("For company[{}] do update contact[{}]", companyId, existContact.getId());
ContactUpdateRequest partUpdateRequest = createUpdateRequest(existContact, partRequest);
replyI = contactService.contactUpdate(wrapRequest(baseRequest, partUpdateRequest, ActionType.UPDATE));
validateReply(companyId, "contactUpdate", replyI);
}
}
txOk = true;
} catch (ValidationException vex) {
@ -151,6 +185,83 @@ public class MultiCompanyService
return null;
}
void validateReply(Long companyId, String process, RequestInfoUpdate replyI) {
if (replyI != null && replyI.getMessage() != null) {
log.warn("Error process {} for companyId={}: {}", process, companyId, replyI.getMessage());
}
}
ProfileDocument findCompanyDocument(ProfileDocumentNewRequest partRequest) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", partRequest.getCompanyId());
query.put("documentType", partRequest.getDocumentType());
query.put("issueDate", partRequest.getIssueDate()); // может быть null
Collection<ProfileDocument> allDoc = profileDocumentImdg.getCollectionObjectsByFieldValues(query);
if (allDoc.isEmpty())
return null;
if (allDoc.size() > 1)
log.warn("Fount {} ProfileDocument by: {}", allDoc.size(), query);
return allDoc.iterator().next();
}
CompanySymbols findCompanySymbols(CompanySymbolNewRequest partRequest) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", partRequest.getCompanyId());
query.put("companySymbol", partRequest.getCompanySymbol());
Collection<CompanySymbols> allCS = companySymbolsImdg.getCollectionObjectsByFieldValues(query);
if (allCS.isEmpty())
return null;
if (allCS.size() > 1)
log.warn("Fount {} CompanySymbols by: {}", allCS.size(), query);
return allCS.iterator().next();
}
Contact findContact(ContactNewRequest partRequest) {
Map<String, Comparable<?>> query = new HashMap<>();
query.put("companyId", partRequest.getCompanyId());
query.put("contactType", partRequest.getContactType());
Collection<Contact> allCS = contactImdg.getCollectionObjectsByFieldValues(query);
if (allCS.isEmpty())
return null;
if (allCS.size() > 1)
log.warn("Fount {} Contact by: {}", allCS.size(), query);
return allCS.iterator().next();
}
ProfileDocumentUpdateRequest createUpdateRequest(ProfileDocument existDocument, ProfileDocumentNewRequest partRequest) {
ProfileDocumentUpdateRequest r = new ProfileDocumentUpdateRequest();
r.setId(existDocument.getId());
r.setCompanyId(partRequest.getCompanyId());
r.setDocumentType(partRequest.getDocumentType());
r.setIssueDate(partRequest.getIssueDate());
r.setIssuePlace(partRequest.getIssuePlace());
r.setIssuer(partRequest.getIssuer());
r.setIssuerCode(partRequest.getIssuerCode());
r.setName(partRequest.getName());
r.setNumber(partRequest.getNumber());
r.setPlace(partRequest.getPlace());
r.setValidFromDate(partRequest.getValidFromDate());
r.setValidToDate(partRequest.getValidToDate());
r.setLink(partRequest.getLink());
return r;
}
CompanySymbolUpdateRequest createUpdateRequest(CompanySymbols existSymbol, CompanySymbolNewRequest partRequest) {
CompanySymbolUpdateRequest r = new CompanySymbolUpdateRequest();
r.setId(existSymbol.getId());
r.setCompanyId(partRequest.getCompanyId());
r.setCompanySymbol(partRequest.getCompanySymbol());
r.setCompanySymbolValue(partRequest.getCompanySymbolValue());
return r;
}
ContactUpdateRequest createUpdateRequest(Contact existContact, ContactNewRequest partRequest) {
ContactUpdateRequest r = new ContactUpdateRequest();
r.setId(existContact.getId());
r.setContactType(partRequest.getContactType());
r.setContactValue(partRequest.getContactValue());
return r;
}
Long getCompanyIdForCompanySymbols(String uuid, CompanyNewRequest cnr) {
CompanySymbols companySymbol = null;
@ -190,10 +301,14 @@ public class MultiCompanyService
return null;
}
private <T> BaseRequest<T> wrapRequest(BaseRequest<?> template, T payload) {
private <T> BaseRequest<T> wrapRequest(BaseRequest<?> template, T payload, ActionType action) {
BaseRequest<T> r = new BaseRequest<>();
r.setId(template.getId());
r.setActionType(template.getActionType()); // todo?
if (action == null) {
r.setActionType(template.getActionType());
} else {
r.setActionType(action);
}
r.setUserId(template.getUserId());
r.setCorrelationId(template.getCorrelationId());
r.setRequestPayload(payload);
@ -201,8 +316,12 @@ public class MultiCompanyService
}
void fillCompanyId(MultiCompanyRequest req, Long companyId) {
req.getCompany().setId(companyId);
req.getCompanyInfo().setId(companyId);
if (req.getCompany() != null) {
req.getCompany().setId(companyId);
}
if (req.getCompanyInfo() != null) {
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<>());

View file

@ -168,7 +168,7 @@ public class ProfileDocumentService extends QueueConsumer implements Initializin
}
private RequestInfoUpdate profileDocumentUpdate(BaseRequest<ProfileDocumentUpdateRequest> profileDocumentUpdateRequestBaseRequest) {
protected RequestInfoUpdate profileDocumentUpdate(BaseRequest<ProfileDocumentUpdateRequest> profileDocumentUpdateRequestBaseRequest) {
log.trace("Start processing ProfileDocumentUpdateRequest!");
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(profileDocumentUpdateRequestBaseRequest);

View file

@ -0,0 +1,184 @@
package ru.spcex.clearing.company.service;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanySymbols;
import ru.clearing.classes.statics.data.profile.Contact;
import ru.clearing.classes.statics.data.profile.ProfileDocument;
import ru.clearing.platform.dictionary.CompanySymbolDictionary;
import ru.clearing.platform.dictionary.WorkflowStatusDictionary;
import ru.spcex.clearing.company.config.BeanConfiguration;
import ru.spcex.clearing.company.config.validation.*;
import ru.spcex.clearing.imdg.IMDGDistributedNames;
import ru.spcex.clearing.platform.messaging.domain.cud.company.*;
import ru.spcex.clearing.test.config.ImdgTestConfig;
import ru.spcex.clearing.test.config.KafkaTestConfig;
import ru.spcex.platform.enumeration.CompanySymbol;
import ru.spcex.platform.enumeration.ContactTypes;
import ru.spcex.platform.enumeration.DocumentTypes;
import ru.spcex.platform.enumeration.WorkflowStatus;
import ru.spcex.platform.imdg.api.Imdg;
import ru.spcex.platform.imdg.api.ImdgProvider;
import javax.annotation.PostConstruct;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.*;
import static ru.spcex.clearing.test.config.ImdgTestConfig.waitAvailableImdgProviderAndAddAdminWithDefaultId;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
MultiCompanyService.class,
CompanyService.class,
CompanyValidationConfig.class,
ValidationConfig.class,
CompanySymbolService.class,
AccountNotificationHelper.class,
RelationService.class, RelationValidationConfig.class,
CompanySymbolService.class,
CompanySymbolValidationConfig.class,
CompanyInfoService.class,
ProfileDocumentService.class,
ProfileDocumentValidationConfig.class,
ContactService.class,
ContactValidationConfig.class,
KafkaTestConfig.class,
ImdgTestConfig.class,
BeanConfiguration.class})
class MultiCompanyServiceTest {
final Long COMPANY_ID = 123L;
@Autowired
protected MultiCompanyService multiCompanyService;
@Autowired
@Qualifier("hazelcastServiceTest")
private ImdgProvider hazelcastServiceTest;
@PostConstruct
private void init() {
waitAvailableImdgProviderAndAddAdminWithDefaultId();
Imdg<Company> companyImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Company, Company.class);
Imdg<CompanySymbols> companySymbolsImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_CompanySymbols, CompanySymbols.class);
Company company = new Company();
company.setId(COMPANY_ID);
company.setWorkflowStatus(WorkflowStatus.Active.getKey());
company.setFullName("Test company prime");
companyImdg.insert(company);
Imdg<CompanySymbolDictionary> companySymbolDictionaryImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_CompanySymbolDictionary, CompanySymbolDictionary.class);
{
CompanySymbolDictionary cSymbol = new CompanySymbolDictionary();
cSymbol.setId(11L);
cSymbol.setCode(CompanySymbol.CLRC.getKey());
cSymbol.setName(CompanySymbol.CLRC.getKey());
cSymbol.setShortname(" CLRC key");
companySymbolDictionaryImdg.insert(cSymbol);
CompanySymbolDictionary cioSymbol = new CompanySymbolDictionary();
cioSymbol.setId(22L);
cioSymbol.setCode(CompanySymbol.CIO.getKey());
cioSymbol.setName(CompanySymbol.CIO.getKey());
companySymbolDictionaryImdg.insert(cioSymbol);
}
Imdg<Contact> contactImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_Contact, Contact.class);
Contact contact = new Contact();
contact.setId(100L);
contact.setCompanyId(company.getId());
contact.setContactType(ContactTypes.adrs.getKey());
contact.setContactValue("UAR, st.Uarus, anystreet st., house 1");
contactImdg.insert(contact);
CompanySymbols companySymbol = new CompanySymbols();
companySymbol.setId(222L);
companySymbol.setCompanyId(company.getId());
companySymbol.setCompanySymbol(CompanySymbol.CLRC.getKey());
companySymbol.setCompanySymbolValue("CL-VALUE");
companySymbolsImdg.insert(companySymbol);
Imdg<ProfileDocument> profileDocumentImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_ProfileDocument, ProfileDocument.class);
ProfileDocument doc = new ProfileDocument();
doc.setId(10002L);
doc.setCompanyId(COMPANY_ID);
doc.setDocumentType(DocumentTypes.form.getKey());
doc.setIssueDate(LocalDate.now()); // тест может показать ложное срабатывание в 00:00:00.001
profileDocumentImdg.insert(doc);
}
@Test
void findCompanyDocument() {
ProfileDocumentNewRequest req = new ProfileDocumentNewRequest();
req.setCompanyId(COMPANY_ID);
req.setDocumentType(DocumentTypes.form.getKey());
req.setIssueDate(LocalDate.now());
ProfileDocument doc = multiCompanyService.findCompanyDocument(req);
assertNotNull(doc);
}
@Test
void findCompanySymbols() {
CompanySymbolNewRequest req = new CompanySymbolNewRequest();
req.setCompanyId(COMPANY_ID);
req.setCompanySymbol(CompanySymbol.CLRC.getKey());
req.setCompanySymbolValue("CL-VALUE-2");
CompanySymbols symbol = multiCompanyService.findCompanySymbols(req);
assertNotNull(symbol);
assertEquals("CL-VALUE", symbol.getCompanySymbolValue());
}
@Test
void findContact() {
ContactNewRequest req = new ContactNewRequest();
req.setCompanyId(COMPANY_ID);
req.setContactType(ContactTypes.adrs.getKey());
req.setContactValue("UAR, st.Uarus, anystreet st., house 2");
Contact contact = multiCompanyService.findContact(req);
assertNotNull(contact);
assertNotEquals(req.getContactValue(), contact.getContactValue());
}
@Test
void getCompanyIdForCompanySymbols() {
CompanyNewRequest req = new CompanyNewRequest();
req.setCompanySymbol(CompanySymbol.CLRC.getKey());
req.setCompanySymbolValue("CL-VALUE");
Long theId = multiCompanyService.getCompanyIdForCompanySymbols("SAMPLE-NO-uuid", req);
assertEquals(COMPANY_ID, theId);
}
@Test
void fillCompanyId() {
{
MultiCompanyRequest testReq = new MultiCompanyRequest();
testReq.setCompany(new CompanyNewRequest());
testReq.setProfileDocuments(null);
testReq.setCompanySymbols(null);
testReq.setContacts(null);
testReq.setClientCodes(null);
multiCompanyService.fillCompanyId(testReq, COMPANY_ID);
assertEquals(COMPANY_ID, testReq.getCompany().getId());
assertNotNull(testReq.getProfileDocuments());
assertNotNull(testReq.getCompanySymbols());
assertNotNull(testReq.getContacts());
assertNotNull(testReq.getClientCodes());
}
{
MultiCompanyRequest testReq = new MultiCompanyRequest();
testReq.setCompany(new CompanyNewRequest());
testReq.setCompanyInfo(new CompanyInfoUpdateRequest());
multiCompanyService.fillCompanyId(testReq, COMPANY_ID);
assertEquals(COMPANY_ID, testReq.getCompany().getId());
}
}
}

View file

@ -38,4 +38,18 @@ public class TestObjectCreator {
userRoleSession.setStatus(WorkflowStatus.Active.getKey());
userRoleSessionImdg.insert(userRoleSession);
}
// public void fillWorkflowStatusDictionary() {
// Imdg<WorkflowStatusDictionary> workflowStatusDictionaryImdg = hazelcastServiceTest.getImdg(IMDGDistributedNames.Map_WorkflowStatusDictionary, WorkflowStatusDictionary.class);
// WorkflowStatusDictionary ws1 = new WorkflowStatusDictionary();
// ws1.setId(1L);
// ws1.setCode(WorkflowStatus.Active.getKey());
// ws1.setName("Active");
// workflowStatusDictionaryImdg.insert(ws1);
// WorkflowStatusDictionary ws2 = new WorkflowStatusDictionary();
// ws2.setId(2L);
// ws2.setCode(WorkflowStatus.Blocked.getKey());
// ws2.setName("Blocked");
// workflowStatusDictionaryImdg.insert(ws2);
// }
}