87f97a2f9b
build / build (push) Successful in 1m7s
详情使用共享主表字典,稀疏修改所选字段并保留原始问答及旧复核审计。 月周统计提供文本和下拉双入口;每租户每周一份持久草稿,按技能六节双语模板真实预填。 加入幂等自动保存、冲突保留、未知响应重试、切周及离开保护和schema58非破坏降级保护。 验证:完整make verify、隔离PostgreSQL全mirror竞态回归、真实恢复库浏览器验收通过。 浏览器实测字段精确读回、月周双输入、模板预填、MD/CSV、自动保存、冲突、失败重试与API重启恢复。 未连接或改写DobotAI生产源库,未运行付费模型;提交时尚未部署。
69 lines
2.0 KiB
Go
69 lines
2.0 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 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 []byte
|
|
var fields, edits map[string]string
|
|
var coverage dobotaiops.CoverageCheck
|
|
if rows.Scan(&id, &hash, &rawFields, &rawCoverage, &rawEdits) != nil || json.Unmarshal(rawFields, &fields) != nil || json.Unmarshal(rawCoverage, &coverage) != nil || json.Unmarshal(rawEdits, &edits) != 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)
|
|
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
|
|
}
|