feat: 支持顺运宝多订单号搜索 (#217)

This commit is contained in:
chengma
2026-08-13 14:58:19 +08:00
parent 2ebe6bf695
commit 8f2b3f725d
13 changed files with 372 additions and 46 deletions
+34 -7
View File
@@ -530,18 +530,21 @@ func nullableText(s string) any {
// SybOrderFilter 是货运单列表页支持的筛选条件。
type SybOrderFilter struct {
Keyword string // 匹配订单号或商品标题
Shop string // 店铺名模糊匹配;空字符串表示全部
Stage string // 处理阶段;空字符串表示全部
OrderNos []string // 订单号精确匹配;多个值之间是 OR,空切片表示全部
Shop string // 店铺名模糊匹配;空字符串表示全部
Stage string // 处理阶段;空字符串表示全部
}
func sybOrderFilterClause(filter SybOrderFilter) (string, []any) {
var clauses []string
var args []any
if kw := filter.Keyword; kw != "" {
like := "%" + escapeLike(kw) + "%"
clauses = append(clauses, `(so.order_no LIKE ? ESCAPE '!' OR so.title LIKE ? ESCAPE '!')`)
args = append(args, like, like)
if len(filter.OrderNos) > 0 {
placeholders := make([]string, len(filter.OrderNos))
for i, orderNo := range filter.OrderNos {
placeholders[i] = "?"
args = append(args, orderNo)
}
clauses = append(clauses, `so.order_no IN (`+strings.Join(placeholders, ",")+`)`)
}
if shop := strings.TrimSpace(filter.Shop); shop != "" {
clauses = append(clauses, `so.shop_name LIKE ? ESCAPE '!'`)
@@ -752,6 +755,30 @@ func CountSybOrders(q Execer, filter SybOrderFilter) (int, error) {
return n, nil
}
// ListMatchedSybOrderNos 返回当前可由 SQL 表达的组合筛选实际命中的订单号。
// 页面用它区分“输入了多少订单”和“命中了多少商品明细”;查询继续复用
// idx_syb_orders_order,所有订单号都通过占位符传入。
func ListMatchedSybOrderNos(q Execer, filter SybOrderFilter) ([]string, error) {
if len(filter.OrderNos) == 0 {
return nil, nil
}
where, args := sybOrderFilterClause(filter)
rows, err := q.Query(`SELECT DISTINCT so.order_no`+sybOrderContextFrom+where+` ORDER BY so.order_no`, args...)
if err != nil {
return nil, fmt.Errorf("查询顺运宝命中订单号失败: %w", err)
}
defer rows.Close()
matched := make([]string, 0, len(filter.OrderNos))
for rows.Next() {
var orderNo string
if err := rows.Scan(&orderNo); err != nil {
return nil, fmt.Errorf("读取顺运宝命中订单号失败: %w", err)
}
matched = append(matched, orderNo)
}
return matched, rows.Err()
}
// CountSybOrdersTotal 统计全部货运单明细数量(不带筛选),
// 供列表页判断"是否已经同步过任何数据"。
func CountSybOrdersTotal(q Execer) (int, error) {