00c4c13283
build / build (push) Successful in 1m19s
列表正文改为按需读取;保留完整导出、版本隔离和有效标签筛选。 验证:前端全量、Go全量及隔离PG全mirror竞态通过;覆盖首批回调、续载失败与筛选分页。
75 lines
3.5 KiB
Go
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)
|
|
}
|