Files
knowledge-governance/internal/qaopsmirror/master_quality.go
T
姚章浩 2c0bb32183
build / build (push) Successful in 1m11s
fix(qaops): 点踩问题统一判为不正确
通过持久来源关联读取最新本地反馈,强制总表有效正确性为否,保留原问答和人工证据。统一列表、详情、指标和两阶段读取的反馈快照,拒绝冲突选择并保留其他字段编辑。已通过完整本地门禁、隔离PG竞态和真实恢复库52条点踩逐条读回、桌面及手机验收;未调用模型或连接源生产库。
2026-10-20 08:18:03 +08:00

70 lines
2.2 KiB
Go

package qaopsmirror
import (
"context"
"encoding/json"
"github.com/jackc/pgx/v5"
"knowledge-governance/internal/dobotaiops"
"knowledge-governance/internal/qaopsquality"
)
func (s *Store) ReadMasterQualityViews(ctx context.Context, keys []dobotaiops.QualityKey) (map[string]qaopsquality.View, error) {
if !s.valid() {
return nil, dobotaiops.ErrUnavailable
}
tx, err := s.pool.BeginTx(ctx, pgx.TxOptions{IsoLevel: pgx.RepeatableRead, AccessMode: pgx.ReadOnly})
if err != nil {
return nil, dobotaiops.ErrUnavailable
}
defer tx.Rollback(context.Background())
views, err := s.MasterQualityStore().ReadViewsInTx(ctx, tx, keys)
if err != nil {
return nil, err
}
ids := make([]string, 0, len(keys))
hashes := map[string]string{}
for _, key := range keys {
ids = append(ids, key.ID)
hashes[key.ID] = key.InputHash
}
rows, err := tx.Query(ctx, `SELECT id,quality_hash,effective_fields,coverage_result,inline_fields,current_feedback FROM qa_ops_master_read_model WHERE tenant_key=$1 AND id=ANY($2::text[])`, s.tenant, ids)
if err != nil {
return nil, dobotaiops.ErrUnavailable
}
count := 0
for rows.Next() {
var id, hash string
var rawFields, rawCoverage, rawEdits, rawFeedback []byte
var feedback dobotaiops.RecordFeedback
var fields, edits map[string]string
var coverage dobotaiops.CoverageCheck
if rows.Scan(&id, &hash, &rawFields, &rawCoverage, &rawEdits, &rawFeedback) != nil || json.Unmarshal(rawFields, &fields) != nil || json.Unmarshal(rawCoverage, &coverage) != nil || json.Unmarshal(rawEdits, &edits) != nil || json.Unmarshal(rawFeedback, &feedback) != nil {
rows.Close()
return nil, dobotaiops.ErrUnavailable
}
if hashes[id] != hash {
rows.Close()
return nil, qaopsquality.ErrConflict
}
view, ok := views[id]
if !ok {
rows.Close()
return nil, qaopsquality.ErrUnavailable
}
views[id] = qaopsquality.ProjectMasterWithEdits(view, fields, coverage, edits, feedback)
count++
}
err = rows.Err()
rows.Close()
if err != nil {
return nil, dobotaiops.ErrUnavailable
}
if count != len(hashes) {
return nil, qaopsquality.ErrNotFound
}
if tx.Commit(ctx) != nil {
return nil, dobotaiops.ErrUnavailable
}
return views, nil
}