|
|
@@ -1,22 +1,187 @@
|
|
|
package com.uas.eis.sdk.dto;
|
|
|
|
|
|
|
|
|
-import com.fasterxml.jackson.annotation.JsonProperty;
|
|
|
+import com.uas.eis.utils.CollectionUtil;
|
|
|
+import com.uas.eis.utils.StringUtil;
|
|
|
import lombok.Data;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.sql.*;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
@Data
|
|
|
public class QueryListReq {
|
|
|
- private String code; //表单名称
|
|
|
- @JsonProperty("FieldKeys")
|
|
|
- private String fieldKeys; //字段名
|
|
|
- @JsonProperty("FilterString")
|
|
|
- private String filterString; //过滤条件
|
|
|
- @JsonProperty("OrderString")
|
|
|
- private String orderString; //排序条件
|
|
|
- @JsonProperty("TopRowCount")
|
|
|
- private Integer topRowCount = 0; //返回记录行数,0 不限制
|
|
|
- @JsonProperty("StartRow")
|
|
|
- private Integer startRow = 0; //起始行数(分页显示用) 0 默认从第一行记录
|
|
|
- @JsonProperty("Limit")
|
|
|
- private Integer limit = 2000; //最多行数 默认2000
|
|
|
+ private String code; //表单caller
|
|
|
+ private QueryListObj data;
|
|
|
+ @Data
|
|
|
+ public static class QueryListObj {
|
|
|
+ private Integer pageNum = 0; //返回记录行数,0 不限制
|
|
|
+ private Integer pageSize = 0; //起始行数(分页显示用) 0 默认从第一行记录
|
|
|
+ private List<Filter> filters ;
|
|
|
+ private List<SortBy> sortBy;
|
|
|
+
|
|
|
+ @Data
|
|
|
+ public static class Filter {
|
|
|
+ private String field; //筛选字段名
|
|
|
+ private String operator; //操作符(见下方列表)
|
|
|
+ private Object value; //单个值(eq/like/gt等时使用
|
|
|
+ /*
|
|
|
+ * ### operator 操作符枚举
|
|
|
+ | 操作符 | 说明 | SQL对应 | value示例 | values示例 |
|
|
|
+ |--------|------|---------|-----------|------------|
|
|
|
+ | `eq` | 等于 | `=` | `1` | - |
|
|
|
+ | `ne` | 不等于 | `!=` | `1` | - |
|
|
|
+ | `gt` | 大于 | `>` | `100` | - |
|
|
|
+ | `ge` | 大于等于 | `>=` | `100` | - |
|
|
|
+ | `lt` | 小于 | `<` | `100` | - |
|
|
|
+ | `le` | 小于等于 | `<=` | `100` | - |
|
|
|
+ | `like` | 模糊匹配 | `LIKE %value%` | `"张三"` | - |
|
|
|
+ | `in` | 在列表中 | `IN (...)` | - | `[1, 2, 3]` |
|
|
|
+ | `between` | 在范围内 | `BETWEEN ... AND ...` | - | `[18, 30]` |
|
|
|
+ * */
|
|
|
+ private List<Object> values; //多个值(in/between时使用)
|
|
|
+ /** 针对 `sortBy` 参数说明
|
|
|
+ | 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
|
|
+ |--------|------|------|--------|------|
|
|
|
+ | `sortField` | string | 否 | - | 排序字段名 |
|
|
|
+ | `sortOrder` | string | 否 | asc | 排序方向:`asc`(升序)/ `desc`(降序) |
|
|
|
+ * */
|
|
|
+ }
|
|
|
+
|
|
|
+ @Data
|
|
|
+ public static class SortBy {
|
|
|
+ String sortField;//排序字段名
|
|
|
+ String sortOrder;//排序方向:`asc`(升序)/ `desc`(降序)
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getOrderBy() {
|
|
|
+ if (sortBy == null || sortBy.isEmpty()) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ StringBuffer orderBy = new StringBuffer(" order by ");
|
|
|
+ for (SortBy sortByItem : sortBy) {
|
|
|
+ orderBy.append(sortByItem.getSortField()).append(" ").append(StringUtil.nvl(sortByItem.getSortOrder(),"asc"));
|
|
|
+ }
|
|
|
+ return orderBy.toString();
|
|
|
+ }
|
|
|
+ public class FilterResult {
|
|
|
+ private String whereClause;
|
|
|
+ private List<Object> parameters;
|
|
|
+
|
|
|
+ public FilterResult(String whereClause, List<Object> parameters) {
|
|
|
+ this.whereClause = whereClause;
|
|
|
+ this.parameters = parameters;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getWhereClause() { return whereClause; }
|
|
|
+ public List<Object> getParameters() { return parameters; }
|
|
|
+ }
|
|
|
+ public FilterResult buildWhereClause() {
|
|
|
+ if (filters == null || filters.isEmpty()) {
|
|
|
+ return new FilterResult("", new ArrayList<>());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> conditions = new ArrayList<>();
|
|
|
+ List<Object> parameters = new ArrayList<>();
|
|
|
+
|
|
|
+ for (Filter filter : filters) {
|
|
|
+ String condition = buildSingleCondition(filter, parameters);
|
|
|
+ if (condition != null && !condition.isEmpty()) {
|
|
|
+ conditions.add(condition);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ String whereClause = conditions.isEmpty() ? "" : " " + String.join(" AND ", conditions);
|
|
|
+ return new FilterResult(whereClause, parameters);
|
|
|
+ }
|
|
|
+ private String buildSingleCondition(Filter filter, List<Object> parameters) {
|
|
|
+ String field = filter.getField();
|
|
|
+ String operator = filter.getOperator();
|
|
|
+ Object value = filter.getValue();
|
|
|
+ List<Object> values = filter.getValues();
|
|
|
+
|
|
|
+ if (field == null || field.isEmpty() || operator == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 验证字段名
|
|
|
+ if (!field.matches("^[a-zA-Z0-9_]+$")) {
|
|
|
+ throw new IllegalArgumentException("Invalid field name: " + field);
|
|
|
+ }
|
|
|
+
|
|
|
+ String paramPlaceholder = "?"; // Oracle使用?作为参数占位符
|
|
|
+
|
|
|
+ switch (operator.toLowerCase()) {
|
|
|
+ case "eq":
|
|
|
+ if (value == null) {
|
|
|
+ return field + " IS NULL";
|
|
|
+ }
|
|
|
+ parameters.add(value);
|
|
|
+ return field + " = " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "ne":
|
|
|
+ if (value == null) {
|
|
|
+ return field + " IS NOT NULL";
|
|
|
+ }
|
|
|
+ parameters.add(value);
|
|
|
+ return field + " != " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "gt":
|
|
|
+ if (value == null) return null;
|
|
|
+ parameters.add(value);
|
|
|
+ return field + " > " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "ge":
|
|
|
+ if (value == null) return null;
|
|
|
+ parameters.add(value);
|
|
|
+ return field + " >= " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "lt":
|
|
|
+ if (value == null) return null;
|
|
|
+ parameters.add(value);
|
|
|
+ return field + " < " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "le":
|
|
|
+ if (value == null) return null;
|
|
|
+ parameters.add(value);
|
|
|
+ return field + " <= " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "like":
|
|
|
+ if (value == null) return null;
|
|
|
+ // Oracle LIKE 使用 % 作为通配符
|
|
|
+ parameters.add("%" + value + "%");
|
|
|
+ return field + " LIKE " + paramPlaceholder;
|
|
|
+
|
|
|
+ case "in":
|
|
|
+ if (values == null || values.isEmpty()) return null;
|
|
|
+ List<String> placeholders = new ArrayList<>();
|
|
|
+ for (Object v : values) {
|
|
|
+ placeholders.add(paramPlaceholder);
|
|
|
+ parameters.add(v);
|
|
|
+ }
|
|
|
+ return field + " IN (" + String.join(", ", placeholders) + ")";
|
|
|
+
|
|
|
+ case "between":
|
|
|
+ if (values == null || values.size() < 2) return null;
|
|
|
+ Object start = values.get(0);
|
|
|
+ Object end = values.get(1);
|
|
|
+ if (start == null || end == null) return null;
|
|
|
+ parameters.add(start);
|
|
|
+ parameters.add(end);
|
|
|
+ return field + " BETWEEN " + paramPlaceholder + " AND " + paramPlaceholder;
|
|
|
+
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException("Unsupported operator: " + operator);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|