@@ -99,6 +99,7 @@ public interface SwEnum { | |||||
this.javaType = javaType; | this.javaType = javaType; | ||||
this.defaultValue = defaultValue; | this.defaultValue = defaultValue; | ||||
this.editor = editor; | this.editor = editor; | ||||
this.type = type; | |||||
} | } | ||||
public String getSqlTypeCreate() { | public String getSqlTypeCreate() { | ||||
@@ -60,7 +60,7 @@ public abstract class AbstractCompService { | |||||
//列表数据 | //列表数据 | ||||
public R list(@SwBody SwMap params, UserSession us) { | public R list(@SwBody SwMap params, UserSession us) { | ||||
return pageHandler(params, us, TYPE_LIST, handler -> ((AbstractListHandler)handler).listData()); | |||||
return pageHandler(params, us, TYPE_LIST, handler -> ((AbstractListHandler)handler).data()); | |||||
} | } | ||||
//列表总记录数及合计栏 | //列表总记录数及合计栏 | ||||
@@ -70,7 +70,7 @@ public abstract class AbstractCompService { | |||||
//combo数据 | //combo数据 | ||||
public R combo(@SwBody SwMap params, UserSession us) { | public R combo(@SwBody SwMap params, UserSession us) { | ||||
return pageHandler(params, us, TYPE_COMBO, handler -> ((DefaultComboHandler)handler).listData()); | |||||
return pageHandler(params, us, TYPE_COMBO, handler -> ((DefaultComboHandler)handler).data()); | |||||
} | } | ||||
//combo总记录数及合计栏 | //combo总记录数及合计栏 | ||||
@@ -50,12 +50,15 @@ public abstract class AbstractListHandler extends AbstractHandler { | |||||
sessionCache.remove(getCompId() + "." + key); | sessionCache.remove(getCompId() + "." + key); | ||||
} | } | ||||
protected R listData() { | |||||
public R data() { | |||||
return R.success(buildListData()); | |||||
} | |||||
public SwListData buildListData() { | |||||
List<SwMap> listData; | List<SwMap> listData; | ||||
SqlPara sqlPara = buildDataSql(); | SqlPara sqlPara = buildDataSql(); | ||||
int rows = params.readInt("rows", 0); | |||||
int page = params.readInt("page", 1); | |||||
String sort = params.readString("sort"); | String sort = params.readString("sort"); | ||||
String order = params.readString("order"); | String order = params.readString("order"); | ||||
String sql; | String sql; | ||||
@@ -67,17 +70,24 @@ public abstract class AbstractListHandler extends AbstractHandler { | |||||
} | } | ||||
} | } | ||||
if (rows == 0) { | |||||
listData = DbEngine.getInstance().query(sql, SwMap.class, sqlPara.paras); | |||||
} else { | |||||
//查分页数据 | |||||
listData = DbEngine.getInstance().pagedQuery(sql, SwMap.class, (page - 1) * rows, rows, sqlPara.paras); | |||||
} | |||||
listData = queryData(sql, sqlPara); | |||||
afterQuery(listData); | afterQuery(listData); | ||||
return R.success(SwListData.create(listData, rows)); | |||||
return SwListData.create(listData, sqlPara.rows); | |||||
} | } | ||||
protected List<SwMap> queryData(String sql, SqlPara sqlPara) { | |||||
sqlPara.rows = params.readInt("rows", 0); | |||||
sqlPara.page = params.readInt("page", 1); | |||||
if (sqlPara.rows == 0) { | |||||
return DbEngine.getInstance().query(sql, SwMap.class, sqlPara.paras); | |||||
} else { | |||||
//查分页数据 | |||||
return DbEngine.getInstance().pagedQuery(sql, SwMap.class, (sqlPara.page - 1) * sqlPara.rows, sqlPara.rows, sqlPara.paras); | |||||
} | |||||
} | |||||
protected SqlPara buildSumSqlPara() { | protected SqlPara buildSumSqlPara() { | ||||
SqlPara sqlPara = getCache(KEY_SQLPARA); | SqlPara sqlPara = getCache(KEY_SQLPARA); | ||||
@@ -86,7 +96,6 @@ public abstract class AbstractListHandler extends AbstractHandler { | |||||
List<FooterField> footerFields = getFooterFields(); | List<FooterField> footerFields = getFooterFields(); | ||||
StringBuilder sql = new StringBuilder(128); | StringBuilder sql = new StringBuilder(128); | ||||
sql.append("select count(1) " + TOTAL_KEY); | sql.append("select count(1) " + TOTAL_KEY); | ||||
int n = 2; | |||||
for (FooterField cn : footerFields) { | for (FooterField cn : footerFields) { | ||||
if (!FooterField.STATIC_TEXT.equals(cn.type)) { | if (!FooterField.STATIC_TEXT.equals(cn.type)) { | ||||
if (FooterField.SUM_TYPE_COUNT_ALL.equals(cn.type)) { | if (FooterField.SUM_TYPE_COUNT_ALL.equals(cn.type)) { | ||||
@@ -6,13 +6,9 @@ import java.util.HashMap; | |||||
import java.util.Map; | import java.util.Map; | ||||
//一个sql及其参数,具名参数 | //一个sql及其参数,具名参数 | ||||
public class SqlNamedPara { | |||||
public class SqlNamedPara extends SqlPara { | |||||
public String sql = ""; | public String sql = ""; | ||||
public SwMap paras = new SwMap(); | |||||
//页码,从1开始;为0,则不需要分页 | |||||
public int page = 0; | |||||
//每页记录数 | |||||
public int rows = 20; | |||||
public SwMap mapParas = new SwMap(); | |||||
//字段别名 | //字段别名 | ||||
public Map<String, String> mapFieldAlias = new HashMap<>(); | public Map<String, String> mapFieldAlias = new HashMap<>(); | ||||
@@ -22,11 +18,11 @@ public class SqlNamedPara { | |||||
public SqlNamedPara(String sql, SwMap paras) { | public SqlNamedPara(String sql, SwMap paras) { | ||||
this.sql = sql; | this.sql = sql; | ||||
this.paras = paras; | |||||
this.mapParas = paras; | |||||
} | } | ||||
public void addParas(String name, Object value) { | public void addParas(String name, Object value) { | ||||
paras.put(name, value); | |||||
mapParas.put(name, value); | |||||
} | } | ||||
public void addFieldAlias(String fieldName, String alias) { | public void addFieldAlias(String fieldName, String alias) { | ||||
@@ -1,42 +1,18 @@ | |||||
package cc.smtweb.framework.core.mvc.service; | package cc.smtweb.framework.core.mvc.service; | ||||
import org.apache.commons.lang3.ArrayUtils; | |||||
//一个sql及其参数 | //一个sql及其参数 | ||||
public class SqlPara { | public class SqlPara { | ||||
public String sql = ""; | |||||
public Object[] paras = null; | |||||
public int[] types = null; | |||||
public boolean hasLob = false; //是否有lob字段 | |||||
public SqlPara(String sql, Object... paras) { | |||||
this.sql = sql; | |||||
this.paras = paras; | |||||
} | |||||
public String sql; | |||||
public Object[] paras; | |||||
public int rows; | |||||
public int page; | |||||
public SqlPara(String sql, int[] types, Object... paras) { | |||||
this.sql = sql; | |||||
this.paras = paras; | |||||
this.types = types; | |||||
public SqlPara() { | |||||
} | } | ||||
public SqlPara(String sql, int[] types, boolean hasLob, Object... paras) { | |||||
public SqlPara(String sql, Object... paras) { | |||||
this.sql = sql; | this.sql = sql; | ||||
this.paras = paras; | this.paras = paras; | ||||
this.types = types; | |||||
this.hasLob = hasLob; | |||||
} | |||||
@Override | |||||
public int hashCode() { | |||||
//计算Hash值,以判断条件参数是否有变更; | |||||
if (paras == null) return sql.hashCode(); | |||||
int result = 1; | |||||
for (Object element : paras) { | |||||
result = 31 * result + (element == null ? 0: element.hashCode()); | |||||
} | |||||
result = 31 * result + sql.hashCode(); | |||||
return result; | |||||
} | } | ||||
//获取不带order by 的sql语句 | //获取不带order by 的sql语句 | ||||
@@ -57,12 +33,4 @@ public class SqlPara { | |||||
} | } | ||||
return retSql; | return retSql; | ||||
} | } | ||||
public void addParas(Object... ps) { | |||||
if (paras == null) { | |||||
paras = ps; | |||||
return; | |||||
} | |||||
paras = ArrayUtils.addAll(paras, ps); | |||||
} | |||||
} | } |
@@ -102,7 +102,7 @@ public class ModelFormService extends AbstractCompService { | |||||
String sql = params.readString("sql"); | String sql = params.readString("sql"); | ||||
if (StringUtils.isEmpty(sql)) return R.error("没有传入的sql!"); | if (StringUtils.isEmpty(sql)) return R.error("没有传入的sql!"); | ||||
sql = sql.trim().toLowerCase(); | sql = sql.trim().toLowerCase(); | ||||
if (!sql.startsWith("select ")) return R.error("非查询类sql,禁止执行!"); | |||||
if (!sql.startsWith("select")) return R.error("非查询类sql,禁止执行!"); | |||||
if (sql.contains(";")) return R.error("sql内禁止出现分号!"); | if (sql.contains(";")) return R.error("sql内禁止出现分号!"); | ||||
sql = SqlUtil.replaceTable(sql); | sql = SqlUtil.replaceTable(sql); | ||||
List<SwMap> ret = DbEngine.getInstance().query(sql + " where 1=0", rs -> { | List<SwMap> ret = DbEngine.getInstance().query(sql + " where 1=0", rs -> { | ||||
@@ -1,40 +0,0 @@ | |||||
package cc.smtweb.system.bpm.web.engine.dynPage; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.common.SwEnum; | |||||
import cc.smtweb.framework.core.mvc.service.SwListData; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageDataset; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
/** | |||||
* Created by Akmm at 2022/4/21 17:53 | |||||
* 新增操作,初始化定义的数据集 | |||||
*/ | |||||
public class DynPageAddHandler extends AbstractDynPageHandler { | |||||
public R add() { | |||||
//返回的数据,以dataset.name为key,查出的结果(bean或list)为value | |||||
Map<String, Object> mapRet = new HashMap<>(); | |||||
for (PageDataset dataSet : datasets.list) { | |||||
if (!dataSet.canEdit) { | |||||
continue; | |||||
} | |||||
if (SwEnum.DatasetType.FORM.value.equals(dataSet.type)) {//单表 | |||||
//懒加载,给个空对象 | |||||
if (dataSet.lazy) { | |||||
mapRet.put(dataSet.name, new SwMap()); | |||||
continue; | |||||
} | |||||
mapRet.put(dataSet.name, DynPageHelper.createBean(dataSet)); | |||||
} else if (SwEnum.DatasetType.TREE.value.equals(dataSet.type)) {//树 | |||||
mapRet.put(dataSet.name, new SwMap()); | |||||
} else if (!SwEnum.DatasetType.ENUM.value.equals(dataSet.type)) {//非枚举 | |||||
mapRet.put(dataSet.name, SwListData.create(null, 0)); | |||||
} | |||||
} | |||||
return R.success(mapRet); | |||||
} | |||||
} |
@@ -0,0 +1,92 @@ | |||||
package cc.smtweb.system.bpm.web.engine.dynPage; | |||||
import cc.smtweb.framework.core.common.R; | |||||
import cc.smtweb.framework.core.common.SwEnum; | |||||
import cc.smtweb.framework.core.common.SwException; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractHandler; | |||||
import cc.smtweb.framework.core.mvc.service.SwListData; | |||||
import cc.smtweb.framework.core.session.UserSession; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageDataset; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; | |||||
import java.util.HashMap; | |||||
import java.util.Map; | |||||
/** | |||||
* Created by Akmm at 2022/5/26 17:45 | |||||
*/ | |||||
public class DynPageHandler extends AbstractHandler { | |||||
//页面定义id | |||||
protected long pageId; | |||||
protected PageDatasets datasets; | |||||
protected DynPageProvider provider = new DynPageProvider(); | |||||
@Override | |||||
public void init(SwMap params, UserSession us) { | |||||
super.init(params, us); | |||||
pageId = params.readLong("pageId"); | |||||
datasets = ModelFormHelper.parsePageDataset(pageId); | |||||
if (datasets == null || datasets.list == null) throw new SwException("没有找到页面定义数据!"); | |||||
provider.pageId = pageId; | |||||
provider.datasets = datasets; | |||||
} | |||||
protected PageDataset findDataset(String name) { | |||||
return datasets.findByName(name); | |||||
} | |||||
//获取第一个,主数据集 | |||||
protected PageDataset findMasterDataset() { | |||||
return datasets.list.get(0); | |||||
} | |||||
//新增操作,初始化定义的数据集 | |||||
public R add() { | |||||
//返回的数据,以dataset.name为key,查出的结果(bean或list)为value | |||||
SwMap mapRet = new SwMap(); | |||||
for (PageDataset dataSet : datasets.list) { | |||||
if (!dataSet.canEdit) { | |||||
continue; | |||||
} | |||||
if (SwEnum.DatasetType.FORM.value.equals(dataSet.type)) {//单表 | |||||
//懒加载,给个空对象 | |||||
if (dataSet.lazy) { | |||||
mapRet.put(dataSet.name, new SwMap()); | |||||
continue; | |||||
} | |||||
mapRet.put(dataSet.name, DynPageHelper.createBean(dataSet)); | |||||
} else if (SwEnum.DatasetType.TREE.value.equals(dataSet.type)) {//树 | |||||
mapRet.put(dataSet.name, new SwMap()); | |||||
} else if (!SwEnum.DatasetType.ENUM.value.equals(dataSet.type)) {//非枚举 | |||||
mapRet.put(dataSet.name, SwListData.create(null, 0)); | |||||
} | |||||
} | |||||
return R.success(mapRet); | |||||
} | |||||
public R loadOne() { | |||||
//数据集 | |||||
String dbName = params.readString("dataset"); | |||||
//过滤条件 | |||||
SwMap filter = (SwMap)params.get("filter"); | |||||
//对应的数据集定义 | |||||
PageDataset pageDataSet = findDataset(dbName); | |||||
if (pageDataSet == null) throw new SwException("没有找到指定的的数据集定义:" + dbName + "!"); | |||||
DynRetBean bean = null; | |||||
if (SwEnum.DatasetType.LIST.value.equals(pageDataSet.type)) {//列表类 | |||||
bean = DynRetBean.createList(provider.loadList(filter, pageDataSet)); | |||||
} else if (SwEnum.DatasetType.TREE.value.equals(pageDataSet.type)) {//树类 | |||||
// return new DynRetBean(loadTree()); | |||||
} else {//列表类 | |||||
bean = DynRetBean.createBean(provider.loadData(filter, pageDataSet)); | |||||
} | |||||
return R.success(bean); | |||||
} | |||||
} |
@@ -1,14 +1,61 @@ | |||||
package cc.smtweb.system.bpm.web.engine.dynPage; | package cc.smtweb.system.bpm.web.engine.dynPage; | ||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.DbEngine; | |||||
import cc.smtweb.framework.core.db.EntityHelper; | |||||
import cc.smtweb.framework.core.db.cache.ModelTableCache; | |||||
import cc.smtweb.framework.core.db.vo.ModelTable; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractListHandler; | import cc.smtweb.framework.core.mvc.service.AbstractListHandler; | ||||
import cc.smtweb.framework.core.mvc.service.SqlNamedPara; | |||||
import cc.smtweb.framework.core.mvc.service.SqlPara; | import cc.smtweb.framework.core.mvc.service.SqlPara; | ||||
import cc.smtweb.system.bpm.web.design.form.define.PageDataset; | |||||
import java.util.List; | |||||
/** | /** | ||||
* Created by Akmm at 2022/5/26 15:58 | * Created by Akmm at 2022/5/26 15:58 | ||||
*/ | */ | ||||
public class DynPageListHandler extends AbstractListHandler { | public class DynPageListHandler extends AbstractListHandler { | ||||
protected long pageId; | |||||
//过滤条件 | |||||
private SwMap filter; | |||||
//对应的数据集定义 | |||||
private PageDataset pageDataSet; | |||||
public DynPageListHandler(long pageId, SwMap filter, PageDataset pageDataSet) { | |||||
this.pageId = pageId; | |||||
this.filter = filter; | |||||
this.pageDataSet = pageDataSet; | |||||
} | |||||
@Override | |||||
protected String getCompId() { | |||||
return "dynpage_" + pageId + "_" + pageDataSet.id; | |||||
} | |||||
@Override | |||||
protected String getPkFieldName() { | |||||
return pageDataSet.idField; | |||||
} | |||||
@Override | @Override | ||||
protected SqlPara buildSqlPara() { | protected SqlPara buildSqlPara() { | ||||
return null; | |||||
return DynPageHelper.buildSelectSql(pageDataSet, filter); | |||||
} | } | ||||
@Override | |||||
protected List<SwMap> queryData(String sql, SqlPara sqlPara) { | |||||
List<SwMap> list; | |||||
SqlNamedPara sp = (SqlNamedPara)sqlPara; | |||||
if (sqlPara.page > 0 && sqlPara.rows > 0) { | |||||
list = DbEngine.getInstance().pagedQueryN(sqlPara.sql, SwMap.class, (sqlPara.page - 1) * sqlPara.rows, sqlPara.rows, sp.mapParas); | |||||
} else { | |||||
list = DbEngine.getInstance().queryN(sqlPara.sql, sp.mapParas, SwMap.class); | |||||
} | |||||
ModelTable masterTable = ModelTableCache.getInstance().get(pageDataSet.masterTable); | |||||
EntityHelper.loadBeanLink(masterTable.getName(), list, sp.mapFieldAlias); | |||||
return list; | |||||
} | |||||
} | } |
@@ -53,7 +53,7 @@ public class DynPageLoadOneHandler extends AbstractDynPageHandler { | |||||
*/ | */ | ||||
private SwMap loadOne() { | private SwMap loadOne() { | ||||
SqlNamedPara sqlPara = DynPageHelper.buildSelectSql(pageDataSet, filter); | SqlNamedPara sqlPara = DynPageHelper.buildSelectSql(pageDataSet, filter); | ||||
SwMap map = DbEngine.getInstance().queryEntityN(sqlPara.sql, sqlPara.paras, SwMap.class); | |||||
SwMap map = DbEngine.getInstance().queryEntityN(sqlPara.sql, sqlPara.mapParas, SwMap.class); | |||||
if (map == null) { | if (map == null) { | ||||
throw new SwException("没有找到指定数据(ds=" + pageDataSet.name + ")"); | throw new SwException("没有找到指定数据(ds=" + pageDataSet.name + ")"); | ||||
} | } | ||||
@@ -70,9 +70,9 @@ public class DynPageLoadOneHandler extends AbstractDynPageHandler { | |||||
SqlNamedPara sqlPara = DynPageHelper.buildSelectSql(pageDataSet, filter); | SqlNamedPara sqlPara = DynPageHelper.buildSelectSql(pageDataSet, filter); | ||||
List<SwMap> list; | List<SwMap> list; | ||||
if (sqlPara.page > 0 && sqlPara.rows > 0) { | if (sqlPara.page > 0 && sqlPara.rows > 0) { | ||||
list = DbEngine.getInstance().pagedQueryN(sqlPara.sql, SwMap.class, (sqlPara.page - 1) * sqlPara.rows, sqlPara.rows, sqlPara.paras); | |||||
list = DbEngine.getInstance().pagedQueryN(sqlPara.sql, SwMap.class, (sqlPara.page - 1) * sqlPara.rows, sqlPara.rows, sqlPara.mapParas); | |||||
} else { | } else { | ||||
list = DbEngine.getInstance().queryN(sqlPara.sql, sqlPara.paras, SwMap.class); | |||||
list = DbEngine.getInstance().queryN(sqlPara.sql, sqlPara.mapParas, SwMap.class); | |||||
} | } | ||||
ModelTable masterTable = ModelTableCache.getInstance().get(pageDataSet.masterTable); | ModelTable masterTable = ModelTableCache.getInstance().get(pageDataSet.masterTable); | ||||
EntityHelper.loadBeanLink(masterTable.getName(), list, sqlPara.mapFieldAlias); | EntityHelper.loadBeanLink(masterTable.getName(), list, sqlPara.mapFieldAlias); | ||||
@@ -87,7 +87,7 @@ public class DynPageLoadOneHandler extends AbstractDynPageHandler { | |||||
try { | try { | ||||
SqlNamedPara sqlPara = DynPageHelper.buildSumSql(pageDataSet, filter); | SqlNamedPara sqlPara = DynPageHelper.buildSumSql(pageDataSet, filter); | ||||
SwMap mapFooter = DbEngine.getInstance().queryEntityN(sqlPara.sql, sqlPara.paras, SwMap.class); | |||||
SwMap mapFooter = DbEngine.getInstance().queryEntityN(sqlPara.sql, sqlPara.mapParas, SwMap.class); | |||||
R r = R.success(); | R r = R.success(); | ||||
r.put("total", mapFooter.get(TOTAL_KEY)); | r.put("total", mapFooter.get(TOTAL_KEY)); | ||||
@@ -0,0 +1,42 @@ | |||||
package cc.smtweb.system.bpm.web.engine.dynPage; | |||||
import cc.smtweb.framework.core.common.SwException; | |||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.DbEngine; | |||||
import cc.smtweb.framework.core.db.EntityHelper; | |||||
import cc.smtweb.framework.core.db.cache.ModelTableCache; | |||||
import cc.smtweb.framework.core.db.vo.ModelTable; | |||||
import cc.smtweb.framework.core.mvc.service.AbstractCompProvider; | |||||
import cc.smtweb.framework.core.mvc.service.IDataProvider; | |||||
import cc.smtweb.framework.core.mvc.service.SqlNamedPara; | |||||
import cc.smtweb.framework.core.mvc.service.SwListData; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageDataset; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; | |||||
/** | |||||
* Created by Akmm at 2022/5/26 18:40 | |||||
*/ | |||||
public class DynPageProvider extends AbstractCompProvider { | |||||
protected long pageId; | |||||
protected PageDatasets datasets; | |||||
//加载列表类数据集 | |||||
public SwListData loadList(SwMap filter, PageDataset pageDataSet) { | |||||
return new DynPageListHandler(pageId, filter, pageDataSet).buildListData(); | |||||
} | |||||
//加载表单类数据集(单条) | |||||
public SwMap loadData(SwMap filter, PageDataset pageDataSet) { | |||||
return doGetData(pageDataSet.id, () -> { | |||||
SqlNamedPara sqlPara = DynPageHelper.buildSelectSql(pageDataSet, filter); | |||||
SwMap map = DbEngine.getInstance().queryEntityN(sqlPara.sql, sqlPara.mapParas, SwMap.class); | |||||
if (map == null) { | |||||
throw new SwException("没有找到指定数据(ds=" + pageDataSet.name + ")"); | |||||
} | |||||
ModelTable masterTable = ModelTableCache.getInstance().get(pageDataSet.masterTable); | |||||
EntityHelper.loadBeanLink(masterTable.getName(), map, sqlPara.mapFieldAlias); | |||||
return map; | |||||
}); | |||||
} | |||||
} |