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<String, Object> parameters(LimsWaterSamplingMessageEvent event) {
|
Map<String, Object> 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;
|
}
|
}
|