From 9cefa097181300fe5386834e58d591cce76b316d Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 20 Jun 2025 14:03:11 +0800 Subject: [PATCH] . --- pkg/dal/dao/news.go | 72 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 13 deletions(-) diff --git a/pkg/dal/dao/news.go b/pkg/dal/dao/news.go index 05da3a6..2ce23a9 100644 --- a/pkg/dal/dao/news.go +++ b/pkg/dal/dao/news.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "intent-system/pkg/dal/models" + "strings" "github.com/civet148/log" "github.com/civet148/sqlca/v2" @@ -400,8 +401,57 @@ func (dao *NewsDAO) QueryAsync(cond *NewsAsyncCondition) (dos []*models.NewsDO, } // 一次 SQL 抓取该批 org_id,对比 digest,返回需要下发的记录 -func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO, total int64, err error) { +// func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO, total int64, err error) { +// if len(pairs) == 0 { +// return []*models.NewsDO{}, 0, nil +// } + +// // ① 提取 org_id 列表,同时建映射表 clientDigest[org_id] = digest +// orgIDs := make([]int64, 0, len(pairs)) +// clientDigest := make(map[int64]string, len(pairs)) +// for _, p := range pairs { +// orgIDs = append(orgIDs, p.OrgId) +// clientDigest[p.OrgId] = p.Digest +// } + +// // ② 一次 SQL:SELECT * FROM news WHERE org_id IN ( … ) +// var rows []*models.NewsDO +// // 显式展开 orgIDs +// idArgs := make([]interface{}, 0, len(orgIDs)) +// for _, id := range orgIDs { +// idArgs = append(idArgs, id) +// } + +// _, err = dao.db. +// Model(&rows). +// Table(models.TableNameNews). +// Where("org_id IN (?)", idArgs...). // 显式展开 +// Query() +// if err != nil { +// return nil, 0, err +// } + +// // ③ 在 Go 层比对 digest +// for _, row := range rows { +// cDigest := clientDigest[row.OrgId] // 客户端传来的 digest + +// // 直接从 map[string]interface{} 里取 +// var sDigest string +// if d, ok := row.ExtraData["digest"].(string); ok { +// sDigest = d +// } + +// // cDigest 为空 或 与服务器端不同,都需要下发 +// if cDigest == "" || cDigest != sDigest { +// dos = append(dos, row) +// } +// } + +// return dos, int64(len(dos)), nil +// } + +func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO, total int64, err error) { if len(pairs) == 0 { return []*models.NewsDO{}, 0, nil } @@ -414,34 +464,30 @@ func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO clientDigest[p.OrgId] = p.Digest } - // ② 一次 SQL:SELECT * FROM news WHERE org_id IN ( … ) - var rows []*models.NewsDO - // 显式展开 orgIDs - idArgs := make([]interface{}, 0, len(orgIDs)) + // ② 构造 IN (1,2,3...) 的 SQL + placeholders := make([]string, 0, len(orgIDs)) for _, id := range orgIDs { - idArgs = append(idArgs, id) + placeholders = append(placeholders, fmt.Sprintf("%d", id)) } + inClause := fmt.Sprintf("org_id IN (%s)", strings.Join(placeholders, ",")) + var rows []*models.NewsDO _, err = dao.db. Model(&rows). Table(models.TableNameNews). - Where("org_id IN (?)", idArgs...). // 显式展开 + Where(inClause). Query() if err != nil { return nil, 0, err } - // ③ 在 Go 层比对 digest + // ③ Go 层比对 digest for _, row := range rows { - cDigest := clientDigest[row.OrgId] // 客户端传来的 digest - - // 直接从 map[string]interface{} 里取 + cDigest := clientDigest[row.OrgId] var sDigest string if d, ok := row.ExtraData["digest"].(string); ok { sDigest = d } - - // cDigest 为空 或 与服务器端不同,都需要下发 if cDigest == "" || cDigest != sDigest { dos = append(dos, row) }