feat: 支持顺运宝多订单号搜索 (#217)
This commit is contained in:
+34
-7
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user