74 lines
3.5 KiB
Java
74 lines
3.5 KiB
Java
package com.baiyue.lastleg.service;
|
|||
|
|
|
||
|
|
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||
|
|
import com.baiyue.common.event.EventEnvelope;
|
||
|
|
import com.baiyue.common.event.EventIdentifiers;
|
||
|
|
import com.baiyue.common.event.EventPayloadCanonicalizer;
|
||
|
|
import com.baiyue.common.event.EventPayloadHash;
|
||
|
|
import com.baiyue.common.event.EventTypes;
|
||
|
|
import com.baiyue.common.event.OverseasInboundOrderDetainedChangedV1;
|
||
|
|
import com.baiyue.common.event.RegionCode;
|
||
|
|
import com.baiyue.lastleg.entity.LastlegEventOutbox;
|
||
|
|
import com.baiyue.lastleg.entity.LastlegOrder;
|
||
|
|
import com.baiyue.lastleg.mapper.LastlegEventOutboxMapper;
|
||
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
||
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
||
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||
|
|
import jakarta.annotation.Resource;
|
||
|
|
import org.springframework.stereotype.Service;
|
||
|
|
|
||
|
|
import java.time.Instant;
|
||
|
|
import java.time.LocalDateTime;
|
||
|
|
import java.time.ZoneOffset;
|
||
|
|
|
||
|
|
/** 在尾程业务事务内冻结按来源入仓单回传国内的暂扣状态事件。 */
|
||
|
|
@Service
|
||
|
|
public class InboundOrderDetainedOutboxService {
|
||
|
|
@Resource private LastlegEventOutboxMapper mapper;
|
||
|
|
@Resource private ObjectMapper objectMapper;
|
||
|
|
|
||
|
|
public void publish(LastlegOrder order, boolean detained, String reason, String operatorId,
|
||
|
|
String operatorName, Instant changedAt, long changeVersion) {
|
||
|
|
requireText(order.getSourceInboundId(), "sourceInboundId");
|
||
|
|
requireText(order.getInboundCode(), "inboundCode");
|
||
|
|
requireText(order.getCustomerId(), "customerId");
|
||
|
|
var payload = new OverseasInboundOrderDetainedChangedV1(order.getSourceInboundId(),
|
||
|
|
order.getInboundCode(), String.valueOf(order.getId()), order.getOrderNo(), detained,
|
||
|
|
reason, operatorId, operatorName, changedAt);
|
||
|
|
JsonNode payloadNode = objectMapper.valueToTree(payload);
|
||
|
|
String eventKey = EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED + ':'
|
||
|
|
+ order.getSourceInboundId() + ':' + changeVersion;
|
||
|
|
EventEnvelope envelope = new EventEnvelope(EventIdentifiers.newUuid(),
|
||
|
|
EventTypes.OVERSEAS_INBOUND_ORDER_DETAINED_CHANGED, 1, changedAt,
|
||
|
|
RegionCode.OVERSEAS, RegionCode.CN, order.getCustomerId(), "INBOUND_ORDER",
|
||
|
|
order.getSourceInboundId(), changeVersion, 1L, EventIdentifiers.newUuid(),
|
||
|
|
eventKey, order.getSourceEventId(), payloadNode,
|
||
|
|
EventPayloadHash.sha256(EventPayloadCanonicalizer.canonicalize(payloadNode))).requireValid();
|
||
|
|
|
||
|
|
LastlegEventOutbox event = new LastlegEventOutbox();
|
||
|
|
event.setId(IdWorker.getId());
|
||
|
|
event.setCustomerId(order.getCustomerId());
|
||
|
|
event.setAggregateType(envelope.aggregateType());
|
||
|
|
event.setAggregateId(envelope.aggregateId());
|
||
|
|
event.setEventType(envelope.eventType());
|
||
|
|
event.setEventVersion(envelope.eventVersion());
|
||
|
|
event.setEventKey(eventKey);
|
||
|
|
event.setPayloadJson(json(envelope));
|
||
|
|
event.setStatus("PENDING");
|
||
|
|
event.setRetryCount(0);
|
||
|
|
event.setCreatedAt(LocalDateTime.ofInstant(changedAt, ZoneOffset.UTC));
|
||
|
|
mapper.insert(event);
|
||
|
|
}
|
||
|
|
|
||
|
|
private static void requireText(String value, String field) {
|
||
|
|
if (value == null || value.isBlank()) throw new IllegalStateException(field + " is required");
|
||
|
|
}
|
||
|
|
|
||
|
|
private String json(Object value) {
|
||
|
|
try { return objectMapper.writeValueAsString(value); }
|
||
|
|
catch (JsonProcessingException exception) {
|
||
|
|
throw new IllegalStateException("Cannot serialize inbound detained event", exception);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|