package jnpf.limsService.impl; import jnpf.limsEntity.LimsMessageDeliveryEntity; import jnpf.limsEntity.LimsMessageDeliveryStatus; import jnpf.limsEntity.LimsMessageEventEntity; import jnpf.limsEntity.LimsMessageEventStatus; import jnpf.limsEntity.LimsMessageLedger; import jnpf.limsEntity.LimsMessageRequest; import jnpf.limsMapper.LimsMessageDeliveryMapper; import jnpf.limsMapper.LimsMessageEventMapper; import jnpf.util.JsonUtil; import jnpf.util.RandomUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service @RequiredArgsConstructor public class LimsMessageLedgerService { private final LimsMessageEventMapper eventMapper; private final LimsMessageDeliveryMapper deliveryMapper; @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public LimsMessageLedger initialize(LimsMessageRequest request, List recipients) { Date now = new Date(); LimsMessageEventEntity event = new LimsMessageEventEntity(); event.setId(RandomUtil.uuId()); event.setTenantId(request.getTenantId()); event.setEventCode(request.getEvent().getCode()); event.setBizId(request.getBizId()); event.setRemindStage(request.getRemindStage()); event.setOccurrenceKey(request.getOccurrenceKey()); event.setRecipientSnapshot(JsonUtil.getObjectToString(request.getRecipients())); event.setParameterSnapshot(JsonUtil.getObjectToString(request.getParameters())); event.setStatus(LimsMessageEventStatus.PENDING); event.setRecipientCount(recipients.size()); event.setSentCount(0); event.setFailedCount(0); event.setRetryCount(0); event.setCreatedTime(now); event.setLastModifyTime(now); if (eventMapper.insertIfAbsent(event) == 0) { return LimsMessageLedger.duplicate(); } List deliveries = new ArrayList<>(recipients.size()); for (String recipient : recipients) { LimsMessageDeliveryEntity delivery = new LimsMessageDeliveryEntity(); delivery.setId(RandomUtil.uuId()); delivery.setEventId(event.getId()); delivery.setTenantId(event.getTenantId()); delivery.setRecipientUserId(recipient); delivery.setDeliveryKey(event.getTenantId() + ":" + event.getId() + ":" + recipient); delivery.setStatus(LimsMessageDeliveryStatus.PENDING); delivery.setRetryCount(0); delivery.setCreatedTime(now); delivery.setLastModifyTime(now); deliveryMapper.insert(delivery); deliveries.add(delivery); } return new LimsMessageLedger(true, event, deliveries); } }