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<SortSpecification> orderBy(String tableName, String flowStateField, String primaryKey,
|
boolean enableFlow, String sidx, Predicate<String> 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<SortSpecification> 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;
|
}
|
}
|