diff --git a/packscript.txt b/packscript.txt new file mode 100644 index 0000000..fdd628a --- /dev/null +++ b/packscript.txt @@ -0,0 +1 @@ +jar cf chenyonUtils.jar -C ChenyonUtils . \ No newline at end of file diff --git a/src/main/java/com/seeyon/utils/form/ClauseFactor.java b/src/main/java/com/seeyon/utils/form/ClauseFactor.java index b4d2207..124b9de 100644 --- a/src/main/java/com/seeyon/utils/form/ClauseFactor.java +++ b/src/main/java/com/seeyon/utils/form/ClauseFactor.java @@ -13,7 +13,10 @@ public enum ClauseFactor { AND, OR, IN, - NOT_IN + NOT_IN, + FIND_IN_SET, + REGEXP, + BETWEEN ; diff --git a/src/main/java/com/seeyon/utils/form/EnumMapUtils.java b/src/main/java/com/seeyon/utils/form/EnumMapUtils.java index 75f1935..8359ebe 100644 --- a/src/main/java/com/seeyon/utils/form/EnumMapUtils.java +++ b/src/main/java/com/seeyon/utils/form/EnumMapUtils.java @@ -25,6 +25,7 @@ public class EnumMapUtils { } return getEnumItemValueByEnumId(targetValue, beanByDisplay.getEnumId()); } catch (Exception e) { + e.printStackTrace(); return null; } } @@ -43,10 +44,10 @@ public class EnumMapUtils { return null; } Map map = list.get(0); - enumId = (Long)map.get("ID"); + enumId = (Long)map.get("id"); return enumId == null ? "" : enumId + ""; } catch (Exception e) { - + e.printStackTrace(); }finally { agent.close(); } @@ -68,13 +69,13 @@ public class EnumMapUtils { return null; } Map map = list.get(0); - enumId = (Long)map.get("ID"); + enumId = (Long)map.get("id"); } catch (Exception e) { return null; }finally { agent.close(); } - EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + EnumManager enumManagerNew = getEnumManager(); CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); if(ctpEnumBean == null) { return null; @@ -98,27 +99,136 @@ public class EnumMapUtils { if(beanByDisplay == null || beanByDisplay.getEnumId() == 0l) { return set; } - EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); - CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(beanByDisplay.getEnumId()); - - if(ctpEnumBean == null) { + CtpEnumBean ctpEnumBean = getEnumManager().getEnum(beanByDisplay.getEnumId()); + if(ctpEnumBean == null || ctpEnumBean.getItems() == null) { return set; } - List ctpEnumItems = ctpEnumBean.getItems(); - if(ctpEnumBean.getItems() == null) { - return set; - } - for (CtpEnumItem enumItem : ctpEnumItems) { + System.out.println("有" + ctpEnumBean.getItems().size() +"枚举子项"); + for (CtpEnumItem enumItem : ctpEnumBean.getItems()) { set.add(enumItem.getShowvalue()); } } catch (Exception e) { - + e.printStackTrace(); } return set; } + private static EnumManager getEnumManager() { + return (EnumManager) AppContext.getBean("enumManagerNew"); + } + + public static Map getEnumItemMap(FormTableBean formTableBean, String fieldDisplay) { + Map map = new HashMap<>(); + try { + FormFieldBean beanByDisplay = formTableBean.getFieldBeanByDisplay(fieldDisplay); + if(beanByDisplay == null || beanByDisplay.getEnumId() == 0l) { + return map; + } + EnumManager enumManagerNew = getEnumManager(); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(beanByDisplay.getEnumId()); + + if(ctpEnumBean == null) { + return map; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return map; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + map.put(enumItem.getShowvalue(),enumItem); + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + public static Map getRootEnumItemMap(FormTableBean formTableBean, String fieldDisplay) { + Map map = new HashMap<>(); + try { + FormFieldBean beanByDisplay = formTableBean.getFieldBeanByDisplay(fieldDisplay); + if(beanByDisplay == null || beanByDisplay.getEnumId() == 0l) { + return map; + } + EnumManager enumManagerNew = getEnumManager(); + CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(beanByDisplay.getEnumId()); + + if(ctpEnumBean == null) { + return map; + } + List ctpEnumItems = ctpEnumBean.getItems(); + if(ctpEnumBean.getItems() == null) { + return map; + } + for (CtpEnumItem enumItem : ctpEnumItems) { + if(enumItem.getLevelNum() == 0) { + map.put(enumItem.getShowvalue(),enumItem); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } + + public static Map getEnumItemMap(String pItemId) { + Map resultMap = new HashMap<>(); + + // 空参数直接返回空map + if (StringUtils.isBlank(pItemId)) { + return resultMap; + } + + final String sql = "SELECT * FROM ctp_enum_item WHERE PARENT_ID = ?"; + JDBCAgent agent = null; + + try { + agent = new JDBCAgent(); + agent.execute(sql, pItemId); + + // 安全获取结果,不强制泛型 + List resultList = agent.resultSetToList(); + if (resultList == null || resultList.isEmpty()) { + return resultMap; // 统一返回空map,不返回null + } + + // 遍历并安全封装 + for (Object obj : resultList) { + if (!(obj instanceof Map)) { + continue; + } + + Map itemMap = (Map) obj; + Object showValueObj = itemMap.get("showvalue"); + + // showvalue 为null 跳过,不生成脏key + if (showValueObj == null) { + continue; + } + + String key = showValueObj.toString().trim(); + resultMap.put(key, itemMap); + } + + } catch (Exception e) { + // 必须打日志!! + e.printStackTrace(); + } finally { + // 安全关闭,避免空指针 & 关闭异常覆盖业务异常 + if (agent != null) { + try { + agent.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + return resultMap; + } + public static String getEnumItemValueByEnumId(String showValue,long enumId) { - EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + EnumManager enumManagerNew = getEnumManager(); CtpEnumBean ctpEnumBean = enumManagerNew.getEnum(enumId); if(ctpEnumBean == null) { return null; @@ -143,7 +253,7 @@ public class EnumMapUtils { if(temp == null) { return null; } - EnumManager enumManagerNew = (EnumManager) AppContext.getBean("enumManagerNew"); + EnumManager enumManagerNew = getEnumManager(); CtpEnumItem ctpEnumItem = enumManagerNew.getCtpEnumItem(temp); if(ctpEnumItem == null) { return null; diff --git a/src/main/java/com/seeyon/utils/form/FormTableExecutor.java b/src/main/java/com/seeyon/utils/form/FormTableExecutor.java index 9a42852..2ba4f59 100644 --- a/src/main/java/com/seeyon/utils/form/FormTableExecutor.java +++ b/src/main/java/com/seeyon/utils/form/FormTableExecutor.java @@ -82,6 +82,15 @@ public class FormTableExecutor { List queryDisplays, List conditions, boolean changeEnum) { + return query(ctx, queryDisplays, conditions, null, null, changeEnum); + } + + public static List query(TableContext ctx, + List queryDisplays, + List conditions, + String orderField, + String sortType, + boolean changeEnum) { fillConditionFields(ctx, conditions); List columns = resolveQueryColumns(ctx, queryDisplays); @@ -90,12 +99,15 @@ public class FormTableExecutor { param.setTableName(ctx.getTableName()); param.setQueryColumns(columns); param.setConditions(conditions); + param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null); + param.setSortType(sortType); Map sqlMap = generateSql(param); JDBCAgent agent = new JDBCAgent(); try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); log.info("执行sql为: " + sqlMap.get("sql")); + log.info("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); List> rows = agent.resultSetToList(); return rows.stream() @@ -115,11 +127,21 @@ public class FormTableExecutor { public static FormColumn queryOne(TableContext ctx, List conditions, boolean changeEnum) { + return queryOne(ctx, conditions, null, null, changeEnum); + } + + public static FormColumn queryOne(TableContext ctx, + List conditions, + String orderField, + String sortType, + boolean changeEnum) { fillConditionFields(ctx, conditions); SqlBuildParam param = new SqlBuildParam(); param.setSqlType(SqlType.SELECT); param.setTableName(ctx.getTableName()); + param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null); + param.setSortType(sortType); param.setConditions(conditions); Map sqlMap = generateSql(param); JDBCAgent agent = new JDBCAgent(); @@ -127,6 +149,7 @@ public class FormTableExecutor { try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); log.info("执行sql为: " + sqlMap.get("sql")); + log.info("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); Map row = agent.resultSetToMap(); if (row == null) return null; @@ -148,6 +171,17 @@ public class FormTableExecutor { int pageNo, int pageSize, boolean changeEnum) { + return pageQuery(ctx, displays, conditions, pageNo, pageSize, null, null, changeEnum); + } + + public static List pageQuery(TableContext ctx, + List displays, + List conditions, + int pageNo, + int pageSize, + String orderField, + String sortType, + boolean changeEnum) { fillConditionFields(ctx, conditions); List columns = resolveQueryColumns(ctx, displays); @@ -158,12 +192,15 @@ public class FormTableExecutor { param.setConditions(conditions); param.setPageNo(pageNo); param.setPageSize(pageSize); + param.setOrderField(orderField != null ? orderField : ctx.getTableName().contains("formson") ? "sort" : null); + param.setSortType(sortType); Map sqlMap = generateSql(param);; JDBCAgent agent = new JDBCAgent(); try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); log.info("执行sql为: " + sqlMap.get("sql")); + log.info("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); List> rows = agent.resultSetToList(); return rows.stream() @@ -194,6 +231,7 @@ public class FormTableExecutor { try { agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); log.info("执行sql为: " + sqlMap.get("sql")); + log.info("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); String dbName = (String) AppContext.getCache("DATABASE_NAME"); if ("mysql".equalsIgnoreCase(dbName)) { return (Long) agent.resultSetToMap().get("countnum"); @@ -226,6 +264,7 @@ public class FormTableExecutor { JDBCAgent agent = new JDBCAgent(); try { log.info("执行sql为: " + sqlMap.get("sql")); + log.info("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); return agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); } catch (Exception e){ log.error("执行sql为: " + sqlMap.get("sql")); @@ -249,6 +288,7 @@ public class FormTableExecutor { JDBCAgent agent = new JDBCAgent(); try { log.info("执行sql为: " + sqlMap.get("sql")); + log.error("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); return agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); } catch (Exception e){ log.error("执行sql为: " + sqlMap.get("sql")); @@ -273,6 +313,7 @@ public class FormTableExecutor { JDBCAgent agent = new JDBCAgent(); try { log.info("执行sql为: " + sqlMap.get("sql")); + log.info("执行sql参数为: " + JsonUtils.toJSONString(sqlMap.get("params"))); return agent.execute((String) sqlMap.get("sql"), (List) sqlMap.get("params")); }catch (Exception e){ log.error("执行sql为: " + sqlMap.get("sql")); @@ -535,25 +576,47 @@ public class FormTableExecutor { whereCause.append("("); } String field = c.getFieldName(); + // 字段表达式替换 如 CAST(fieldName AS DECIMAL(10,2)) + if (c.getFieldExpression() != null) { + field = c.getFieldExpression().replace("fieldName", field); + } ClauseFactor factor = c.getClauseFactor(); - String operator = parseOperator(factor); - // NULL / NOT NULL - if (factor.isNullType()) { - whereCause.append(field).append(" ").append(operator); - } else if (factor.isInType()) { - appendInClause(whereCause, field, operator, c.getValue(), params); - } else { - String placeholder = "?"; - // 函数模板(如 TO_DATE(?)) - if (c.getIndex() != null) { - placeholder = c.getIndex(); - } - whereCause.append(field).append(" ").append(operator).append(" ").append(placeholder); - if (ClauseFactor.LIKE.equals(factor)) { - params.add("%" + c.getValue() + "%"); - } else { + // 自定义表达式优先 + if (c.getExpression() != null) { + whereCause.append(c.getExpression()); + if (c.getValue() != null) { params.add(c.getValue()); } + if (c.getValues() != null) { + params.addAll(c.getValues()); + } + } else { + String operator = parseOperator(factor); + // NULL / NOT NULL + if (factor.isNullType()) { + whereCause.append(field).append(" ").append(operator); + } else if (factor.isInType()) { + appendInClause(whereCause, field, operator, c.getValue(), params); + } else if (factor == ClauseFactor.FIND_IN_SET) { + whereCause.append("FIND_IN_SET(?, ").append(field).append(")"); + params.add(c.getValue()); + } else if (factor == ClauseFactor.BETWEEN) { + whereCause.append(field).append(" BETWEEN ? AND ?"); + params.add(c.getValue()); + params.add(c.getValues().get(0)); + } else { + String placeholder = "?"; + // 函数模板(如 TO_DATE(?)) + if (c.getIndex() != null) { + placeholder = c.getIndex(); + } + whereCause.append(field).append(" ").append(operator).append(" ").append(placeholder); + if (ClauseFactor.LIKE.equals(factor)) { + params.add("%" + c.getValue() + "%"); + } else { + params.add(c.getValue()); + } + } } // 右括号 if (c.isEndWithBracket()) { @@ -609,6 +672,9 @@ public class FormTableExecutor { case LT: return "<"; case LE: return "<="; case LIKE: return "LIKE"; + case FIND_IN_SET: return "FIND_IN_SET"; + case REGEXP: return "REGEXP"; + case BETWEEN: return "BETWEEN"; case NULL: return "IS NULL"; // 空值判断 case NOT_NULL: return "IS NOT NULL"; // 非空判断 default: throw new UnsupportedOperationException("不支持的运算符: " + factor); diff --git a/src/main/java/com/seeyon/utils/form/FormWhereCondition.java b/src/main/java/com/seeyon/utils/form/FormWhereCondition.java index 73a31c4..0f69668 100644 --- a/src/main/java/com/seeyon/utils/form/FormWhereCondition.java +++ b/src/main/java/com/seeyon/utils/form/FormWhereCondition.java @@ -13,6 +13,8 @@ public class FormWhereCondition { private boolean startWithBracket = false; //是否以括号开头生成子条件 private boolean endWithBracket = false; //是否以括号结尾结束子条件 private String index; + private String expression; //自定义SQL表达式 如 ROUND(CAST(fieldName AS DECIMAL(10,2)), 2) > ? + private String fieldExpression; //字段表达式 如 CAST(fieldName AS DECIMAL(10,2)),fieldName会被替换为实际字段名 public FormWhereCondition() { this.values = new ArrayList<>(); @@ -38,6 +40,12 @@ public class FormWhereCondition { this.value = value; return this; } + public FormWhereCondition between(Object from, Object to) { + this.clauseFactor = ClauseFactor.BETWEEN; + this.value = from; + this.values.add(to); + return this; + } public FormWhereCondition clauseFactor(ClauseFactor clauseFactor) { this.clauseFactor = clauseFactor; return this; @@ -67,6 +75,16 @@ public class FormWhereCondition { return this; } + public FormWhereCondition expression(String expression) { + this.expression = expression; + return this; + } + + public FormWhereCondition fieldExpression(String fieldExpression) { + this.fieldExpression = fieldExpression; + return this; + } + public FormWhereCondition(Object value, ClauseFactor clauseFactor) { this.value = value; @@ -139,4 +157,20 @@ public class FormWhereCondition { public void setValues(List values) { this.values = values; } + + public String getExpression() { + return expression; + } + + public void setExpression(String expression) { + this.expression = expression; + } + + public String getFieldExpression() { + return fieldExpression; + } + + public void setFieldExpression(String fieldExpression) { + this.fieldExpression = fieldExpression; + } }