@@ -1,7 +1,10 @@ | |||||
package cc.smtweb.system.bpm.web.design.form; | package cc.smtweb.system.bpm.web.design.form; | ||||
import cc.smtweb.framework.core.annotation.SwTable; | import cc.smtweb.framework.core.annotation.SwTable; | ||||
import cc.smtweb.framework.core.common.SwMap; | |||||
import cc.smtweb.framework.core.db.impl.DefaultEntity; | import cc.smtweb.framework.core.db.impl.DefaultEntity; | ||||
import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; | |||||
import cc.smtweb.system.bpm.web.design.form.define.PageModel; | |||||
/** | /** | ||||
* Created by Akmm at 2022/4/15 17:26 | * Created by Akmm at 2022/4/15 17:26 | ||||
@@ -9,6 +12,66 @@ import cc.smtweb.framework.core.db.impl.DefaultEntity; | |||||
@SwTable("ASP_MODEL_FORM") | @SwTable("ASP_MODEL_FORM") | ||||
public class ModelForm extends DefaultEntity { | public class ModelForm extends DefaultEntity { | ||||
public static final String ENTITY_NAME = "ASP_MODEL_FORM"; | public static final String ENTITY_NAME = "ASP_MODEL_FORM"; | ||||
//将相关信息缓存起来 | |||||
private transient long masterTableId = -1; | |||||
private transient PageDatasets datasets; | |||||
private transient SwMap opts; | |||||
public void clearEx() { | |||||
masterTableId = -1L; | |||||
datasets = null; | |||||
opts = null; | |||||
} | |||||
public long getMasterTableId() { | |||||
if (masterTableId < 0) { | |||||
synchronized (ModelForm.class) { | |||||
if (masterTableId < 0) { | |||||
datasets = ModelFormHelper.parsePageDataset(getDataset()); | |||||
if (datasets == null) { | |||||
masterTableId = 0; | |||||
} else { | |||||
masterTableId = datasets.findMasterTableId(); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return masterTableId; | |||||
} | |||||
public void setMasterTableId(long masterTableId) { | |||||
this.masterTableId = masterTableId; | |||||
} | |||||
public PageDatasets getDatasets() { | |||||
if (datasets == null) { | |||||
synchronized (ModelForm.class) { | |||||
if (datasets == null) { | |||||
datasets = ModelFormHelper.parsePageDataset(getDataset()); | |||||
} | |||||
} | |||||
} | |||||
return datasets; | |||||
} | |||||
public void setDatasets(PageDatasets datasets) { | |||||
this.datasets = datasets; | |||||
} | |||||
public SwMap getOpts() { | |||||
if (opts == null) { | |||||
synchronized (ModelForm.class) { | |||||
if (opts == null) { | |||||
opts = ModelFormHelper.parseFormOption(getOption()); | |||||
} | |||||
} | |||||
} | |||||
return opts; | |||||
} | |||||
public void setOpts(SwMap opts) { | |||||
this.opts = opts; | |||||
} | |||||
public ModelForm() { | public ModelForm() { | ||||
super(ENTITY_NAME); | super(ENTITY_NAME); | ||||
@@ -84,6 +147,7 @@ public class ModelForm extends DefaultEntity { | |||||
public void setOption(String mf_option) { | public void setOption(String mf_option) { | ||||
put("mf_option", mf_option); | put("mf_option", mf_option); | ||||
opts = null; | |||||
} | } | ||||
public String getTmpl() { | public String getTmpl() { | ||||
@@ -100,6 +164,8 @@ public class ModelForm extends DefaultEntity { | |||||
public void setDataset(String mf_dataset) { | public void setDataset(String mf_dataset) { | ||||
put("mf_dataset", mf_dataset); | put("mf_dataset", mf_dataset); | ||||
datasets = null; | |||||
masterTableId = 0L; | |||||
} | } | ||||
public long getCreateUid() { | public long getCreateUid() { | ||||
@@ -3,6 +3,7 @@ package cc.smtweb.system.bpm.web.design.form; | |||||
import cc.smtweb.framework.core.annotation.SwCache; | import cc.smtweb.framework.core.annotation.SwCache; | ||||
import cc.smtweb.framework.core.cache.AbstractCache; | import cc.smtweb.framework.core.cache.AbstractCache; | ||||
import cc.smtweb.framework.core.cache.CacheManager; | import cc.smtweb.framework.core.cache.CacheManager; | ||||
import cc.smtweb.framework.core.common.SwConsts; | |||||
import cc.smtweb.framework.core.db.DbEngine; | import cc.smtweb.framework.core.db.DbEngine; | ||||
import cc.smtweb.framework.core.db.EntityDao; | import cc.smtweb.framework.core.db.EntityDao; | ||||
@@ -19,6 +20,7 @@ public class ModelFormCache extends AbstractCache<ModelForm> { | |||||
private final static String mk = "k"; | private final static String mk = "k"; | ||||
private final static String mp = "prj"; | private final static String mp = "prj"; | ||||
private final static String mc = "c"; | private final static String mc = "c"; | ||||
private final static String mt = "t"; | |||||
public static ModelFormCache getInstance() { | public static ModelFormCache getInstance() { | ||||
return CacheManager.getIntance().getCache(ModelFormCache.class); | return CacheManager.getIntance().getCache(ModelFormCache.class); | ||||
@@ -28,6 +30,7 @@ public class ModelFormCache extends AbstractCache<ModelForm> { | |||||
regMap(mk, k-> k.getName().toUpperCase()); | regMap(mk, k-> k.getName().toUpperCase()); | ||||
regList(mp, k-> String.valueOf(k.getPrjId())); | regList(mp, k-> String.valueOf(k.getPrjId())); | ||||
regList(mc, k-> String.valueOf(k.getMcId())); | regList(mc, k-> String.valueOf(k.getMcId())); | ||||
regList(mt, k-> k.getMasterTableId() + SwConsts.SPLIT_CHAR + k.getType()); | |||||
// regList(mf, k-> k.get); | // regList(mf, k-> k.get); | ||||
} | } | ||||
@@ -69,4 +72,14 @@ public class ModelFormCache extends AbstractCache<ModelForm> { | |||||
list.sort(comparator); | list.sort(comparator); | ||||
return list; | return list; | ||||
} | } | ||||
//根据表id,找对应的页面设计 | |||||
public Set<ModelForm> getListByTable(long tableId, int type) { | |||||
return getListByKey(mt, tableId + SwConsts.SPLIT_CHAR + type); | |||||
} | |||||
public String getText(long id) { | |||||
ModelForm form = get(id); | |||||
return form != null ? form.getTitle() : String.valueOf(id); | |||||
} | |||||
} | } |
@@ -46,11 +46,11 @@ public class ModelFormHelper { | |||||
return cache.get(formId); | return cache.get(formId); | ||||
} | } | ||||
public static PageDatasets parsePageDataset(long formId) { | |||||
/*public static PageDatasets parsePageDataset(long formId) { | |||||
ModelForm form = getFromCache(formId); | ModelForm form = getFromCache(formId); | ||||
if (form == null) return null; | if (form == null) return null; | ||||
return parsePageDataset(form.getDataset()); | return parsePageDataset(form.getDataset()); | ||||
} | |||||
}*/ | |||||
public static PageDatasets parsePageDataset(String jsonStr) { | public static PageDatasets parsePageDataset(String jsonStr) { | ||||
if (StringUtils.isEmpty(jsonStr)) return null; | if (StringUtils.isEmpty(jsonStr)) return null; | ||||
@@ -83,9 +83,9 @@ public class ModelFormHelper { | |||||
* @param form | * @param form | ||||
* @return | * @return | ||||
*/ | */ | ||||
public static String buildSaveModel(ModelForm form) { | |||||
PageDatasets datasets = parsePageDataset(form.getDataset()); | |||||
PageModel pageInfo = parsePageInfo(form.getContent()); | |||||
public static String buildSaveModel(ModelForm form, String jsonStr) { | |||||
PageDatasets datasets = form.getDatasets(); | |||||
PageModel pageInfo = parsePageInfo(jsonStr); | |||||
if (pageInfo == null) return ""; | if (pageInfo == null) return ""; | ||||
for (Map<String, Object> model : pageInfo.model) { | for (Map<String, Object> model : pageInfo.model) { | ||||
buildSaveModelFields(datasets, pageInfo, model, true); | buildSaveModelFields(datasets, pageInfo, model, true); | ||||
@@ -106,7 +106,7 @@ public class ModelFormHelper { | |||||
for (Map<String, Object> field : fields) { | for (Map<String, Object> field : fields) { | ||||
String fn = (String) field.get("field"); | String fn = (String) field.get("field"); | ||||
if (StringUtils.isEmpty(fn)) throw new SwException("model[" + db + "]." + key + "未配置字段名field,无法解析!"); | if (StringUtils.isEmpty(fn)) throw new SwException("model[" + db + "]." + key + "未配置字段名field,无法解析!"); | ||||
PageDatasetField pdf = isField ? pds.getField(fn) : pds.getFilter(fn); | |||||
PageDatasetField pdf = isField ? pds.findFieldByName(fn) : pds.findFilterByName(fn); | |||||
if (pdf == null) throw new SwException("model[" + db + "]." + key + "未找到定义的数据集字段(" + fn + "),无法解析!"); | if (pdf == null) throw new SwException("model[" + db + "]." + key + "未找到定义的数据集字段(" + fn + "),无法解析!"); | ||||
if (CommUtil.isStrEquals(MapUtil.readString(field, "label"), pdf.label)) { | if (CommUtil.isStrEquals(MapUtil.readString(field, "label"), pdf.label)) { | ||||
@@ -171,8 +171,7 @@ public class ModelFormHelper { | |||||
* @return | * @return | ||||
* @throws JsonProcessingException | * @throws JsonProcessingException | ||||
*/ | */ | ||||
public static String buildReqDataset(String jsonStr) { | |||||
PageDatasets datasets = parsePageDataset(jsonStr); | |||||
public static String buildReqDataset(PageDatasets datasets) { | |||||
if (datasets == null || datasets.list == null) return ""; | if (datasets == null || datasets.list == null) return ""; | ||||
return JsonUtil.encodeString(datasets.list); | return JsonUtil.encodeString(datasets.list); | ||||
} | } | ||||
@@ -185,7 +184,7 @@ public class ModelFormHelper { | |||||
* @return | * @return | ||||
*/ | */ | ||||
public static String buildReqModel(ModelForm form) { | public static String buildReqModel(ModelForm form) { | ||||
PageDatasets datasets = parsePageDataset(form.getDataset()); | |||||
PageDatasets datasets = form.getDatasets(); | |||||
PageModel pageInfo = parsePageInfo(form.getContent()); | PageModel pageInfo = parsePageInfo(form.getContent()); | ||||
if (pageInfo == null) return ""; | if (pageInfo == null) return ""; | ||||
for (Map<String, Object> model : pageInfo.model) { | for (Map<String, Object> model : pageInfo.model) { | ||||
@@ -208,7 +207,7 @@ public class ModelFormHelper { | |||||
for (Map<String, Object> field : fields) { | for (Map<String, Object> field : fields) { | ||||
String fn = (String) field.get("field"); | String fn = (String) field.get("field"); | ||||
if (StringUtils.isEmpty(fn)) continue; | if (StringUtils.isEmpty(fn)) continue; | ||||
PageDatasetField pdf = isField ? dataSet.getField(fn) : dataSet.getFilter(fn); | |||||
PageDatasetField pdf = isField ? dataSet.findFieldByName(fn) : dataSet.findFilterByName(fn); | |||||
if (pdf == null) continue; | if (pdf == null) continue; | ||||
if (!field.containsKey("label")) { | if (!field.containsKey("label")) { | ||||
field.put("label", pdf.label); | field.put("label", pdf.label); | ||||
@@ -245,7 +244,7 @@ public class ModelFormHelper { | |||||
} | } | ||||
public static String buildEngineModel(ModelForm form, SwMap params, UserSession us, boolean incExtra) { | public static String buildEngineModel(ModelForm form, SwMap params, UserSession us, boolean incExtra) { | ||||
PageDatasets datasets = parsePageDataset(form.getDataset()); | |||||
PageDatasets datasets = form.getDatasets(); | |||||
if (datasets == null || datasets.list == null) return ""; | if (datasets == null || datasets.list == null) return ""; | ||||
SwMap ret = new SwMap(); | SwMap ret = new SwMap(); | ||||
@@ -317,7 +316,7 @@ public class ModelFormHelper { | |||||
if (widgetForm == null) throw new SwException("没有找到指定的控件定义!id=" + id); | if (widgetForm == null) throw new SwException("没有找到指定的控件定义!id=" + id); | ||||
SwMap w = new SwMap(); | SwMap w = new SwMap(); | ||||
widget.put("w" + id, w); | widget.put("w" + id, w); | ||||
SwMap widgetOpts = parseFormOption(widgetForm.getOption()); | |||||
SwMap widgetOpts = widgetForm.getOpts(); | |||||
w.put("service", widgetForm.getService()); | w.put("service", widgetForm.getService()); | ||||
if (widgetOpts != null) w.putAll(widgetOpts); | if (widgetOpts != null) w.putAll(widgetOpts); | ||||
w.put("define", buildEngineModel(widgetForm, params, us, false)); | w.put("define", buildEngineModel(widgetForm, params, us, false)); | ||||
@@ -335,7 +334,7 @@ public class ModelFormHelper { | |||||
//获取控件的filter信息 | //获取控件的filter信息 | ||||
public static List<SwMap> buildWidgetFilter(ModelForm bean) { | public static List<SwMap> buildWidgetFilter(ModelForm bean) { | ||||
List<SwMap> listRet = new ArrayList<>(); | List<SwMap> listRet = new ArrayList<>(); | ||||
PageDatasets datasets = ModelFormHelper.parsePageDataset(bean.getDataset()); | |||||
PageDatasets datasets = bean.getDatasets(); | |||||
if (datasets == null || datasets.list == null) return listRet; | if (datasets == null || datasets.list == null) return listRet; | ||||
for (PageDataset ds : datasets.list) { | for (PageDataset ds : datasets.list) { | ||||
for (PageDatasetFilter filter : ds.filters) { | for (PageDatasetFilter filter : ds.filters) { | ||||
@@ -372,13 +371,13 @@ public class ModelFormHelper { | |||||
* @param tmplId | * @param tmplId | ||||
*/ | */ | ||||
public static void buildSaveModelByTmpl(ModelForm form, String tmplId) { | public static void buildSaveModelByTmpl(ModelForm form, String tmplId) { | ||||
PageDatasets datasets = parsePageDataset(form.getDataset()); | |||||
PageDatasets datasets = form.getDatasets(); | |||||
SwMap tmplModel = JsonUtil.parse(form.getTmpl(), SwMap.class); | SwMap tmplModel = JsonUtil.parse(form.getTmpl(), SwMap.class); | ||||
tmplModel.put("title", form.getTitle()); | tmplModel.put("title", form.getTitle()); | ||||
tmplModel.put("datasets", parsePageDataset(form.getDataset())); | |||||
tmplModel.put("datasets", form.getDatasets()); | |||||
SwMap layout = tmplModel.readMap("layout"); | SwMap layout = tmplModel.readMap("layout"); | ||||
//用到的自定义控件 | //用到的自定义控件 | ||||
Set<String> setWidget = new HashSet<>(); | |||||
Set<Long> setWidget = new HashSet<>(); | |||||
for (String key : layout.keySet()) { | for (String key : layout.keySet()) { | ||||
List<Map<String, Object>> groups = layout.readListMap(key); | List<Map<String, Object>> groups = layout.readListMap(key); | ||||
for (Map<String, Object> group : groups) { | for (Map<String, Object> group : groups) { | ||||
@@ -397,17 +396,18 @@ public class ModelFormHelper { | |||||
} | } | ||||
String widgetRef = ""; | String widgetRef = ""; | ||||
if (!setWidget.isEmpty()) { | if (!setWidget.isEmpty()) { | ||||
for (String s: setWidget) { | |||||
for (long s: setWidget) { | |||||
widgetRef += ",\"" + s + "\""; | widgetRef += ",\"" + s + "\""; | ||||
} | } | ||||
widgetRef = widgetRef.substring(1); | widgetRef = widgetRef.substring(1); | ||||
} | } | ||||
tmplModel.put("widgetRef", widgetRef); | tmplModel.put("widgetRef", widgetRef); | ||||
form.setContent(CodeGenerator.getInstance().generate(tmplModel, tmplId)); | |||||
final String model = CodeGenerator.getInstance().generate(tmplModel, tmplId); | |||||
form.setContent(model); | |||||
// form.setContent(buildSaveModel(form)); | // form.setContent(buildSaveModel(form)); | ||||
} | } | ||||
private static void buildTmplFields(List<Map<String, Object>> fields, PageDatasets datasets, Set<String> setWidget, boolean isField) { | |||||
private static void buildTmplFields(List<Map<String, Object>> fields, PageDatasets datasets, Set<Long> setWidget, boolean isField) { | |||||
if (fields == null) return; | if (fields == null) return; | ||||
PageDataset dataset = null; | PageDataset dataset = null; | ||||
for (Map<String, Object> field : fields) { | for (Map<String, Object> field : fields) { | ||||
@@ -419,18 +419,33 @@ public class ModelFormHelper { | |||||
String fn = MapUtil.readString(field, "field"); | String fn = MapUtil.readString(field, "field"); | ||||
PageDatasetField pdf; | PageDatasetField pdf; | ||||
if (!isField) { | if (!isField) { | ||||
pdf = dataset.getFilter(fn); | |||||
pdf = dataset.findFilterById(fn); | |||||
} else { | } else { | ||||
pdf = dataset.getField(fn); | |||||
if (pdf == null) pdf = dataset.getFilter(fn); | |||||
pdf = dataset.findFieldById(fn); | |||||
if (pdf == null) pdf = dataset.findFilterByName(fn); | |||||
} | } | ||||
if (pdf == null) throw new SwException("model[" + dsId + "]未找到定义的数据集字段(" + fn + "),无法解析!"); | if (pdf == null) throw new SwException("model[" + dsId + "]未找到定义的数据集字段(" + fn + "),无法解析!"); | ||||
field.put("id", pdf.id); | |||||
field.put("field", pdf.field); | |||||
field.put("name", pdf.name); | |||||
field.put("label", pdf.label); | field.put("label", pdf.label); | ||||
field.put("required", pdf.isFieldNotNull()); | field.put("required", pdf.isFieldNotNull()); | ||||
field.put("widget", 0); | |||||
final SwEnum.DataTypeBean dtb = SwEnum.DataType.instance.getByValue(pdf.dataType); | final SwEnum.DataTypeBean dtb = SwEnum.DataType.instance.getByValue(pdf.dataType); | ||||
if (dtb != null) { | if (dtb != null) { | ||||
if (dtb.dataLength > 0) field.put("maxlength", dtb.dataLength); | |||||
field.put("maxlength", dtb.dataLength); | |||||
field.put("editor", dtb.editor); | field.put("editor", dtb.editor); | ||||
if (pdf.link > 0) { | |||||
long widget = getFieldCtrl(pdf.link); | |||||
if (widget > 0) { | |||||
setWidget.add(widget); | |||||
field.put("widget", widget); | |||||
field.put("widgetText", ModelFormCache.getInstance().getText(widget)); | |||||
} | |||||
} | |||||
} else { | |||||
field.put("maxlength", 0); | |||||
field.put("editor", SwEnum.EditorType.INPUT.value); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
@@ -439,10 +454,12 @@ public class ModelFormHelper { | |||||
* 计算字段适用控件 | * 计算字段适用控件 | ||||
* | * | ||||
* @param tableId | * @param tableId | ||||
* @param fieldName | |||||
* @return | * @return | ||||
*/ | */ | ||||
public String getFieldCtrl(long tableId, String fieldName) { | |||||
return null; | |||||
public static long getFieldCtrl(long tableId) { | |||||
Set<ModelForm> set = ModelFormCache.getInstance().getListByTable(tableId, SwEnum.FormType.WIDGET.value); | |||||
if (set == null || set.isEmpty()) return 0L; | |||||
ModelForm form = set.iterator().next(); | |||||
return (form != null) ? form.getEntityId() : 0L; | |||||
} | } | ||||
} | } |
@@ -17,7 +17,7 @@ public class ModelFormLoadHandler extends DefaultLoadHandler<ModelForm> { | |||||
@Override | @Override | ||||
protected ModelForm loadComp(long id) { | protected ModelForm loadComp(long id) { | ||||
ModelForm bean = super.loadComp(id); | ModelForm bean = super.loadComp(id); | ||||
SwMap opts = ModelFormHelper.parseFormOption(bean.getOption()); | |||||
SwMap opts = bean.getOpts(); | |||||
if (opts != null) { | if (opts != null) { | ||||
ModelFormHelper.buildOptsEx(bean, opts); | ModelFormHelper.buildOptsEx(bean, opts); | ||||
bean.setOption(JsonUtil.encodeString(opts)); | bean.setOption(JsonUtil.encodeString(opts)); | ||||
@@ -33,7 +33,7 @@ public class ModelFormLoadHandler extends DefaultLoadHandler<ModelForm> { | |||||
long id = params.readLong("id"); | long id = params.readLong("id"); | ||||
ModelForm bean = super.loadComp(id); | ModelForm bean = super.loadComp(id); | ||||
if (bean == null) throw new SwException("没有找到指定定义信息!id=" + id); | if (bean == null) throw new SwException("没有找到指定定义信息!id=" + id); | ||||
return R.success(ModelFormHelper.buildReqDataset(bean.getDataset())); | |||||
return R.success(ModelFormHelper.buildReqDataset(bean.getDatasets())); | |||||
} | } | ||||
//页面设计 - 加载页面model定义 | //页面设计 - 加载页面model定义 | ||||
@@ -25,7 +25,7 @@ public class ModelFormSaveHandler extends DefaultSaveHandler<ModelForm> { | |||||
@Override | @Override | ||||
protected void updateBean(EntityDao<ModelForm> dao) { | protected void updateBean(EntityDao<ModelForm> dao) { | ||||
SwMap opts = ModelFormHelper.parseFormOption(bean.getOption()); | |||||
SwMap opts = bean.getOpts(); | |||||
if (opts != null) { | if (opts != null) { | ||||
opts.remove(ModelFormHelper.KEY_EVENT_PATH); | opts.remove(ModelFormHelper.KEY_EVENT_PATH); | ||||
bean.setOption(JsonUtil.encodeString(opts)); | bean.setOption(JsonUtil.encodeString(opts)); | ||||
@@ -73,8 +73,7 @@ public class ModelFormSaveHandler extends DefaultSaveHandler<ModelForm> { | |||||
if (StringUtils.isEmpty(data)) { | if (StringUtils.isEmpty(data)) { | ||||
throw new SwException("没有待保存的数据!"); | throw new SwException("没有待保存的数据!"); | ||||
} | } | ||||
bean.setContent(data); | |||||
bean.setContent(ModelFormHelper.buildSaveModel(bean)); | |||||
bean.setContent(ModelFormHelper.buildSaveModel(bean, data)); | |||||
DbEngine.getInstance().doTrans(new AbsDbWorker() { | DbEngine.getInstance().doTrans(new AbsDbWorker() { | ||||
@Override | @Override | ||||
public void work() { | public void work() { | ||||
@@ -117,7 +116,7 @@ public class ModelFormSaveHandler extends DefaultSaveHandler<ModelForm> { | |||||
ModelTable table = ModelTableCache.getInstance().getByName(tableName); | ModelTable table = ModelTableCache.getInstance().getByName(tableName); | ||||
ModelField field = table.findFieldByType(SwEnum.FieldType.UPDATE_USER.value); | ModelField field = table.findFieldByType(SwEnum.FieldType.UPDATE_USER.value); | ||||
if (field != null) bean.put(field.getName(), us.getUserId()); | if (field != null) bean.put(field.getName(), us.getUserId()); | ||||
dao.updateEntity(bean, "mf_content", "mf_tmpl"); | |||||
dao.updateEntity(bean, "mf_content,mf_tmpl"); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -44,27 +44,43 @@ public class PageDataset { | |||||
public PageDatasetDynCond dynCond; | public PageDatasetDynCond dynCond; | ||||
public List<PageDatasetSortField> sortFields; | public List<PageDatasetSortField> sortFields; | ||||
private Map<String, PageDatasetField> mapField; | |||||
private Map<String, PageDatasetFilter> mapFilter; | |||||
//按字段名的缓存 | |||||
private Map<String, PageDatasetField> mapFieldName; | |||||
private Map<String, PageDatasetFilter> mapFilterName; | |||||
//按字段Id的缓存 | |||||
private Map<String, PageDatasetField> mapFieldId; | |||||
private Map<String, PageDatasetFilter> mapFilterId; | |||||
public PageDatasetField getField(String name) { | |||||
if (mapField == null) resetFields(); | |||||
return mapField.get(name); | |||||
public PageDatasetField findFieldByName(String name) { | |||||
if (mapFieldName == null) resetFields(); | |||||
return mapFieldName.get(name); | |||||
} | } | ||||
public PageDatasetFilter getFilter(String name) { | |||||
if (mapFilter == null) resetFields(); | |||||
return mapFilter.get(name); | |||||
public PageDatasetFilter findFilterByName(String name) { | |||||
if (mapFilterName == null) resetFields(); | |||||
return mapFilterName.get(name); | |||||
} | |||||
public PageDatasetField findFieldById(String id) { | |||||
if (mapFieldId == null) resetFields(); | |||||
return mapFieldId.get(id); | |||||
} | |||||
public PageDatasetFilter findFilterById(String id) { | |||||
if (mapFilterId == null) resetFields(); | |||||
return mapFilterId.get(id); | |||||
} | } | ||||
/** | /** | ||||
* 重置丰富字段信息 | * 重置丰富字段信息 | ||||
*/ | */ | ||||
public void resetFields() { | public void resetFields() { | ||||
mapField = new HashMap<>(); | |||||
resetFields(mapField, fields); | |||||
mapFilter = new HashMap<>(); | |||||
resetFields(mapFilter, filters); | |||||
mapFieldName = new HashMap<>(); | |||||
mapFieldId = new HashMap<>(); | |||||
resetFields(mapFieldName, mapFieldId, fields); | |||||
mapFilterName = new HashMap<>(); | |||||
mapFilterId = new HashMap<>(); | |||||
resetFields(mapFilterName, mapFilterId, filters); | |||||
for (PageDatasetFilter filter: filters) { | for (PageDatasetFilter filter: filters) { | ||||
if (StringUtils.isEmpty(filter.sqlName)) { | if (StringUtils.isEmpty(filter.sqlName)) { | ||||
filter.sqlName = filter.field; | filter.sqlName = filter.field; | ||||
@@ -72,11 +88,12 @@ public class PageDataset { | |||||
} | } | ||||
} | } | ||||
private <T extends PageDatasetField> void resetFields(Map<String, T> map, List<T> list) { | |||||
private <T extends PageDatasetField> void resetFields(Map<String, T> mapName, Map<String, T> mapId, List<T> list) { | |||||
ModelTableCache cache = ModelTableCache.getInstance(); | ModelTableCache cache = ModelTableCache.getInstance(); | ||||
ModelTable table = null; | ModelTable table = null; | ||||
for (T field: list) { | for (T field: list) { | ||||
map.put(field.name, field); | |||||
mapName.put(field.name, field); | |||||
mapId.put(field.id, field); | |||||
if (field.table <= 0 || StringUtils.isEmpty(field.field)) continue; | if (field.table <= 0 || StringUtils.isEmpty(field.field)) continue; | ||||
if (table == null || table.getId() != field.table) { | if (table == null || table.getId() != field.table) { | ||||
table = cache.get(field.table); | table = cache.get(field.table); | ||||
@@ -33,7 +33,6 @@ public class PageDatasetField { | |||||
public long link; | public long link; | ||||
//控件类型:TEXT/TextArea/NUMBER/COMBO | //控件类型:TEXT/TextArea/NUMBER/COMBO | ||||
public String editor; | public String editor; | ||||
public String editModel; | |||||
@JsonIgnore | @JsonIgnore | ||||
public boolean isFieldNotNull() { | public boolean isFieldNotNull() { | ||||
@@ -34,6 +34,17 @@ public class PageDatasets { | |||||
} | } | ||||
} | } | ||||
public PageDataset findMasterDataset() { | |||||
if (list == null || list.isEmpty()) return null; | |||||
return this.list.get(0); | |||||
} | |||||
public long findMasterTableId() { | |||||
PageDataset ds = findMasterDataset(); | |||||
if (ds == null) return 0L; | |||||
return ds.masterTable; | |||||
} | |||||
public PageDataset findById(String id) { | public PageDataset findById(String id) { | ||||
return mapId.get(id); | return mapId.get(id); | ||||
} | } | ||||
@@ -4,6 +4,7 @@ import cc.smtweb.framework.core.common.SwException; | |||||
import cc.smtweb.framework.core.common.SwMap; | import cc.smtweb.framework.core.common.SwMap; | ||||
import cc.smtweb.framework.core.mvc.service.AbstractHandler; | import cc.smtweb.framework.core.mvc.service.AbstractHandler; | ||||
import cc.smtweb.framework.core.session.UserSession; | import cc.smtweb.framework.core.session.UserSession; | ||||
import cc.smtweb.system.bpm.web.design.form.ModelForm; | |||||
import cc.smtweb.system.bpm.web.design.form.ModelFormHelper; | 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.PageDataset; | ||||
import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; | import cc.smtweb.system.bpm.web.design.form.define.PageDatasets; | ||||
@@ -22,8 +23,9 @@ public abstract class AbstractDynPageHandler extends AbstractHandler { | |||||
public void init(SwMap params, UserSession us) { | public void init(SwMap params, UserSession us) { | ||||
super.init(params, us); | super.init(params, us); | ||||
pageId = params.readLong("pageId"); | pageId = params.readLong("pageId"); | ||||
datasets = ModelFormHelper.parsePageDataset(pageId); | |||||
ModelForm form = ModelFormHelper.getFromCache(pageId); | |||||
if (form == null) throw new SwException("没有找到页面定义数据!"); | |||||
datasets = form.getDatasets(); | |||||
if (datasets == null || datasets.list == null) throw new SwException("没有找到页面定义数据!"); | if (datasets == null || datasets.list == null) throw new SwException("没有找到页面定义数据!"); | ||||
provider.pageId = pageId; | provider.pageId = pageId; | ||||
@@ -36,7 +38,7 @@ public abstract class AbstractDynPageHandler extends AbstractHandler { | |||||
//获取第一个,主数据集 | //获取第一个,主数据集 | ||||
protected PageDataset findMasterDataset() { | protected PageDataset findMasterDataset() { | ||||
return datasets.list.get(0); | |||||
return datasets.findMasterDataset(); | |||||
} | } | ||||
//从参数读取数据集定义 | //从参数读取数据集定义 | ||||
@@ -180,7 +180,7 @@ public class DynPageHelper { | |||||
boolean isNameSelf = setFixedFilter.contains(dynCond.param); | boolean isNameSelf = setFixedFilter.contains(dynCond.param); | ||||
setFixedFilter.remove(dynCond.param); | setFixedFilter.remove(dynCond.param); | ||||
PageDatasetFilter filter = dataSet.getFilter(dynCond.param); | |||||
PageDatasetFilter filter = dataSet.findFilterByName(dynCond.param); | |||||
if (filter == null) throw new SwException("没有找到filter(" + dynCond.param + ")!"); | if (filter == null) throw new SwException("没有找到filter(" + dynCond.param + ")!"); | ||||
Object value = null; | Object value = null; | ||||
@@ -1,22 +0,0 @@ | |||||
{ | |||||
"dataset": "${dataset.id}", | |||||
"label": "${dataset.label}", | |||||
"fields": [ | |||||
<#list fields as field> | |||||
{ | |||||
"id": "${field.id}", | |||||
"field": "${field.field}" | |||||
}, | |||||
</#list> | |||||
], | |||||
"filters": [ | |||||
<#list filters as field> | |||||
{ | |||||
"id": "${field.id}", | |||||
"field": "${field.field}" | |||||
"required": ${field.required}, | |||||
"type": "input" | |||||
}, | |||||
</#list> | |||||
] | |||||
}, |
@@ -17,15 +17,17 @@ | |||||
"props": { | "props": { | ||||
"label": "${filter.label}", | "label": "${filter.label}", | ||||
"type": "text", | "type": "text", | ||||
<#if filter.maxlength gt 0> | |||||
"maxlength": ${filter.maxlength}, | "maxlength": ${filter.maxlength}, | ||||
</#if> | |||||
"placeholder": "请输入查询内容", | "placeholder": "请输入查询内容", | ||||
"labelWidth": 100, | "labelWidth": 100, | ||||
"dataset": "${filter.dataset}", | "dataset": "${filter.dataset}", | ||||
"field": "${filter.field}", | |||||
"field": "${filter.id}", | |||||
"name": "${filter.name}" | "name": "${filter.name}" | ||||
}, | }, | ||||
"events": {} | "events": {} | ||||
}, | |||||
}<#if filter_has_next>,</#if> | |||||
</#list> | </#list> | ||||
{ | { | ||||
"id": "id${newId()}", | "id": "id${newId()}", | ||||
@@ -17,15 +17,17 @@ | |||||
"props": { | "props": { | ||||
"label": "${field.label}", | "label": "${field.label}", | ||||
"type": "text", | "type": "text", | ||||
<#if field.maxlength gt 0> | |||||
"maxlength": ${field.maxlength}, | "maxlength": ${field.maxlength}, | ||||
</#if> | |||||
"placeholder": "请输入内容", | "placeholder": "请输入内容", | ||||
"labelWidth": 100, | "labelWidth": 100, | ||||
"dataset": "${field.dataset}", | "dataset": "${field.dataset}", | ||||
"field": "${field.field}", | |||||
"field": "${field.id}", | |||||
"name": "${field.name}" | "name": "${field.name}" | ||||
}, | }, | ||||
"events": {} | "events": {} | ||||
}, | |||||
}<#if field_has_next>,</#if> | |||||
</#list> | </#list> | ||||
] | ] | ||||
} | } |
@@ -32,7 +32,7 @@ | |||||
"field": "${col.field}", | "field": "${col.field}", | ||||
"label": "${col.label}" | "label": "${col.label}" | ||||
} | } | ||||
}, | |||||
}<#if col_has_next>,</#if> | |||||
</#list> | </#list> | ||||
], | ], | ||||
"button": [ | "button": [ | ||||
@@ -0,0 +1,28 @@ | |||||
{ | |||||
"dataset": "${dataset.id}", | |||||
"label": "${dataset.label}", | |||||
"fields": [ | |||||
<#list fields as field> | |||||
{ | |||||
"id": "${field.id}", | |||||
"field": "${field.field}"<#if field.widget gt 0>, | |||||
"lookup": { | |||||
"widgetId": "${field.widget}", | |||||
"widgetId_text": "${field.widgetText}", | |||||
"filters": [] | |||||
} | |||||
</#if> | |||||
}<#if field_has_next>,</#if> | |||||
</#list> | |||||
], | |||||
"filters": [ | |||||
<#list filters as field> | |||||
{ | |||||
"id": "${field.field}", | |||||
"field": "${field.field}", | |||||
"required": ${field.required}, | |||||
"type": "input" | |||||
}<#if field_has_next>,</#if> | |||||
</#list> | |||||
] | |||||
} |
@@ -27,6 +27,7 @@ | |||||
<#elseif (group.type == "card")> | <#elseif (group.type == "card")> | ||||
<#include "incModel/inc_form.ftl"/> | <#include "incModel/inc_form.ftl"/> | ||||
</#if> | </#if> | ||||
<#if group_has_next>,</#if> | |||||
</#list> | </#list> | ||||
] | ] | ||||
} | } | ||||
@@ -34,7 +35,7 @@ | |||||
], | ], | ||||
"model": [ | "model": [ | ||||
<#list datasets as dataset> | <#list datasets as dataset> | ||||
<#include "incModel/inc_dataset.ftl"/> | |||||
<#include "incModel/inc_model.ftl"/><#if dataset_has_next>,</#if> | |||||
</#list> | </#list> | ||||
], | ], | ||||
"option": { | "option": { | ||||
@@ -67,34 +67,8 @@ public class ModelFormTest { | |||||
public void testBuildModelByTmpl() { | public void testBuildModelByTmpl() { | ||||
ModelForm form = new ModelForm(); | ModelForm form = new ModelForm(); | ||||
form.setTitle("测试呀"); | form.setTitle("测试呀"); | ||||
form.setDataset("[{\"id\":\"ds_1813718bf0c\",\"name\":\"master\",\"label\":\"机构列表\",\"type\":\"list\",\"masterTable\":\"718391823709507584\",\"masterTable_text\":\"机构表\",\"idField\":\"pt_id\",\"lazy\":false,\"canEdit\":false,\"fields\":[{\"id\":\"id_1813718bf0e\",\"table\":\"718391823709507584\",\"field\":\"pt_id\",\"name\":\"pt_id\",\"fieldType\":1,\"notNull\":1,\"link\":\"0\"},{\"id\":\"id_1813718bf0f\",\"table\":\"718391823709507584\",\"field\":\"pt_parent_id\",\"name\":\"pt_parent_id\",\"fieldType\":4,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf10\",\"table\":\"718391823709507584\",\"field\":\"pt_level_code\",\"name\":\"pt_level_code\",\"fieldType\":5,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf11\",\"table\":\"718391823709507584\",\"field\":\"pt_area_id\",\"name\":\"pt_area_id\",\"fieldType\":0,\"notNull\":0,\"link\":\"718410950209703936\"},{\"id\":\"id_1813718bf12\",\"table\":\"718391823709507584\",\"field\":\"pt_code\",\"name\":\"pt_code\",\"fieldType\":2,\"notNull\":1,\"link\":\"0\"},{\"id\":\"id_1813718bf13\",\"table\":\"718391823709507584\",\"field\":\"pt_name\",\"name\":\"pt_name\",\"fieldType\":3,\"notNull\":1,\"link\":\"0\"},{\"id\":\"id_1813718bf14\",\"table\":\"718391823709507584\",\"field\":\"pt_type\",\"name\":\"pt_type\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf15\",\"table\":\"718391823709507584\",\"field\":\"pt_statu\",\"name\":\"pt_statu\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf16\",\"table\":\"718391823709507584\",\"field\":\"pt_linker\",\"name\":\"pt_linker\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf17\",\"table\":\"718391823709507584\",\"field\":\"pt_tel\",\"name\":\"pt_tel\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf18\",\"table\":\"718391823709507584\",\"field\":\"pt_addr\",\"name\":\"pt_addr\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf19\",\"table\":\"718391823709507584\",\"field\":\"pt_lon\",\"name\":\"pt_lon\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf1a\",\"table\":\"718391823709507584\",\"field\":\"pt_lat\",\"name\":\"pt_lat\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1813718bf1b\",\"table\":\"718391823709507584\",\"field\":\"pt_remark\",\"name\":\"pt_remark\",\"fieldType\":0,\"notNull\":0,\"link\":\"0\"}],\"filters\":[{\"id\":\"id_1813718bf21\",\"table\":\"718391823709507584\",\"field\":\"pt_name\",\"name\":\"pt_code\",\"fieldType\":3,\"notNull\":1,\"link\":\"0\",\"type\":\"input\",\"sqlName\":\"pt_name\",\"required\":false}],\"data\":[],\"dynCond\":{\"opt\":\"or\",\"children\":[{\"param\":\"pt_code\",\"opt\":\"like\"},{\"param\":\"pt_code\",\"opt\":\"like\"}]},\"sortFields\":[{\"field\":\"pt_code\",\"type\":\"asc\"}]}]"); | |||||
form.setTmpl("{\n" + | |||||
" \"param\": {\n" + | |||||
" \"p1\": \"pp1\"\n" + | |||||
" },\n" + | |||||
" \"layout\": {\n" + | |||||
" \"c1\": [\n" + | |||||
" {\n" + | |||||
" \"name\": \"group2\",\n" + | |||||
" \"label\": \"分组2\",\n" + | |||||
" \"type\": \"list\",\n" + | |||||
" \"dataset\": \"ds_1813718bf0c\",\n" + | |||||
" \"fields\": [\n" + | |||||
" {\n" + | |||||
" \"field\": \"pt_parent_id\",\n" + | |||||
" \"dataset\": \"ds_1813718bf0c\"\n" + | |||||
" }\n" + | |||||
" ],\n" + | |||||
" \"cfilters\": [\n" + | |||||
" {\n" + | |||||
" \"field\": \"pt_code\",\n" + | |||||
" \"dataset\": \"ds_1813718bf0c\"\n" + | |||||
" }\n" + | |||||
" ]\n" + | |||||
" }\n" + | |||||
" ]\n" + | |||||
" }\n" + | |||||
" }"); | |||||
form.setDataset("[{\"id\":\"ds_18147381016\",\"name\":\"master\",\"label\":\"主数据集\",\"type\":\"form\",\"masterTable\":\"2\",\"masterTable_text\":\"目录\",\"idField\":\"mc_id\",\"lazy\":false,\"canEdit\":true,\"fields\":[{\"id\":\"id_1814738101b\",\"table\":\"2\",\"field\":\"mc_id\",\"name\":\"mc_id\",\"fieldType\":1,\"notNull\":1,\"link\":\"0\"},{\"id\":\"id_1814738101c\",\"table\":\"2\",\"field\":\"mc_parent_id\",\"name\":\"mc_parent_id\",\"fieldType\":4,\"notNull\":0,\"link\":\"2\"},{\"id\":\"id_1814738101d\",\"table\":\"2\",\"field\":\"mc_level_code\",\"name\":\"mc_level_code\",\"fieldType\":5,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_1814738101e\",\"table\":\"2\",\"field\":\"mc_prj_id\",\"name\":\"mc_prj_id\",\"fieldType\":0,\"notNull\":1,\"link\":\"1\"},{\"id\":\"id_1814738101f\",\"table\":\"2\",\"field\":\"mc_code\",\"name\":\"mc_code\",\"fieldType\":2,\"notNull\":0,\"link\":\"0\"},{\"id\":\"id_18147381020\",\"table\":\"2\",\"field\":\"mc_name\",\"name\":\"mc_name\",\"fieldType\":3,\"notNull\":0,\"link\":\"0\"}],\"filters\":[],\"data\":[],\"dynCond\":{\"opt\":\"and\"},\"sortFields\":[]}]"); | |||||
form.setTmpl("{\"param\":{},\"layout\":{\"c1\":[{\"id\":\"id18147381019\",\"name\":\"group1\",\"label\":\"分组1\",\"type\":\"card\",\"fields\":[{\"field\":\"id_1814738101c\",\"field_text\":\"mc_parent_id\",\"field_label\":\"父ID\",\"dataset\":\"ds_18147381016\",\"dataset_text\":\"master\"},{\"field\":\"id_1814738101d\",\"field_text\":\"mc_level_code\",\"field_label\":\"级次码\",\"dataset\":\"ds_18147381016\",\"dataset_text\":\"master\"},{\"field\":\"id_1814738101e\",\"field_text\":\"mc_prj_id\",\"field_label\":\"所属项目\",\"dataset\":\"ds_18147381016\",\"dataset_text\":\"master\"},{\"field\":\"id_1814738101f\",\"field_text\":\"mc_code\",\"field_label\":\"编码\",\"dataset\":\"ds_18147381016\",\"dataset_text\":\"master\"},{\"field\":\"id_18147381020\",\"field_text\":\"mc_name\",\"field_label\":\"编码\",\"dataset\":\"ds_18147381016\",\"dataset_text\":\"master\"}],\"sfilters\":[],\"cfilters\":[]}]}}"); | |||||
ModelFormHelper.buildSaveModelByTmpl(form, "model_simple"); | ModelFormHelper.buildSaveModelByTmpl(form, "model_simple"); | ||||
System.out.println(form.getContent()); | System.out.println(form.getContent()); | ||||
} | } | ||||