刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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;
    }
}