package jnpf.limsService.listener; import jnpf.limsEntity.LimsMessageEvent; import jnpf.limsEntity.LimsMessageRequest; import jnpf.limsEntity.LimsRecipientRef; import jnpf.limsEntity.LimsWaterSamplingMessageEvent; import jnpf.limsService.LimsMessageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; /** * Sends only after the inspection request and source task transaction commits. */ @Slf4j @Component @RequiredArgsConstructor public class LimsWaterSamplingMessageListener { private final LimsMessageService messageService; @Value("${lims.message.water-sampling-enabled:false}") private boolean enabled; @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) public void onRequestCreated(LimsWaterSamplingMessageEvent event) { if (!enabled) { log.info("[lims-water-sampling-message] skipped because water-sampling-enabled=false, taskId={}, requestId={}", event.getTaskId(), event.getRequestId()); return; } try { messageService.send(LimsMessageRequest.builder() .event(LimsMessageEvent.WATER_SAMPLING_DUE) .tenantId(event.getTenantId()) .bizId(event.getRequestId()) .remindStage("REQUEST_CREATED") .occurrenceKey(LimsMessageEvent.WATER_SAMPLING_DUE.getCode() + ":" + event.getTaskId() + ":" + event.getRequestId()) .recipients(Collections.singletonList( LimsRecipientRef.role(event.getSamplingRoleId()))) .parameters(parameters(event)) .dryRun(false) .build()); } catch (Exception e) { // The business transaction has committed. Keep the request and expose the notification failure. log.error("[lims-water-sampling-message] send failed, taskId={}, requestId={}, roleId={}", event.getTaskId(), event.getRequestId(), event.getSamplingRoleId(), e); } } private Map parameters(LimsWaterSamplingMessageEvent event) { Map parameters = new LinkedHashMap<>(); parameters.put("bizId", value(event.getRequestId())); parameters.put("requestNo", value(event.getRequestNo())); parameters.put("planName", value(event.getPlanName())); parameters.put("sampleName", value(event.getSampleName())); parameters.put("samplingLocation", value(event.getSamplingLocation())); parameters.put("plannedSamplingDate", event.getPlannedSamplingDate() == null ? "" : new SimpleDateFormat("yyyy-MM-dd").format(event.getPlannedSamplingDate())); return parameters; } private String value(String value) { return value == null ? "" : value; } }