@@ -16,4 +16,5 @@ public interface SwConsts { | |||||
//列表分页的页码和每页记录数 | //列表分页的页码和每页记录数 | ||||
String PARAM_PAGE = "page"; | String PARAM_PAGE = "page"; | ||||
String PARAM_ROWS = "rows"; | String PARAM_ROWS = "rows"; | ||||
String TOTAL_KEY = "total_count"; | |||||
} | } |
@@ -1,6 +1,7 @@ | |||||
package cc.smtweb.framework.core.common; | package cc.smtweb.framework.core.common; | ||||
import lombok.Data; | import lombok.Data; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
/** | /** | ||||
* Created by Akmm at 2022/3/23 9:39 | * Created by Akmm at 2022/3/23 9:39 | ||||
@@ -129,6 +130,12 @@ public interface SwEnum { | |||||
mapAll.put(value, bean); | mapAll.put(value, bean); | ||||
return bean; | return bean; | ||||
} | } | ||||
@Override | |||||
public DataTypeBean getByValue(String value) { | |||||
if (value == null) return null; | |||||
return super.getByValue(value.toLowerCase()); | |||||
} | |||||
} | } | ||||
/** | /** | ||||
@@ -197,7 +204,7 @@ public interface SwEnum { | |||||
* 操作符类型:::and/or/=/>=/<=/like/p | * 操作符类型:::and/or/=/>=/<=/like/p | ||||
*/ | */ | ||||
class OptType extends StrEnum { | class OptType extends StrEnum { | ||||
public static FilterType instance = new FilterType(); | |||||
public static OptType instance = new OptType(); | |||||
public static StrEnumBean AND = instance.addEnum("and", "且"); | public static StrEnumBean AND = instance.addEnum("and", "且"); | ||||
public static StrEnumBean OR = instance.addEnum("or", "或"); | public static StrEnumBean OR = instance.addEnum("or", "或"); | ||||
@@ -212,4 +219,21 @@ public interface SwEnum { | |||||
public static StrEnumBean PLIKE = instance.addEnum("plike", "开始以"); | public static StrEnumBean PLIKE = instance.addEnum("plike", "开始以"); | ||||
public static StrEnumBean LIKE = instance.addEnum("like", "包含"); | public static StrEnumBean LIKE = instance.addEnum("like", "包含"); | ||||
} | } | ||||
//合计栏类型 "summary": "COUNT/SUM/AVG/MAX/MIN/其他为文本" | |||||
class SummaryType extends StrEnum { | |||||
public static SummaryType instance = new SummaryType(); | |||||
public static StrEnumBean COUNT = instance.addEnum("count", "计数"); | |||||
public static StrEnumBean SUM = instance.addEnum("sum", "求和"); | |||||
public static StrEnumBean AVG = instance.addEnum("avg", "均值"); | |||||
public static StrEnumBean MAX = instance.addEnum("max", "最大值"); | |||||
public static StrEnumBean MIN = instance.addEnum("min", "最小值"); | |||||
//是字符串 | |||||
public boolean isText(String v) { | |||||
if (StringUtils.isEmpty(v)) return true; | |||||
return !mapAll.containsKey(v.toLowerCase()); | |||||
} | |||||
} | |||||
} | } |
@@ -18,6 +18,8 @@ import java.util.HashMap; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import static cc.smtweb.framework.core.common.SwConsts.TOTAL_KEY; | |||||
/** | /** | ||||
* Created by Akmm at 2022/3/2 19:44 | * Created by Akmm at 2022/3/2 19:44 | ||||
* 列表服务 | * 列表服务 | ||||
@@ -91,7 +93,7 @@ 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_count"); | |||||
sql.append("select count(1) " + TOTAL_KEY); | |||||
int n = 2; | 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)) { | ||||
@@ -123,10 +125,10 @@ public abstract class AbstractListHandler extends AbstractHandler { | |||||
if (sqlParaSum == null) return R.success(); | if (sqlParaSum == null) return R.success(); | ||||
setCache(KEY_SQLPARA_SUM, sqlParaSum); | setCache(KEY_SQLPARA_SUM, sqlParaSum); | ||||
Map<String, Object> mapFooter = DbEngine.getInstance().queryEntity(sqlParaSum.sql, Map.class, sqlParaSum.paras); | |||||
SwMap mapFooter = DbEngine.getInstance().queryEntity(sqlParaSum.sql, SwMap.class, sqlParaSum.paras); | |||||
R r = R.success(); | R r = R.success(); | ||||
r.put("total", mapFooter.get("total_count")); | |||||
r.put("total", mapFooter.get(TOTAL_KEY)); | |||||
r.put("footer", mapFooter); | r.put("footer", mapFooter); | ||||
return r; | return r; | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
@@ -14,6 +14,8 @@ public class PageDatasetField { | |||||
//有别名取别名,无别名同字段名 | //有别名取别名,无别名同字段名 | ||||
public String name; | public String name; | ||||
public String label; | public String label; | ||||
//合计栏 | |||||
public String summary; | |||||
public String remark; | public String remark; | ||||
//字段类型,如编码字段,参见FieldTypeDef | //字段类型,如编码字段,参见FieldTypeDef | ||||
@@ -19,6 +19,8 @@ import java.util.HashSet; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Set; | import java.util.Set; | ||||
import static cc.smtweb.framework.core.common.SwConsts.TOTAL_KEY; | |||||
/** | /** | ||||
* Created by Akmm at 2022/4/23 10:01 | * Created by Akmm at 2022/4/23 10:01 | ||||
* 动态页面辅助类 | * 动态页面辅助类 | ||||
@@ -26,6 +28,7 @@ import java.util.Set; | |||||
public class DynPageHelper { | public class DynPageHelper { | ||||
/** | /** | ||||
* 新建bean | * 新建bean | ||||
* | |||||
* @param dataSet | * @param dataSet | ||||
* @return | * @return | ||||
*/ | */ | ||||
@@ -71,6 +74,23 @@ public class DynPageHelper { | |||||
return sqlNamedPara; | return sqlNamedPara; | ||||
} | } | ||||
public static SqlNamedPara buildSumSql(PageDataSet dataSet, Map<String, Object> params) { | |||||
SqlNamedPara sqlNamedPara = buildSelectSql(dataSet, params); | |||||
StringBuilder sql = new StringBuilder(256); | |||||
sql.append("select count(1) " + TOTAL_KEY); | |||||
for (PageDatasetField field : dataSet.fields) { | |||||
if (StringUtils.isEmpty(field.summary)) continue; | |||||
sql.append(","); | |||||
if (!SwEnum.SummaryType.instance.isText(field.summary)) { | |||||
sql.append(field.summary).append("(").append(field.name).append(") ").append(field.name); | |||||
} else { | |||||
sql.append("'").append(field.summary).append("' ").append(field.name); | |||||
} | |||||
} | |||||
sqlNamedPara.sql = sql.toString() + " from (" + sqlNamedPara.sql + ") xxxxa"; | |||||
return sqlNamedPara; | |||||
} | |||||
private static String buildSelFieldsSql(PageDataSet dataSet, SqlNamedPara sqlNamedPara) { | private static String buildSelFieldsSql(PageDataSet dataSet, SqlNamedPara sqlNamedPara) { | ||||
StringBuilder sql = new StringBuilder(512); | StringBuilder sql = new StringBuilder(512); | ||||
//主表 | //主表 | ||||
@@ -111,7 +131,7 @@ public class DynPageHelper { | |||||
} | } | ||||
//记录归属于固定条件的filter,最后设置参数 | //记录归属于固定条件的filter,最后设置参数 | ||||
Set<String> setFixedFilter = new HashSet<>(); | Set<String> setFixedFilter = new HashSet<>(); | ||||
for (PageDatasetFilter filter: dataSet.filters) { | |||||
for (PageDatasetFilter filter : dataSet.filters) { | |||||
setFixedFilter.add(filter.name); | setFixedFilter.add(filter.name); | ||||
} | } | ||||
if (!dataSet.dynCond.isEmpty()) { | if (!dataSet.dynCond.isEmpty()) { | ||||
@@ -121,7 +141,7 @@ public class DynPageHelper { | |||||
sql.append(s); | sql.append(s); | ||||
} | } | ||||
} | } | ||||
for (String s: setFixedFilter) { | |||||
for (String s : setFixedFilter) { | |||||
args.put(s, params.get(s)); | args.put(s, params.get(s)); | ||||
} | } | ||||
return new SqlNamedPara(sql.toString(), args); | return new SqlNamedPara(sql.toString(), args); | ||||
@@ -129,6 +149,7 @@ public class DynPageHelper { | |||||
/** | /** | ||||
* 构建动态条件 | * 构建动态条件 | ||||
* | |||||
* @param dataSet | * @param dataSet | ||||
* @param dynCond | * @param dynCond | ||||
* @param params | * @param params | ||||
@@ -17,6 +17,8 @@ import java.util.HashMap; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import static cc.smtweb.framework.core.common.SwConsts.TOTAL_KEY; | |||||
/** | /** | ||||
* Created by Akmm at 2022/4/21 17:53 | * Created by Akmm at 2022/4/21 17:53 | ||||
*/ | */ | ||||
@@ -87,13 +89,13 @@ public class DynPageLoadOneHandler extends AbstractDynPageHandler { | |||||
*/ | */ | ||||
public R getTotal() { | public R getTotal() { | ||||
try { | try { | ||||
SqlNamedPara sqlPara = DynPageHelper.buildSelectSql(pageDataSet, filter); | |||||
SqlNamedPara sqlPara = DynPageHelper.buildSumSql(pageDataSet, filter); | |||||
int total = DbEngine.getInstance().queryIntN("select count(1) from (" + sqlPara.sql + ") xxxa", sqlPara.paras); | |||||
SwMap mapFooter = DbEngine.getInstance().queryEntityN(sqlPara.sql, sqlPara.paras, SwMap.class); | |||||
R r = R.success(); | R r = R.success(); | ||||
r.put("total", total); | |||||
// r.put("footer", mapFooter); | |||||
r.put("total", mapFooter.get(TOTAL_KEY)); | |||||
r.put("footer", mapFooter); | |||||
return r; | return r; | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
return R.error("计算合计失败!", e); | return R.error("计算合计失败!", e); | ||||
@@ -10,6 +10,7 @@ import cc.smtweb.framework.core.db.DbEngine; | |||||
import cc.smtweb.framework.core.db.EntityDao; | import cc.smtweb.framework.core.db.EntityDao; | ||||
import cc.smtweb.framework.core.db.cache.ModelTableCache; | import cc.smtweb.framework.core.db.cache.ModelTableCache; | ||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
import cc.smtweb.framework.core.db.jdbc.AbsDbWorker; | |||||
import cc.smtweb.framework.core.db.jdbc.IDbWorker; | import cc.smtweb.framework.core.db.jdbc.IDbWorker; | ||||
import cc.smtweb.framework.core.db.vo.ModelField; | import cc.smtweb.framework.core.db.vo.ModelField; | ||||
import cc.smtweb.framework.core.db.vo.ModelIndex; | import cc.smtweb.framework.core.db.vo.ModelIndex; | ||||
@@ -29,10 +30,10 @@ import java.util.*; | |||||
* 入参:{pageId, data:} | * 入参:{pageId, data:} | ||||
*/ | */ | ||||
public class DynPageSaveHandler extends AbstractDynPageHandler { | public class DynPageSaveHandler extends AbstractDynPageHandler { | ||||
private Map<String, List<DefaultEntity>> mapTreeBean = null; | |||||
private Map<String, List<DefaultEntity>> mapTreeBean = new HashMap<>(); | |||||
@Override | @Override | ||||
public R doWork() throws Exception { | |||||
public R doWork() { | |||||
return saveAll(); | return saveAll(); | ||||
} | } | ||||
@@ -56,7 +57,7 @@ public class DynPageSaveHandler extends AbstractDynPageHandler { | |||||
} | } | ||||
checkBean(bean); | checkBean(bean); | ||||
DbEngine.getInstance().doTrans(new IDbWorker() { | |||||
DbEngine.getInstance().doTrans(new AbsDbWorker() { | |||||
@Override | @Override | ||||
public void work() { | public void work() { | ||||
saveBean(bean); | saveBean(bean); | ||||
@@ -107,7 +108,7 @@ public class DynPageSaveHandler extends AbstractDynPageHandler { | |||||
} | } | ||||
checkBean(bean); | checkBean(bean); | ||||
} | } | ||||
DbEngine.getInstance().doTrans(new IDbWorker() { | |||||
DbEngine.getInstance().doTrans(new AbsDbWorker() { | |||||
@Override | @Override | ||||
public void work() { | public void work() { | ||||
for (DefaultEntity bean: map.values()) { | for (DefaultEntity bean: map.values()) { | ||||
@@ -16,26 +16,18 @@ import cc.smtweb.system.bpm.web.design.table.ModelCatalogTreeHandler; | |||||
@SwService | @SwService | ||||
public class DynPageService extends AbstractCompService { | public class DynPageService extends AbstractCompService { | ||||
public final static String TYPE_ADD = "add"; | public final static String TYPE_ADD = "add"; | ||||
public final static String TYPE_LOAD_ONE = "loadOne"; | |||||
public final static String TYPE_DEL_ONE = "delOne"; | |||||
@Override | @Override | ||||
protected IHandler createHandler(String type) { | protected IHandler createHandler(String type) { | ||||
switch (type) { | switch (type) { | ||||
case TYPE_ADD: | case TYPE_ADD: | ||||
return new DynPageAddHandler(); | return new DynPageAddHandler(); | ||||
case TYPE_LOAD_ONE: | |||||
case TYPE_LOAD: | |||||
return new DynPageLoadOneHandler(); | return new DynPageLoadOneHandler(); | ||||
case TYPE_SAVE: | case TYPE_SAVE: | ||||
return new DynPageSaveHandler(); | return new DynPageSaveHandler(); | ||||
case TYPE_DEL: | case TYPE_DEL: | ||||
return new DefaultDelHandler<>(ModelCatalog.ENTITY_NAME); | |||||
case TYPE_DEL_ONE: | |||||
return new DefaultDelHandler<>(ModelCatalog.ENTITY_NAME); | |||||
case TYPE_LIST: | |||||
return new DefaultListHandler<>(ModelCatalog.ENTITY_NAME); | |||||
case TYPE_TREE: | |||||
return new ModelCatalogTreeHandler(); | |||||
return new DynPageDelHandler(); | |||||
} | } | ||||
return null; | return null; | ||||
} | } | ||||
@@ -55,10 +47,20 @@ public class DynPageService extends AbstractCompService { | |||||
} | } | ||||
} | } | ||||
//删除指定数据集 | |||||
public R delOne(@SwBody SwMap params, UserSession us) { | |||||
try { | |||||
DynPageDelHandler handler = (DynPageDelHandler) getHandler(params, us, TYPE_DEL); | |||||
return handler.delOne(); | |||||
} catch (Exception e) { | |||||
return R.error("操作失败!", e); | |||||
} | |||||
} | |||||
//列表总记录数及合计栏 | //列表总记录数及合计栏 | ||||
public R total(@SwBody SwMap params, UserSession us) { | public R total(@SwBody SwMap params, UserSession us) { | ||||
try { | try { | ||||
DynPageLoadOneHandler handler = (DynPageLoadOneHandler) getHandler(params, us, TYPE_LOAD_ONE); | |||||
DynPageLoadOneHandler handler = (DynPageLoadOneHandler) getHandler(params, us, TYPE_LOAD); | |||||
return handler.getTotal(); | return handler.getTotal(); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
return R.error("操作失败!", e); | return R.error("操作失败!", e); | ||||
@@ -27,11 +27,44 @@ public class ModelFormTest { | |||||
SwMap params = new SwMap(); | SwMap params = new SwMap(); | ||||
params.put("pageId", 1); | params.put("pageId", 1); | ||||
params.put("dataset", "modelProject"); | params.put("dataset", "modelProject"); | ||||
Map<String, Object> filter = new HashMap<>(); | |||||
SwMap filter = new SwMap(); | |||||
filter.put("prj_name", "测试"); | filter.put("prj_name", "测试"); | ||||
params.put("filter", filter); | params.put("filter", filter); | ||||
DynPageService service = new DynPageService(); | DynPageService service = new DynPageService(); | ||||
R r = service.load(params, null); | R r = service.load(params, null); | ||||
System.out.println(r.readSuccess()); | System.out.println(r.readSuccess()); | ||||
} | } | ||||
@Test | |||||
public void testSave() { | |||||
//{pageId,dataset:"", data:{form:{},list: {total:0,rows:[]}}, filter:{}} | |||||
SwMap params = new SwMap(); | |||||
params.put("pageId", 1); | |||||
params.put("dataset", "modelProject"); | |||||
SwMap data = new SwMap(); | |||||
SwMap form = new SwMap(); | |||||
form.put("prj_id", "12345"); | |||||
form.put("prj_name", "test12345"); | |||||
form.put("prj_desc", "this is test12345"); | |||||
data.put("form", form); | |||||
params.put("data", data); | |||||
SwMap filter = new SwMap(); | |||||
filter.put("prj_name", "测试"); | |||||
params.put("filter", filter); | |||||
DynPageService service = new DynPageService(); | |||||
R r = service.saveOne(params, null); | |||||
System.out.println(r.readSuccess()); | |||||
} | |||||
@Test | |||||
public void testDel() { | |||||
//{pageId,dataset:"", data:{form:{},list: {total:0,rows:[]}}, filter:{}} | |||||
SwMap params = new SwMap(); | |||||
params.put("pageId", 1); | |||||
params.put("id", 12345); | |||||
DynPageService service = new DynPageService(); | |||||
R r = service.del(params, null); | |||||
System.out.println(r.readSuccess()); | |||||
} | |||||
} | } |