fieldConditions) {
+ if (filterArray == null || filterArray.isEmpty()) {
+ return;
+ }
+
+ int i = 0;
+
+ while (i < filterArray.size()) {
+ Object item = filterArray.get(i);
+
+ // 跳过逻辑运算符 [ "and" ] 或 [ "or" ]
+ if (item instanceof JSONArray) {
+ JSONArray subArray = (JSONArray) item;
+ if (isLogicalOperator(subArray)) {
+ i++;
+ continue;
+ }
+
+ // 判断是否是条件数组 [ "field", "operator", "value", "type" ]
+ if (isConditionArray(subArray)) {
+ String field = subArray.get(0).toString();
+ String operator = subArray.get(1).toString();
+ String value = subArray.get(2).toString();
+ String valueType = subArray.size() > 3 ? subArray.get(3).toString() : "string";
+
+ // 生成SQL条件片段
+ String sqlCondition = buildSingleCondition(field, operator, value, valueType);
+
+ // 统一转换为大写作为key
+ String fieldKey = field.toUpperCase();
+
+ // 如果该字段已存在条件,则用 AND 连接
+ if (fieldConditions.containsKey(fieldKey)) {
+ fieldConditions.put(fieldKey, fieldConditions.get(fieldKey) + " AND " + sqlCondition);
+ } else {
+ fieldConditions.put(fieldKey, sqlCondition);
+ }
+ i++;
+ continue;
+ }
+ }
+
+ i++;
+ }
+ }
+
+ /**
+ * 判断数组是否是逻辑运算符
+ *
+ * @param array 待判断的数组
+ * @return true表示是逻辑运算符数组
+ */
+ private static boolean isLogicalOperator(JSONArray array) {
+ if (array.size() == 1) {
+ String value = array.get(0).toString().toLowerCase();
+ return "and".equals(value) || "or".equals(value);
+ }
+ return false;
+ }
+
+ /**
+ * 判断数组是否是条件数组
+ * 条件数组格式: [ "field", "operator", "value", "type" ]
+ *
+ * @param array 待判断的数组
+ * @return true表示是条件数组
+ */
+ private static boolean isConditionArray(JSONArray array) {
+ return array.size() >= 3 && array.size() <= 4;
+ }
+
+ /**
+ * 转换操作符为标准SQL操作符
+ *
+ * @param operator 原始操作符
+ * @return SQL操作符
+ */
+ private static String convertOperator(String operator) {
+ if (operator == null) {
+ return "=";
+ }
+
+ switch (operator.toLowerCase()) {
+ case "=":
+ return "=";
+ case "<>":
+ case "!=":
+ return "<>";
+ case ">":
+ return ">";
+ case ">=":
+ return ">=";
+ case "<":
+ return "<";
+ case "<=":
+ return "<=";
+ case "contains":
+ return "LIKE";
+ case "startswith":
+ return "LIKE";
+ case "endswith":
+ return "LIKE";
+ case "in":
+ return "IN";
+ case "not in":
+ return "NOT IN";
+ case "between":
+ return "BETWEEN";
+ default:
+ return operator;
+ }
+ }
+
+ /**
+ * 根据值类型格式化SQL值
+ *
+ * @param value 原始值
+ * @param valueType 值类型 (string, number, date, boolean等)
+ * @param operator SQL操作符
+ * @return 格式化后的SQL值
+ */
+ private static String formatValue(String value, String valueType, String operator) {
+ if (value == null || "null".equalsIgnoreCase(value)) {
+ return "NULL";
+ }
+
+ // 处理IN操作符
+ if ("IN".equals(operator) || "NOT IN".equals(operator)) {
+ return formatInValue(value, valueType);
+ }
+
+ // 处理BETWEEN操作符(非日期类型)
+ if ("BETWEEN".equals(operator) && !isDateType(valueType)) {
+ return formatBetweenValue(value, valueType);
+ }
+
+ // 处理LIKE操作符
+ if ("LIKE".equals(operator)) {
+ return formatLikeValue(value, valueType);
+ }
+
+ // 根据类型格式化
+ if (isDateType(valueType)) {
+ return formatDateTimeValue(value);
+ }
+
+ switch (valueType.toLowerCase()) {
+ case "string":
+ return "'" + escapeSqlString(value) + "'";
+ case "number":
+ case "int":
+ case "integer":
+ case "double":
+ case "float":
+ case "decimal":
+ return value;
+ case "boolean":
+ return Boolean.parseBoolean(value) ? "1" : "0";
+ default:
+ return "'" + escapeSqlString(value) + "'";
+ }
+ }
+
+ /**
+ * 判断是否为日期类型
+ *
+ * @param valueType 值类型
+ * @return true表示是日期类型
+ */
+ private static boolean isDateType(String valueType) {
+ if (valueType == null) {
+ return false;
+ }
+ String type = valueType.toLowerCase();
+ return "date".equals(type) || "datetime".equals(type) || "timestamp".equals(type);
+ }
+
+ /**
+ * 格式化IN操作符的值
+ *
+ * @param value 原始值
+ * @param valueType 值类型
+ * @return 格式化后的IN值列表
+ */
+ private static String formatInValue(String value, String valueType) {
+ // 假设值是逗号分隔的
+ String[] values = value.split(",");
+ StringBuilder result = new StringBuilder("(");
+
+ for (int i = 0; i < values.length; i++) {
+ if (i > 0) {
+ result.append(", ");
+ }
+ String v = values[i].trim();
+ if (isDateType(valueType)) {
+ result.append(formatDateTimeValue(v));
+ } else if ("string".equalsIgnoreCase(valueType)) {
+ result.append("'").append(escapeSqlString(v)).append("'");
+ } else {
+ result.append(v);
+ }
+ }
+
+ result.append(")");
+ return result.toString();
+ }
+
+ /**
+ * 格式化BETWEEN操作符的值(非日期类型)
+ *
+ * @param value 原始值(两个值用逗号分隔)
+ * @param valueType 值类型
+ * @return 格式化后的BETWEEN值
+ */
+ private static String formatBetweenValue(String value, String valueType) {
+ String[] values = value.split(",");
+ if (values.length != 2) {
+ return value;
+ }
+
+ String startValue = values[0].trim();
+ String endValue = values[1].trim();
+
+ String formattedStart = formatSingleValue(startValue, valueType);
+ String formattedEnd = formatSingleValue(endValue, valueType);
+
+ return formattedStart + " AND " + formattedEnd;
+ }
+
+ /**
+ * 格式化LIKE操作符的值
+ *
+ * @param value 原始值
+ * @param valueType 值类型
+ * @return 格式化后的LIKE值
+ */
+ private static String formatLikeValue(String value, String valueType) {
+ // LIKE操作通常需要添加通配符
+ if (!value.contains("%")) {
+ value = "%" + value + "%";
+ }
+ return "'" + escapeSqlString(value) + "'";
+ }
+
+ /**
+ * 格式化单个值
+ *
+ * @param value 原始值
+ * @param valueType 值类型
+ * @return 格式化后的值
+ */
+ private static String formatSingleValue(String value, String valueType) {
+ if (isDateType(valueType)) {
+ return formatDateTimeValue(value);
+ } else if ("string".equalsIgnoreCase(valueType)) {
+ return "'" + escapeSqlString(value) + "'";
+ } else {
+ return value;
+ }
+ }
+
+ /**
+ * 转义SQL字符串中的特殊字符
+ *
+ * @param value 原始字符串
+ * @return 转义后的字符串
+ */
+ private static String escapeSqlString(String value) {
+ if (value == null) {
+ return "";
+ }
+ // 转义单引号
+ return value.replace("'", "''");
+ }
+
+
+
/**
* 通用请求 DTO(用于承载分页与分组信息)。
*
diff --git a/backend/src/main/resources/application-devtw.yml b/backend/src/main/resources/application-devtw.yml
index f59a149..be7a29c 100644
--- a/backend/src/main/resources/application-devtw.yml
+++ b/backend/src/main/resources/application-devtw.yml
@@ -39,6 +39,23 @@ logging:
swagger-ui:
enabled: true
+mybatis-plus:
+ mapper-locations: classpath*:**/mapper/*Mapper.xml,classpath*:**/mapping/*Mapper.xml
+ global-config:
+ banner: false
+ db-config:
+ id-type: ASSIGN_ID
+ insert-strategy: not_null
+ update-strategy: not_null
+ select-strategy: not_empty
+ table-underline: true
+ logic-delete-value: 1
+ logic-not-delete-value: 0
+ logic-delete-field: isDeleted
+ configuration:
+ map-underscore-to-camel-case: true
+ cache-enabled: false
+ log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
# 登录相关配置
login: