20260923165454

This commit is contained in:
oneao committed 2026-09-23 16:54:54 +08:00
1 parent 0abe3706c8
commit e6935b8fa4
173 files changed
+14975 -2295

No files matched your search

@@ -24,6 +24,7 @@ import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
@@ -325,13 +326,21 @@ public class ExportService {
: requestedOrderBy.trim();
if (orderBy == null || orderBy.isBlank()) {
orderBy = schema.keyField() == null ? null : schema.keyField() + " ASC";
} else if (schema.keyField() != null) {
} else if (schema.keyField() != null && !sortsBy(orderBy, schema.keyField())) {
// 相同排序值以主键打破平局,明细、区间合计与各卷使用同一行顺序。
// 排序子句里已经有主键时不能再追加:同一列出现两次,SQL Server 会直接报错。
orderBy += ", " + schema.keyField() + " ASC";
}
return orderBy == null ? null : dbUtils.buildSafeOrderBy(orderBy);
}
/** 排序子句是否已经排过该列(取每段的首个词,忽略 ASC/DESC) */
private boolean sortsBy(String orderBy, String field) {
return Arrays.stream(orderBy.split(","))
.map(part -> part.trim().split("\\s+")[0])
.anyMatch(name -> name.equalsIgnoreCase(field));
}
String buildSelectSql(
ExportSchema schema,
List<ExportColumn> columns,
@@ -118,6 +118,14 @@ class ExportServiceTests {
assertThat(service.resolveOrderSql(schema("", List.of(leaf("b_name"))), null)).isEqualTo("[b_id] ASC");
}
@Test
void 排序已含主键时不再追加主键() {
// ORDER BY 同一列出现两次会被 SQL Server 拒绝(v_wf_definition 的 b_order_sql 就是 b_id ASC)
ExportSchema schema = schema("b_id ASC", List.of(leaf("b_name")));
assertThat(service.resolveOrderSql(schema, null)).isEqualTo("[b_id] ASC");
assertThat(service.resolveOrderSql(schema, "b_module_id ASC, b_id DESC")).isEqualTo("[b_module_id] ASC, [b_id] DESC");
}
@Test
void 不完整或逆序区间不能退化成全部导出() {
ExportSchema schema = schema(null, List.of(leaf("b_name")));