feat(t224): add incremental freight sync

This commit is contained in:
QiuSW
2026-07-29 00:26:05 +08:00
parent 433db45100
commit c69879650e
35 changed files with 2085 additions and 156 deletions
@@ -270,21 +270,57 @@ func (adapter *UsecaseAdapter) CreateFreightSync(
if adapter.freight == nil {
return FreightSync{}, ErrUnavailable
}
result, err := adapter.freight.CreateOrderSync(
ctx,
usecase.CreateFreightSyncCommand{
CreatorSubject: localAdminSubject,
ActorUserID: input.ActorUserID,
IdempotencyKey: input.IdempotencyKey,
OrderNumber: input.OrderNumber,
},
)
var result usecase.CreateFreightSyncResult
var err error
if input.Mode == domain.FreightSyncCreatedRange {
result, err = adapter.freight.CreateDateSync(
ctx,
usecase.CreateFreightDateSyncCommand{
CreatorSubject: localAdminSubject,
ActorUserID: input.ActorUserID,
IdempotencyKey: input.IdempotencyKey,
CreatedFrom: input.CreatedFrom,
CreatedTo: input.CreatedTo,
SyncToNow: input.SyncToNow,
},
)
} else {
result, err = adapter.freight.CreateOrderSync(
ctx,
usecase.CreateFreightSyncCommand{
CreatorSubject: localAdminSubject,
ActorUserID: input.ActorUserID,
IdempotencyKey: input.IdempotencyKey,
OrderNumber: input.OrderNumber,
},
)
}
if err != nil {
return FreightSync{}, mapUsecaseError(err)
}
return freightSyncFrom(result.Run), nil
}
func (adapter *UsecaseAdapter) GetFreightWatermark(
ctx context.Context,
) (*FreightWatermark, error) {
if adapter.freight == nil {
return nil, ErrUnavailable
}
watermark, err := adapter.freight.GetWatermark(ctx, localAdminSubject)
if err != nil {
return nil, mapUsecaseError(err)
}
if watermark == nil {
return nil, nil
}
return &FreightWatermark{
LastSuccessfulTo: watermark.LastSuccessfulTo,
LastSuccessfulRunID: watermark.LastSuccessfulRunID,
UpdatedAt: watermark.UpdatedAt,
}, nil
}
func freightOrderFrom(order domain.FreightOrder) FreightOrder {
result := FreightOrder{
ID: order.ID,
@@ -308,12 +344,18 @@ func freightOrderFrom(order domain.FreightOrder) FreightOrder {
func freightSyncFrom(run domain.FreightSyncRun) FreightSync {
result := FreightSync{
ID: run.ID,
Status: string(run.Status),
ErrorCode: stringValue(run.ErrorCode),
OrderCount: run.OrderCount,
ItemCount: run.ItemCount,
CreatedAt: run.CreatedAt,
ID: run.ID,
Mode: run.Mode,
CreatedFrom: run.CreatedFrom,
CreatedTo: run.CreatedTo,
Status: string(run.Status),
ErrorCode: stringValue(run.ErrorCode),
OrderCount: run.OrderCount,
ItemCount: run.ItemCount,
CreatedAt: run.CreatedAt,
}
if run.WatermarkThrough != nil {
result.WatermarkThrough = *run.WatermarkThrough
}
if run.FinishedAt != nil {
result.FinishedAt = *run.FinishedAt