feat(fleet): integrate costs quotes operations and in-transit handovers
This commit is contained in:
+58
@@ -0,0 +1,58 @@
|
||||
package com.baiyue.lastleg.financefee.fleet;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||||
import com.baiyue.common.event.EventEnvelope;
|
||||
import com.baiyue.common.event.EventTypes;
|
||||
import com.baiyue.lastleg.entity.LastlegEventOutbox;
|
||||
import com.baiyue.lastleg.mapper.LastlegEventOutboxMapper;
|
||||
import com.baiyue.lastleg.financefee.service.OverseasFeeCurrencyConverter;
|
||||
import com.baiyue.lastleg.fleet.maintenance.VehicleCareFinanceGateway;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.annotation.Propagation;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.server.ResponseStatusException;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.*;
|
||||
import java.util.*;
|
||||
|
||||
@Component
|
||||
public class VehicleCareFinanceAdapter implements VehicleCareFinanceGateway {
|
||||
private final OverseasFeeCurrencyConverter converter;
|
||||
private final LastlegEventOutboxMapper outbox;
|
||||
private final JdbcTemplate jdbc;
|
||||
private final ObjectMapper json;
|
||||
public VehicleCareFinanceAdapter(OverseasFeeCurrencyConverter converter, LastlegEventOutboxMapper outbox, JdbcTemplate jdbc, ObjectMapper json) {
|
||||
this.converter = converter; this.outbox = outbox; this.jdbc = jdbc; this.json = json;
|
||||
}
|
||||
@Override
|
||||
public Conversion convert(String currency, BigDecimal amount, LocalDate businessDate) {
|
||||
var converted = converter.convert(currency, amount, businessDate);
|
||||
return new Conversion(converted.originalCurrency(), converted.originalAmount(), converted.exchangeRate(), converted.exchangeRateMonth(), converted.settlementAmount());
|
||||
}
|
||||
@Override @Transactional(propagation=Propagation.MANDATORY)
|
||||
public void publish(EventEnvelope envelope) {
|
||||
envelope.requireValid();
|
||||
if (!EventTypes.COMPANY_VEHICLE_COST_SUBMITTED.equals(envelope.eventType()) || !"0".equals(envelope.tenantId()))
|
||||
throw new IllegalArgumentException("车辆公司成本Outbox事件类型或平台归属无效");
|
||||
var event = new LastlegEventOutbox(); event.setId(IdWorker.getId()); event.setCustomerId("0");
|
||||
event.setAggregateType(envelope.aggregateType()); event.setAggregateId(envelope.aggregateId());
|
||||
event.setEventType(envelope.eventType()); event.setEventVersion(envelope.eventVersion()); event.setEventKey(envelope.correlationId());
|
||||
try { event.setPayloadJson(json.writeValueAsString(envelope)); }
|
||||
catch (JsonProcessingException error) { throw new IllegalStateException("车辆公司成本事件无法保存", error); }
|
||||
event.setStatus("PENDING"); event.setRetryCount(0); event.setCreatedAt(LocalDateTime.now(ZoneOffset.UTC));
|
||||
if (outbox.insert(event) != 1) throw new ResponseStatusException(HttpStatus.CONFLICT, "财务投递记录保存失败");
|
||||
}
|
||||
@Override @Transactional(readOnly=true)
|
||||
public Map<String, String> deliveryStates(List<String> keys) {
|
||||
if (keys.size() > 100) throw new IllegalArgumentException("车辆成本投递查询最多100个事件");
|
||||
if (keys.isEmpty()) return Map.of();
|
||||
var result = new HashMap<String, String>();
|
||||
jdbc.query("SELECT event_key,status FROM ll_event_outbox WHERE event_key IN (" + String.join(",", Collections.nCopies(keys.size(), "?")) + ")",
|
||||
(org.springframework.jdbc.core.RowCallbackHandler) r -> result.put(r.getString("event_key"), r.getString("status")), keys.toArray());
|
||||
return Map.copyOf(result);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user