Files
knowledge-governance/internal/qaopsmirror/master.go
T
姚章浩 00c4c13283
build / build (push) Successful in 1m19s
fix(qa): 首批即显并统一五字段后端筛选
列表正文改为按需读取;保留完整导出、版本隔离和有效标签筛选。
验证:前端全量、Go全量及隔离PG全mirror竞态通过;覆盖首批回调、续载失败与筛选分页。
2026-10-25 12:45:31 +08:00

75 lines
3.5 KiB
Go

package qaopsmirror
import (
"context"
"knowledge-governance/internal/dobotaiops"
"knowledge-governance/internal/qaopsfields"
"knowledge-governance/internal/qaopsquality"
"strings"
)
func (s *Store) ReadMasterDashboard(ctx context.Context, q dobotaiops.RecordQuery) (Dashboard, error) {
return s.readDashboard(ctx, q, true)
}
func (s *Store) MasterQualityStore() *qaopsquality.Store {
return qaopsquality.NewStore(s.pool, s.tenant+"::master")
}
const masterBaseSQL = `WITH records AS (SELECT id,asked_at,question||E'\n'||chinese_question||E'\n'||COALESCE(ai_fields->>'question_chinese','') AS question,status,identity,quality_hash,jsonb_set(payload,'{master_fields}',effective_fields)||jsonb_build_object('record_origin',origin,'background_tasks',background_tasks,'field_edit_revision',field_edit_revision,'feedback',current_feedback) AS payload FROM qa_ops_master_read_model WHERE tenant_key=$1)`
var masterMetadataBase = strings.NewReplacer("qa_ops_mirror_records", "qa_ops_master_read_model", "h.tenant_key=m.tenant_key", "h.tenant_key=m.tenant_key||'::master'", "m.question", "(m.question||E'\\n'||m.chinese_question||E'\\n'||COALESCE(m.ai_fields->>'question_chinese','')) AS question").Replace(localMetadataBase)
var masterSummarySQL = masterMetadataBase + ` SELECT count(*),'{}'::text,COALESCE(jsonb_agg(DISTINCT identity),'[]'::jsonb)::text,COALESCE(jsonb_agg(jsonb_build_object('id',id,'input_hash',quality_hash,'marker',marker,'source',source_coverage)),'[]'::jsonb)::text FROM records WHERE $5::text IS NOT NULL AND `
var masterQualityScopeSQL = masterMetadataBase + ` SELECT id,quality_hash,marker,source_coverage::text FROM records WHERE $5::text IS NOT NULL AND `
func (s *Store) ListMasterRecords(ctx context.Context, q dobotaiops.RecordQuery) (dobotaiops.RecordPage, error) {
q, err := s.resolveMasterFilters(ctx, q)
if err != nil {
return dobotaiops.RecordPage{}, err
}
var revision int64
repo := s.repositoryFor(&revision, true)
if q.Summary {
repo = repo.WithSummarySQL(masterMetadataBase + ` SELECT count(*),'{}'::text,'[]'::text,'[]'::text FROM records WHERE $5::text IS NOT NULL AND `)
}
p, e := repo.ListRecords(ctx, q)
if e == nil {
e = s.masterFiltersStillCurrent(ctx, q)
}
p.LocalRevision = revision
if e == nil {
for i := range p.Items {
projectLocalMaster(&p.Items[i])
}
}
p.Columns = []string{"question_chinese", "answer", "coverage", "is_correct", "product_category", "problem_type", "root_cause", "asked_at", "asker", "question", "language", "trigger_person", "department", "region", "feedback"}
return p, e
}
func (s *Store) ReadMasterQualityScope(ctx context.Context, q dobotaiops.RecordQuery) (dobotaiops.QualityScope, error) {
return s.repositoryFor(nil, true).ReadQualityScope(ctx, q)
}
func (s *Store) GetMasterRecord(ctx context.Context, tenant, id string) (dobotaiops.Record, error) {
item, err := s.repositoryFor(nil, true).GetRecord(ctx, tenant, id)
if err == nil {
projectLocalMaster(&item)
}
return item, err
}
func projectLocalMaster(item *dobotaiops.Record) {
fields := make(map[string]string, len(item.MasterFields)+2)
for key, value := range item.MasterFields {
fields[key] = value
}
code := qaopsfields.DetectLanguage(item.Question)
if strings.TrimSpace(fields["language"]) == "" {
fields["language"] = qaopsfields.LanguageName(code)
}
if strings.TrimSpace(fields["question_chinese"]) == "" && code == "zh" {
fields["question_chinese"] = item.Question
}
item.MasterFields = fields
item.Coverage = dobotaiops.CheckMasterCoverage(item.Answer, true)
}