feat: 优化批量匹配和分页默认值 (#244)
This commit is contained in:
@@ -21,6 +21,8 @@ type InnerCodeDetailReader interface {
|
||||
DetailListByStock(context.Context, []int64) ([]syb.StockDetail, error)
|
||||
}
|
||||
|
||||
const innerCodeReadBatchSize = 100
|
||||
|
||||
// InnerCodePlanResult 是一次规划的逐状态统计。
|
||||
type InnerCodePlanResult struct {
|
||||
Total int
|
||||
@@ -65,9 +67,35 @@ func PlanInnerCodeRecords(ctx context.Context, db *sql.DB, reader InnerCodeDetai
|
||||
}
|
||||
stockIDsByOrder := innerCodeStockIDsByOrder(snapshots)
|
||||
requested := uniqueInnerCodeStockIDs(records, stockIDsByOrder)
|
||||
detailsByID, err := readInnerCodeDetails(ctx, reader, requested)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
plans := planInnerCodeRowsWithReserved(records, stockIDsByOrder, detailsByID, reservedDetails)
|
||||
for _, plan := range plans {
|
||||
switch plan.Status {
|
||||
case model.InnerCodeReady:
|
||||
result.Ready++
|
||||
case model.InnerCodeAlreadyFilled:
|
||||
result.AlreadyFilled++
|
||||
case model.InnerCodeFailed:
|
||||
result.Failed++
|
||||
default:
|
||||
result.Skipped++
|
||||
}
|
||||
}
|
||||
if err := repository.SaveInnerCodePlans(db, plans, model.NowISO()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// readInnerCodeDetails 只限制单次顺运宝请求大小,不限制一次规划的总选择数量。
|
||||
func readInnerCodeDetails(ctx context.Context, reader InnerCodeDetailReader, requested []int64) (map[int64]syb.StockDetail, error) {
|
||||
detailsByID := make(map[int64]syb.StockDetail, len(requested))
|
||||
for start := 0; start < len(requested); start += 100 {
|
||||
end := start + 100
|
||||
for start := 0; start < len(requested); start += innerCodeReadBatchSize {
|
||||
end := start + innerCodeReadBatchSize
|
||||
if end > len(requested) {
|
||||
end = len(requested)
|
||||
}
|
||||
@@ -88,24 +116,7 @@ func PlanInnerCodeRecords(ctx context.Context, db *sql.DB, reader InnerCodeDetai
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
plans := planInnerCodeRowsWithReserved(records, stockIDsByOrder, detailsByID, reservedDetails)
|
||||
for _, plan := range plans {
|
||||
switch plan.Status {
|
||||
case model.InnerCodeReady:
|
||||
result.Ready++
|
||||
case model.InnerCodeAlreadyFilled:
|
||||
result.AlreadyFilled++
|
||||
case model.InnerCodeFailed:
|
||||
result.Failed++
|
||||
default:
|
||||
result.Skipped++
|
||||
}
|
||||
}
|
||||
if err := repository.SaveInnerCodePlans(db, plans, model.NowISO()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
return detailsByID, nil
|
||||
}
|
||||
|
||||
func uniqueInnerCodeOrders(records []model.InnerCodeRecord) []string {
|
||||
|
||||
Reference in New Issue
Block a user