account-service http://jira.mfd.msk:8088/browse/CLS-527
This commit is contained in:
parent
f09b02b693
commit
e19cb6876e
2 changed files with 43 additions and 31 deletions
|
|
@ -368,7 +368,7 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
|
||||||
log.debug("Selected to update {} account's", toUpdate.size());
|
log.debug("Selected to update {} account's", toUpdate.size());
|
||||||
|
|
||||||
// 4. to notification
|
// 4. to notification
|
||||||
List<Long> notificationIds = new ArrayList<>();
|
List<Long> notificationAccountIds = new ArrayList<>();
|
||||||
boolean needWait = false;
|
boolean needWait = false;
|
||||||
{
|
{
|
||||||
for (Pair<SDf52, Account> item : toUpdate) {
|
for (Pair<SDf52, Account> item : toUpdate) {
|
||||||
|
|
@ -383,17 +383,19 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (AccountStatus.BLOCKED == newStatus || AccountStatus.CLOSE == newStatus) { // статус 0/2
|
if (AccountStatus.BLOCKED == newStatus || AccountStatus.CLOSE == newStatus) { // статус 0/2
|
||||||
notificationIds.add(sendNotificationRequest(ObjectType.account_block, account, newStatus));
|
sendNotificationRequest(ObjectType.account_block, account, newStatus);
|
||||||
|
notificationAccountIds.add(account.getId());
|
||||||
needWait = true;
|
needWait = true;
|
||||||
}
|
}
|
||||||
if (AccountStatus.ACTIVE == newStatus) { // статус 1/3
|
if (AccountStatus.ACTIVE == newStatus) { // статус 1/3
|
||||||
notificationIds.add(sendNotificationRequest(ObjectType.account_active, account, newStatus));
|
sendNotificationRequest(ObjectType.account_active, account, newStatus);
|
||||||
|
notificationAccountIds.add(account.getId());
|
||||||
needWait = true;
|
needWait = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (needWait) {
|
if (needWait) {
|
||||||
SDFProcessService.SDF52WaitingData data = new SDFProcessService.SDF52WaitingData(systemRequest, toProcessSDF53, toUpdate, notificationIds);
|
SDFProcessService.SDF52WaitingData data = new SDFProcessService.SDF52WaitingData(systemRequest, toProcessSDF53, toUpdate, notificationAccountIds);
|
||||||
sdfProcessService.putNotificationWaiting(data);
|
sdfProcessService.putNotificationWaiting(data);
|
||||||
log.info("Account's need wait accept over notification. Waiting user. GroupId={}", groupId);
|
log.info("Account's need wait accept over notification. Waiting user. GroupId={}", groupId);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -532,24 +534,12 @@ public class ClearingAccountService extends QueueConsumer implements Initializin
|
||||||
kafkaSender.sendRequestToQueue(destination, request);
|
kafkaSender.sendRequestToQueue(destination, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sendTCRUpdateRequest(Long groupingSdf01Id, Long groupSdf02Id, List<AccountSdfToStatementRequestPart> results) {
|
|
||||||
final String destination = Consts.STATEMENT_PROCESS;
|
|
||||||
StatementRequest request = new StatementRequest();
|
|
||||||
request.setGroupId(groupingSdf01Id);
|
|
||||||
request.setChildGenerationId(groupSdf02Id);
|
|
||||||
request.setAccountCreationResults(results);
|
|
||||||
request.setContinueSdf(true);
|
|
||||||
request.setTable(SdfTable.SDF_01); // по нему запрос получили
|
|
||||||
log.debug("Send message to kafka \"{}\": {}", destination, LogFormatter.toStringWrapper(request));
|
|
||||||
kafkaSender.sendRequestToQueue(destination, request);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Long sendNotificationRequest(ObjectType objectType, Account account, AccountStatus requestToStatus) {
|
public Long sendNotificationRequest(ObjectType objectType, Account account, AccountStatus requestToStatus) {
|
||||||
String statusText = AccountStatus.BLOCKED == requestToStatus ? "Заблокирован"
|
String statusText = AccountStatus.BLOCKED == requestToStatus ? "Заблокирован"
|
||||||
: AccountStatus.CLOSE == requestToStatus ? "Закрыт"
|
: AccountStatus.CLOSE == requestToStatus ? "Закрыт"
|
||||||
: AccountStatus.ACTIVE == requestToStatus ? "Разблокирован" :
|
: AccountStatus.ACTIVE == requestToStatus ? "Разблокирован" :
|
||||||
requestToStatus.getKey();
|
requestToStatus.getKey();
|
||||||
String message = String.format("Для счета «%s» будет изменен статус на «%s»", account.getAccount(), statusText);
|
String message = String.format("Для счета %s будет изменен статус на «%s»", account.getAccount(), statusText);
|
||||||
final String destination = Consts.NOTIFICATION_NEW;
|
final String destination = Consts.NOTIFICATION_NEW;
|
||||||
NotificationNewRequest request = new NotificationNewRequest();
|
NotificationNewRequest request = new NotificationNewRequest();
|
||||||
request.setObjectType(objectType.getKey());
|
request.setObjectType(objectType.getKey());
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import ru.clearing.classes.statics.data.account.Account;
|
import ru.clearing.classes.statics.data.account.Account;
|
||||||
|
import ru.clearing.classes.statics.data.misc.Notification;
|
||||||
import ru.clearing.classes.statics.data.sdf.SDf52;
|
import ru.clearing.classes.statics.data.sdf.SDf52;
|
||||||
import ru.clearing.classes.statics.data.sdf.SDf53;
|
import ru.clearing.classes.statics.data.sdf.SDf53;
|
||||||
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
import ru.spcex.clearing.imdg.IMDGDistributedNames;
|
||||||
|
|
@ -17,6 +18,7 @@ import ru.spcex.clearing.platform.messaging.domain.cud.utilities.NotificationFee
|
||||||
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
import ru.spcex.clearing.platform.messaging.service.sender.KafkaSender;
|
||||||
import ru.spcex.platform.enumeration.AccountStatus;
|
import ru.spcex.platform.enumeration.AccountStatus;
|
||||||
import ru.spcex.platform.enumeration.NotificationStatus;
|
import ru.spcex.platform.enumeration.NotificationStatus;
|
||||||
|
import ru.spcex.platform.enumeration.ObjectType;
|
||||||
import ru.spcex.platform.imdg.api.Imdg;
|
import ru.spcex.platform.imdg.api.Imdg;
|
||||||
import ru.spcex.platform.imdg.api.ImdgId;
|
import ru.spcex.platform.imdg.api.ImdgId;
|
||||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||||
|
|
@ -45,6 +47,7 @@ public class SDFProcessService {
|
||||||
protected final ImdgId idGenerator;
|
protected final ImdgId idGenerator;
|
||||||
|
|
||||||
private final Imdg<SDf52> sdf52Imdg;
|
private final Imdg<SDf52> sdf52Imdg;
|
||||||
|
private final Imdg<Notification> notificationImdg;
|
||||||
|
|
||||||
public SDFProcessService(
|
public SDFProcessService(
|
||||||
Producer<String, Object> kafkaResponseQueue,
|
Producer<String, Object> kafkaResponseQueue,
|
||||||
|
|
@ -56,6 +59,7 @@ public class SDFProcessService {
|
||||||
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
this.idGenerator = imdgProvider.getImdgIdGenerator();
|
||||||
|
|
||||||
this.sdf52Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf52, SDf52.class);
|
this.sdf52Imdg = imdgProvider.getImdg(IMDGDistributedNames.Map_SDf52, SDf52.class);
|
||||||
|
this.notificationImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Notification, Notification.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Collection<SDf52> sdfsByGroupId(Long generationId) {
|
public Collection<SDf52> sdfsByGroupId(Long generationId) {
|
||||||
|
|
@ -155,15 +159,15 @@ public class SDFProcessService {
|
||||||
public BaseRequest<StatementRequest> systemRequest;
|
public BaseRequest<StatementRequest> systemRequest;
|
||||||
public List<Triple<SDf52, Account, String>> toProcessSDF53;
|
public List<Triple<SDf52, Account, String>> toProcessSDF53;
|
||||||
public List<Pair<SDf52, Account>> toUpdate;
|
public List<Pair<SDf52, Account>> toUpdate;
|
||||||
public HashSet<Long> notAnsweredNotifications = new HashSet<>();
|
public HashSet<Long> notAnsweredAccounts = new HashSet<>();
|
||||||
public String globalStatus;
|
public String globalStatus;
|
||||||
|
|
||||||
public SDF52WaitingData(BaseRequest<StatementRequest> systemRequest, List<Triple<SDf52, Account, String>> toProcessSDF53, List<Pair<SDf52, Account>> toUpdate,
|
public SDF52WaitingData(BaseRequest<StatementRequest> systemRequest, List<Triple<SDf52, Account, String>> toProcessSDF53, List<Pair<SDf52, Account>> toUpdate,
|
||||||
Collection<Long> notAnsweredNotifications) {
|
Collection<Long> notAnsweredAccounts) {
|
||||||
this.systemRequest = systemRequest;
|
this.systemRequest = systemRequest;
|
||||||
this.toProcessSDF53 = toProcessSDF53;
|
this.toProcessSDF53 = toProcessSDF53;
|
||||||
this.toUpdate = toUpdate;
|
this.toUpdate = toUpdate;
|
||||||
this.notAnsweredNotifications = new HashSet<>(notAnsweredNotifications);
|
this.notAnsweredAccounts = new HashSet<>(notAnsweredAccounts);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getGroupId() {
|
public Long getGroupId() {
|
||||||
|
|
@ -181,6 +185,8 @@ public class SDFProcessService {
|
||||||
log.warn("groupId={} already waiting", data.getGroupId());
|
log.warn("groupId={} already waiting", data.getGroupId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (data.notAnsweredAccounts.isEmpty())
|
||||||
|
log.warn("Add to wait notification list with empty notAnsweredAccounts");
|
||||||
data.globalStatus = null;
|
data.globalStatus = null;
|
||||||
waitingList.add(data);
|
waitingList.add(data);
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -190,42 +196,58 @@ public class SDFProcessService {
|
||||||
* @return triggered SDF52WaitingData or null
|
* @return triggered SDF52WaitingData or null
|
||||||
*/
|
*/
|
||||||
public SDF52WaitingData onNotificationResponse(NotificationFeedbackRequest onNotification) {
|
public SDF52WaitingData onNotificationResponse(NotificationFeedbackRequest onNotification) {
|
||||||
final Long nId = onNotification.getNotificationId();
|
if (onNotification.getNotificationId() == null) {
|
||||||
if (nId == null)
|
log.trace("notificationId was empty");
|
||||||
return null;
|
return null;
|
||||||
|
}
|
||||||
|
Notification notification = notificationImdg.getSingleObjectByID(onNotification.getNotificationId());
|
||||||
|
if (notification == null) {
|
||||||
|
log.warn("Notification with id={} not exist", onNotification.getNotificationId());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!ObjectType.account_active.equalsByKey(notification.getObjectType()) && !ObjectType.account_block.equalsByKey(notification.getObjectType())) {
|
||||||
|
log.warn("Notification[{}].objectType={} not supported", notification.getId(), notification.getObjectType());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (notification.getObjectId() == null) {
|
||||||
|
log.warn("Notification[{}] with empty objectId", notification.getId());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final Long accountId = notification.getObjectId();
|
||||||
|
log.trace("Match accountId={} by notificationId={}", accountId, notification.getId());
|
||||||
SDF52WaitingData inWaitingLst = null;
|
SDF52WaitingData inWaitingLst = null;
|
||||||
for (SDF52WaitingData i : waitingList)
|
for (SDF52WaitingData i : waitingList)
|
||||||
synchronized (i) {
|
synchronized (i) {
|
||||||
if (i.notAnsweredNotifications.contains(nId)) {
|
if (i.notAnsweredAccounts.contains(accountId)) {
|
||||||
inWaitingLst = i;
|
inWaitingLst = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (inWaitingLst == null) {
|
if (inWaitingLst == null) {
|
||||||
log.debug("SDF52 waiting list not found for notificationId={}", nId);
|
log.debug("SDF52 waiting list (count {}) not found for accountId={}", waitingList.size(), accountId);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
boolean returnTrigger = false;
|
boolean returnTrigger = false;
|
||||||
synchronized (inWaitingLst) {
|
synchronized (inWaitingLst) {
|
||||||
boolean removedId = inWaitingLst.notAnsweredNotifications.remove(nId);
|
boolean removedId = inWaitingLst.notAnsweredAccounts.remove(accountId);
|
||||||
if (!removedId) { // never
|
if (!removedId) { // never
|
||||||
log.warn("Can not remove notificationId={} from waiting list", nId);
|
log.warn("Can not remove accountId={} from waiting list {}", accountId, inWaitingLst);
|
||||||
}
|
}
|
||||||
if (NotificationStatus.ACPT.equalsByKey(onNotification.getNotificationStatus())) {
|
if (NotificationStatus.ACPT.equalsByKey(onNotification.getNotificationStatus())) {
|
||||||
if (inWaitingLst.notAnsweredNotifications.isEmpty()) {
|
if (inWaitingLst.notAnsweredAccounts.isEmpty()) {
|
||||||
log.trace("Waiting list is empty, by notificationId={}", nId);
|
log.trace("Waiting list is empty, by accountId={}", accountId);
|
||||||
inWaitingLst.globalStatus = onNotification.getNotificationStatus();
|
inWaitingLst.globalStatus = onNotification.getNotificationStatus();
|
||||||
returnTrigger = true;
|
returnTrigger = true;
|
||||||
}
|
}
|
||||||
} else if (NotificationStatus.CNCL.equalsByKey(onNotification.getNotificationStatus())) {
|
} else if (NotificationStatus.CNCL.equalsByKey(onNotification.getNotificationStatus())) {
|
||||||
log.trace("Waiting list cancel, by notificationId={}", nId);
|
log.trace("Waiting list cancel, by accountId={}", accountId);
|
||||||
inWaitingLst.globalStatus = onNotification.getNotificationStatus();
|
inWaitingLst.globalStatus = onNotification.getNotificationStatus();
|
||||||
returnTrigger = true;
|
returnTrigger = true;
|
||||||
} else {
|
} else {
|
||||||
log.warn("Unknown notification[{}] status={}", onNotification.getNotificationId(), onNotification.getNotificationStatus());
|
log.warn("Unknown notification[{}] status={}", onNotification.getNotificationId(), onNotification.getNotificationStatus());
|
||||||
}
|
}
|
||||||
if (returnTrigger || inWaitingLst.notAnsweredNotifications.isEmpty()) {
|
if (returnTrigger || inWaitingLst.notAnsweredAccounts.isEmpty()) {
|
||||||
log.debug("Remove waiting list by notificationId={} (list groupId={})", nId, inWaitingLst.getGroupId());
|
log.debug("Remove waiting list by accountId={} (list groupId={})", accountId, inWaitingLst.getGroupId());
|
||||||
waitingList.remove(inWaitingLst);
|
waitingList.remove(inWaitingLst);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue