feat(fleet): integrate costs quotes operations and in-transit handovers

This commit is contained in:
2026-10-03 12:38:04 +08:00
parent 274ecac474
commit cb6c54ffe5
107 changed files with 7304 additions and 42 deletions
@@ -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);
}
}