package jnpf.base.mapper; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jnpf.base.entity.FilterEntity; import jnpf.base.entity.VisualdevEntity; import jnpf.base.model.filter.RuleInfo; import jnpf.base.util.OnlineFilterUtil; import jnpf.database.util.DbTypeUtil; import jnpf.database.util.DynamicDataSourceUtil; import jnpf.util.JsonUtil; import jnpf.util.RandomUtil; import jnpf.util.context.RequestContext; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.annotations.Mapper; import org.mybatis.dynamic.sql.AndOrCriteriaGroup; import org.mybatis.dynamic.sql.DerivedColumn; import org.mybatis.dynamic.sql.SqlBuilder; import org.mybatis.dynamic.sql.SqlTable; import org.mybatis.dynamic.sql.select.QueryExpressionDSL; import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.where.WhereModel; import org.springframework.stereotype.Repository; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @Mapper @Repository public interface FilterMapper extends SuperMapper { default void saveRuleList(String moduleId, VisualdevEntity visualdevEntity, Integer app, Integer pc, Map tableMap) { if (MapUtils.isEmpty(tableMap)) return; String columnData = visualdevEntity.getColumnData(); String appColumnData = visualdevEntity.getAppColumnData(); if (columnData == null || columnData.length() == 0) { columnData = "{}"; } if (appColumnData == null || appColumnData.length() == 0) { appColumnData = "{}"; } Map config = JsonUtil.getJsonToBean(columnData, Map.class); String ruleList = JSONUtil.toJsonStr(config.get("ruleList")); Map configApp = JsonUtil.getJsonToBean(appColumnData, Map.class); String ruleListApp = JSONUtil.toJsonStr(configApp.get("ruleListApp")); FilterEntity entity = new FilterEntity(); entity.setId(RandomUtil.uuId()); entity.setModuleId(moduleId); replaceRealValue(app, pc, tableMap, ruleList, ruleListApp, entity); entity.setCreatorTime(new Date()); entity.setLastModifyTime(new Date()); this.insert(entity); } default void updateRuleList(String moduleId, VisualdevEntity visualdevEntity, Integer app, Integer pc, Map tableMap) { if (MapUtils.isEmpty(tableMap)) return; String columnData = visualdevEntity.getColumnData(); String appColumnData = visualdevEntity.getAppColumnData(); if (columnData == null || columnData.length() == 0) { columnData = "{}"; } if (appColumnData == null || appColumnData.length() == 0) { appColumnData = "{}"; } Map config = JsonUtil.getJsonToBean(columnData, Map.class); String ruleList = JSONUtil.toJsonStr(config.get("ruleList")); Map configApp = JsonUtil.getJsonToBean(appColumnData, Map.class); String ruleListApp = JSONUtil.toJsonStr(configApp.get("ruleListApp")); List list = this.selectList(new QueryWrapper().lambda().eq(FilterEntity::getModuleId, moduleId)); if (list == null || list.size() == 0) { this.saveRuleList(moduleId, visualdevEntity, app, pc, tableMap); } else { FilterEntity entity = list.get(0); replaceRealValue(app, pc, tableMap, ruleList, ruleListApp, entity); entity.setLastModifyTime(new Date()); this.updateById(entity); } } /** * 把子表的表名换成实际数据库表名 * * @param app 是否更新app配置 * @param pc 是否更新pc配置 * @param tableMap 虚拟表名和实际表名映射 * @param ruleList pc配置 * @param ruleListApp app配置 * @param entity 更新的数据 */ default void replaceRealValue(Integer app, Integer pc, Map tableMap, String ruleList, String ruleListApp, FilterEntity entity) { if (app == 1 && StringUtils.isNotBlank(ruleListApp)) { for (String key : tableMap.keySet()) { ruleListApp = ruleListApp.replaceAll(key, tableMap.get(key)); } entity.setConfigApp(ruleListApp); } if (pc == 1 && StringUtils.isNotBlank(ruleList)) { for (String key : tableMap.keySet()) { ruleList = ruleList.replaceAll(key, tableMap.get(key)); } entity.setConfig(ruleList); } } default void handleWhereCondition(SqlTable sqlTable, QueryExpressionDSL.QueryExpressionWhereBuilder where, String id, Map subSqlTableMap, String databaseProductName, Map params) { try { DynamicDataSourceUtil.switchToDataSource(null); List ruleInfos = this.getCondition(id); QueryExpressionDSL.QueryExpressionWhereBuilder whereFilter = SqlBuilder.select(sqlTable.allColumns()).from(sqlTable).where(); for (int i = 0; i < ruleInfos.size(); i++) { RuleInfo info = ruleInfos.get(i); OnlineFilterUtil genUtil = JsonUtil.getJsonToBean(info, OnlineFilterUtil.class); genUtil.setDbType(DbTypeUtil.getDbEncodeByProductName(databaseProductName)); genUtil.setSubSqlTableMap(subSqlTableMap); genUtil.setParams(params); genUtil.solveValue(whereFilter, sqlTable); } Method method = whereFilter.getClass().getDeclaredMethod("buildWhereModel"); method.setAccessible(true); WhereModel invoke = (WhereModel) method.invoke(whereFilter); List groupList = invoke.subCriteria(); where.and(DerivedColumn.of("1"), SqlBuilder.isEqualTo(1), groupList); } catch (Exception ignored) { } finally { DynamicDataSourceUtil.clearSwitchDataSource(); } } /** * 获取过滤配置 * * @param id * @return */ default List getCondition(String id) { if (StringUtils.isEmpty(id)) { return new ArrayList<>(); } QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(FilterEntity::getModuleId, id); FilterEntity entity = this.selectOne(wrapper); // 获取app端还是web端 String config; boolean isApp = !RequestContext.isOrignPc(); if (isApp) { config = entity.getConfigApp(); } else { config = entity.getConfig(); } List ruleInfos = new ArrayList<>(); if (StringUtils.isNoneBlank(config)) { ruleInfos = JsonUtil.getJsonToList(config, RuleInfo.class); } return ruleInfos; } }