package jnpf.onlinedev.util; import jnpf.util.FlowFormConstant; import jnpf.util.StringUtil; import jnpf.util.TableFeildsEnum; import org.mybatis.dynamic.sql.SortSpecification; import org.mybatis.dynamic.sql.SqlBuilder; import org.mybatis.dynamic.sql.SqlTable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.Predicate; /** * 流程列表的状态别名映射与排序优先级。 */ public final class WorkflowListSortUtils { private WorkflowListSortUtils() { } public static boolean isFlowStateField(String field) { return FlowFormConstant.FLOW_STATE.equalsIgnoreCase(field) || TableFeildsEnum.FLOWSTATE.getField().equalsIgnoreCase(field); } public static List orderBy(String tableName, String flowStateField, String primaryKey, boolean enableFlow, String sidx, Predicate isSortableField) { String[] sorts = StringUtil.isNotEmpty(sidx) ? sidx.split(",") : new String[0]; boolean hasStateSort = enableFlow && Arrays.stream(sorts) .map(sort -> sort.startsWith("-") ? sort.substring(1) : sort) .anyMatch(WorkflowListSortUtils::isFlowStateField); SqlTable table = SqlTable.of(tableName); List result = new ArrayList<>(); // 未指定状态排序时,保留平台原有的状态升序优先规则。 if (enableFlow && !hasStateSort) { result.add(SqlBuilder.sortColumn(tableName, table.column(flowStateField))); } for (String sort : sorts) { boolean descending = sort.startsWith("-"); String field = descending ? sort.substring(1) : sort; // 系统状态不依赖表单字段,不能被只展示字段过滤规则移除。 if (enableFlow && isFlowStateField(field)) { field = flowStateField; } else if (!isSortableField.test(field)) { continue; } SortSpecification specification = SqlBuilder.sortColumn(tableName, table.column(field)); result.add(descending ? specification.descending() : specification); } if (sorts.length == 0) { result.add(SqlBuilder.sortColumn(tableName, table.column(primaryKey)).descending()); } return result; } }