This commit is contained in:
hailin 2025-06-20 14:03:11 +08:00
parent 0bc51062de
commit 9cefa09718
1 changed files with 59 additions and 13 deletions

View File

@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"intent-system/pkg/dal/models" "intent-system/pkg/dal/models"
"strings"
"github.com/civet148/log" "github.com/civet148/log"
"github.com/civet148/sqlca/v2" "github.com/civet148/sqlca/v2"
@ -400,8 +401,57 @@ func (dao *NewsDAO) QueryAsync(cond *NewsAsyncCondition) (dos []*models.NewsDO,
} }
// 一次 SQL 抓取该批 org_id对比 digest返回需要下发的记录 // 一次 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
// }
// // ② 一次 SQLSELECT * 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 { if len(pairs) == 0 {
return []*models.NewsDO{}, 0, nil return []*models.NewsDO{}, 0, nil
} }
@ -414,34 +464,30 @@ func (dao *NewsDAO) QueryAsyncBatch(pairs []OrgDigestPair) (dos []*models.NewsDO
clientDigest[p.OrgId] = p.Digest clientDigest[p.OrgId] = p.Digest
} }
// ② 一次 SQLSELECT * FROM news WHERE org_id IN ( … ) // ② 构造 IN (1,2,3...) 的 SQL
var rows []*models.NewsDO placeholders := make([]string, 0, len(orgIDs))
// 显式展开 orgIDs
idArgs := make([]interface{}, 0, len(orgIDs))
for _, id := range 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. _, err = dao.db.
Model(&rows). Model(&rows).
Table(models.TableNameNews). Table(models.TableNameNews).
Where("org_id IN (?)", idArgs...). // 显式展开 Where(inClause).
Query() Query()
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err
} }
// ③ Go 层比对 digest // ③ Go 层比对 digest
for _, row := range rows { for _, row := range rows {
cDigest := clientDigest[row.OrgId] // 客户端传来的 digest cDigest := clientDigest[row.OrgId]
// 直接从 map[string]interface{} 里取
var sDigest string var sDigest string
if d, ok := row.ExtraData["digest"].(string); ok { if d, ok := row.ExtraData["digest"].(string); ok {
sDigest = d sDigest = d
} }
// cDigest 为空 或 与服务器端不同,都需要下发
if cDigest == "" || cDigest != sDigest { if cDigest == "" || cDigest != sDigest {
dos = append(dos, row) dos = append(dos, row)
} }