diff --git a/.gitignore b/.gitignore
index 78f328560..5821b6b7e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,4 @@ hs_err_pid*
/.production/package-lock.json
/.production/_temp/
/.production/build/
+/.production/
diff --git a/pom.xml b/pom.xml
index a38a5c330..1fc9659b9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -103,6 +103,11 @@
spring-websocket
${spring.version}
+
+ org.springframework.data
+ spring-data-redis
+ 2.1.2.RELEASE
+
org.aspectj
aspectjweaver
@@ -144,9 +149,14 @@
2.9.0
- org.springframework.data
- spring-data-redis
- 2.1.2.RELEASE
+ jstl
+ jstl
+ 1.2
+
+
+ taglibs
+ standard
+ 1.1.2
diff --git a/src/main/java/com/rebuild/server/entityhub/Entity2Schema.java b/src/main/java/com/rebuild/server/entityhub/Entity2Schema.java
index 1525013bd..6185dc6eb 100644
--- a/src/main/java/com/rebuild/server/entityhub/Entity2Schema.java
+++ b/src/main/java/com/rebuild/server/entityhub/Entity2Schema.java
@@ -73,6 +73,11 @@ public class Entity2Schema extends Field2Schema {
}
}
+ final boolean isSlave = StringUtils.isNotBlank(masterEntity);
+ if (isSlave && !MetadataHelper.containsEntity(masterEntity)) {
+ throw new ModificationMetadataException("无效主实体 : " + masterEntity);
+ }
+
String physicalName = "T__" + entityName.toUpperCase();
Object maxTypeCode[] = Application.createQueryNoFilter(
@@ -88,7 +93,7 @@ public class Entity2Schema extends Field2Schema {
if (StringUtils.isNotBlank(comments)) {
record.setString("comments", comments);
}
- if (StringUtils.isNotBlank(masterEntity)) {
+ if (isSlave) {
record.setString("masterEntity", masterEntity);
}
record.setString("nameField", EntityHelper.createdOn);
@@ -103,14 +108,16 @@ public class Entity2Schema extends Field2Schema {
createBuiltinField(tempEntity, EntityHelper.createdOn, "创建时间", DisplayType.DATETIME, null, null, null);
createBuiltinField(tempEntity, EntityHelper.modifiedBy, "修改人", DisplayType.REFERENCE, null, "User", null);
createBuiltinField(tempEntity, EntityHelper.modifiedOn, "修改时间", DisplayType.DATETIME, null, null, null);
- createBuiltinField(tempEntity, EntityHelper.owningUser, "所属用户", DisplayType.REFERENCE, null, "User", null);
- createBuiltinField(tempEntity, EntityHelper.owningDept, "所属部门", DisplayType.REFERENCE, null, "Department", null);
// 明细实体关联字段
- if (masterEntity != null) {
+ // 明细实体无所属用户或部门,使用主实体的
+ if (isSlave) {
String masterLabel = EasyMeta.valueOf(masterEntity).getLabel();
String masterField = masterEntity + "Id";
createBuiltinField(tempEntity, masterField, masterLabel, DisplayType.REFERENCE, "引用主记录(" + masterLabel + ")", masterEntity, CascadeModel.Delete);
+ } else {
+ createBuiltinField(tempEntity, EntityHelper.owningUser, "所属用户", DisplayType.REFERENCE, null, "User", null);
+ createBuiltinField(tempEntity, EntityHelper.owningDept, "所属部门", DisplayType.REFERENCE, null, "Department", null);
}
boolean schemaReady = schema2Database(tempEntity);
diff --git a/src/main/java/com/rebuild/server/helper/manager/DefaultValueManager.java b/src/main/java/com/rebuild/server/helper/manager/DefaultValueManager.java
index 7edf24abd..7e9a5c037 100644
--- a/src/main/java/com/rebuild/server/helper/manager/DefaultValueManager.java
+++ b/src/main/java/com/rebuild/server/helper/manager/DefaultValueManager.java
@@ -28,6 +28,8 @@ import org.apache.commons.logging.LogFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
+import com.rebuild.server.entityhub.DisplayType;
+import com.rebuild.server.entityhub.EasyMeta;
import com.rebuild.server.metadata.MetadataHelper;
import cn.devezhao.persist4j.Entity;
@@ -50,8 +52,15 @@ public class DefaultValueManager {
* @param defaultVals
*/
public static void setFieldsValue(Entity entity, JSON formModel, JSON defaultVals) {
- Map valueReady = new HashMap<>();
+ final JSONArray elements = ((JSONObject) formModel).getJSONArray("elements");
+ // Invalid Model
+ if (elements == null) {
+ return;
+ }
+ Map valuesReady = new HashMap<>();
+
+ // 客户端传递
JSONObject fromClient = (JSONObject) defaultVals;
for (Map.Entry e : fromClient.entrySet()) {
String field = e.getKey();
@@ -61,38 +70,58 @@ public class DefaultValueManager {
continue;
}
- // 引用字段实体
+ // 引用字段实体。&EntityName
if (field.startsWith("&")) {
- if (!ID.isId(value.toString())) {
+ final Object idLabel[] = readyReferenceValue(value);
+ if (idLabel == null) {
continue;
}
- ID sourceRecord = ID.valueOf(value.toString());
- String recordLabel = FieldValueWrapper.getLabel(sourceRecord);
- final Object idLabel[] = new Object[] { sourceRecord.toLiteral(), recordLabel };
-
Entity source = MetadataHelper.getEntity(field.substring(1));
Field[] reftoFields = MetadataHelper.getReferenceToFields(source, entity);
for (Field rtf : reftoFields) {
- valueReady.put(rtf.getName(), idLabel);
+ valuesReady.put(rtf.getName(), idLabel);
}
} else if (entity.containsField(field)) {
- // TODO ...
+ EasyMeta fieldMeta = EasyMeta.valueOf(entity.getField(field));
+ if (fieldMeta.getDisplayType() == DisplayType.REFERENCE) {
+ final Object idLabel[] = readyReferenceValue(value);
+ if (idLabel != null) {
+ valuesReady.put(field, idLabel);
+ }
+ }
+
+ // TODO 填充其他字段值 ...
}
}
- if (valueReady.isEmpty()) {
+ // TODO 后台设置的,应该在后台处理 ???
+
+ if (valuesReady.isEmpty()) {
return;
}
-
- JSONArray elements = ((JSONObject) formModel).getJSONArray("elements");
for (Object o : elements) {
JSONObject item = (JSONObject) o;
String field = item.getString("field");
- if (valueReady.containsKey(field)) {
- item.put("value", valueReady.get(field));
+ if (valuesReady.containsKey(field)) {
+ item.put("value", valuesReady.get(field));
+ valuesReady.remove(field);
}
}
}
+ /**
+ * @param value
+ * @return
+ */
+ private static Object[] readyReferenceValue(Object value) {
+ if (!ID.isId(value.toString())) {
+ return null;
+ }
+
+ ID id = ID.valueOf(value.toString());
+ String label = FieldValueWrapper.getLabel(id);
+ return new Object[] { id.toLiteral(), label };
+ }
+
}
diff --git a/src/main/java/com/rebuild/server/helper/manager/ViewFeatManager.java b/src/main/java/com/rebuild/server/helper/manager/ViewFeatManager.java
index d51517c3e..29da72b5c 100644
--- a/src/main/java/com/rebuild/server/helper/manager/ViewFeatManager.java
+++ b/src/main/java/com/rebuild/server/helper/manager/ViewFeatManager.java
@@ -19,6 +19,7 @@ along with this program. If not, see .
package com.rebuild.server.helper.manager;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -54,7 +55,17 @@ public class ViewFeatManager {
* @return
*/
public static JSON getViewTab(String entity, ID user) {
- return getViewFeat(entity, TYPE_TAB, user);
+ JSON tabs = getViewFeat(entity, TYPE_TAB, user);
+
+ // 明细实体(如有)
+ Entity entityMeta = MetadataHelper.getEntity(entity);
+ if (entityMeta.getSlaveEntity() != null) {
+ String shows[] = EasyMeta.getEntityShows(entityMeta.getSlaveEntity());
+ JSON tabsAll = (JSON) JSON.toJSON(new String[][] { shows });
+ ((JSONArray) tabsAll).fluentAddAll((Collection>) tabs);
+ tabs = tabsAll;
+ }
+ return tabs;
}
/**
@@ -76,12 +87,17 @@ public class ViewFeatManager {
final Object FEAT[] = getRaw(entity, type);
final Permission RoC = TYPE_TAB.equals(type) ? BizzPermission.READ : BizzPermission.CREATE;
- // TODO 未配置则使用全部相关项 ???
+ // 未配置则使用全部相关项
if (FEAT == null) {
Entity entityMeta = MetadataHelper.getEntity(entity);
+
Set refs = new HashSet<>();
for (Field field : entityMeta.getReferenceToFields()) {
Entity e = field.getOwnEntity();
+ // 过滤明细实体
+ if (e.getMasterEntity() != null) {
+ continue;
+ }
if (Application.getSecurityManager().allowed(user, e.getEntityCode(), RoC)) {
refs.add(EasyMeta.getEntityShows(e));
}
diff --git a/src/main/java/com/rebuild/server/query/AdvFilterParser.java b/src/main/java/com/rebuild/server/query/AdvFilterParser.java
index 4c31b1729..8596ecf34 100644
--- a/src/main/java/com/rebuild/server/query/AdvFilterParser.java
+++ b/src/main/java/com/rebuild/server/query/AdvFilterParser.java
@@ -37,6 +37,8 @@ import com.alibaba.fastjson.JSONObject;
import com.rebuild.server.Application;
import com.rebuild.server.bizz.UserHelper;
import com.rebuild.server.bizz.privileges.Department;
+import com.rebuild.server.entityhub.DisplayType;
+import com.rebuild.server.entityhub.EasyMeta;
import com.rebuild.server.metadata.EntityHelper;
import com.rebuild.server.metadata.MetadataHelper;
@@ -138,6 +140,9 @@ public class AdvFilterParser {
}
final Field fieldMeta = rootEntity.getField(field); // TODO 级联字段
+ if (EasyMeta.valueOf(fieldMeta).getDisplayType() == DisplayType.PICKLIST) {
+ field = "&" + field;
+ }
final String op = item.getString("op");
StringBuffer sb = new StringBuffer(field)
@@ -187,7 +192,7 @@ public class AdvFilterParser {
// 占位 {1}
if (value.matches("\\{\\d+\\}")) {
if (values == null) {
- LOG.warn("Invalid item of advfilter : " + item.toJSONString());
+ LOG.warn("Invalid item of AdvFilter : " + item.toJSONString());
return null;
}
diff --git a/src/main/java/com/rebuild/web/PageControll.java b/src/main/java/com/rebuild/web/PageControll.java
index 191a188d7..a288af716 100644
--- a/src/main/java/com/rebuild/web/PageControll.java
+++ b/src/main/java/com/rebuild/web/PageControll.java
@@ -75,12 +75,8 @@ public abstract class PageControll {
*/
protected ModelAndView createModelAndView(String page, String entity, ID user) {
ModelAndView mv = createModelAndView(page);
-
Entity entityMeta = MetadataHelper.getEntity(entity);
- EasyMeta easy = new EasyMeta(entityMeta);
- mv.getModel().put("entityName", easy.getName());
- mv.getModel().put("entityLabel", easy.getLabel());
- mv.getModel().put("entityIcon", easy.getIcon());
+ putEntityMeta(mv, entityMeta);
if (EntityHelper.hasPrivilegesField(entityMeta)) {
Privileges priv = Application.getSecurityManager().getPrivileges(user, entityMeta.getEntityCode());
@@ -111,16 +107,10 @@ public abstract class PageControll {
*/
protected ModelAndView createModelAndView(String page, ID record, ID user) {
ModelAndView mv = createModelAndView(page);
+ Entity entity = MetadataHelper.getEntity(record.getEntityCode());
+ putEntityMeta(mv, entity);
- Entity entityMeta = MetadataHelper.getEntity(record.getEntityCode());
- EasyMeta easy = new EasyMeta(entityMeta);
- mv.getModel().put("entityName", easy.getName());
- mv.getModel().put("entityLabel", easy.getLabel());
- mv.getModel().put("entityIcon", easy.getIcon());
-
- // TODO 验证记录权限
-
- if (EntityHelper.hasPrivilegesField(entityMeta)) {
+ if (EntityHelper.hasPrivilegesField(entity)) {
Permission[] actions = new Permission[] {
BizzPermission.CREATE,
BizzPermission.DELETE,
@@ -140,6 +130,38 @@ public abstract class PageControll {
return mv;
}
+ /**
+ * @param into
+ * @param entity
+ */
+ protected void putEntityMeta(ModelAndView into, Entity entity) {
+ EasyMeta easyMeta = EasyMeta.valueOf(entity);
+ into.getModel().put("entityName", easyMeta.getName());
+ into.getModel().put("entityLabel", easyMeta.getLabel());
+ into.getModel().put("entityIcon", easyMeta.getIcon());
+
+ EasyMeta master = null;
+ EasyMeta slave = null;
+ if (entity.getMasterEntity() != null) {
+ master = EasyMeta.valueOf(entity.getMasterEntity());
+ slave = EasyMeta.valueOf(entity);
+ } else if (entity.getSlaveEntity() != null) {
+ master = EasyMeta.valueOf(entity);
+ slave = EasyMeta.valueOf(entity.getSlaveEntity());
+ } else {
+ into.getModel().put("masterEntity", easyMeta.getName());
+ }
+
+ if (master != null && slave != null) {
+ into.getModel().put("masterEntity", master.getName());
+ into.getModel().put("masterEntityLabel", master.getLabel());
+ into.getModel().put("masterEntityIcon", master.getIcon());
+ into.getModel().put("slaveEntity", slave.getName());
+ into.getModel().put("slaveEntityLabel", slave.getLabel());
+ into.getModel().put("slaveEntityIcon", slave.getIcon());
+ }
+ }
+
// --
/**
@@ -156,7 +178,7 @@ public abstract class PageControll {
*
* @param request
*/
- public static void setPageAttribute(ModelAndView modelAndView) {
- modelAndView.getModel().put("baseUrl", ServerListener.getContextPath());
+ public static void setPageAttribute(ModelAndView into) {
+ into.getModel().put("baseUrl", ServerListener.getContextPath());
}
}
diff --git a/src/main/java/com/rebuild/web/admin/entity/MetaEntityControll.java b/src/main/java/com/rebuild/web/admin/entity/MetaEntityControll.java
index 23ce338ca..63b573c5b 100644
--- a/src/main/java/com/rebuild/web/admin/entity/MetaEntityControll.java
+++ b/src/main/java/com/rebuild/web/admin/entity/MetaEntityControll.java
@@ -69,12 +69,13 @@ public class MetaEntityControll extends BaseControll {
Entity entityMeta = MetadataHelper.getEntity(entity);
mv.getModel().put("nameField", entityMeta.getNameField().getName());
+
if (entityMeta.getMasterEntity() != null) {
mv.getModel().put("masterEntity", entityMeta.getMasterEntity().getName());
- mv.getModel().put("masterEntityLabel", EasyMeta.getLabel(entityMeta.getMasterEntity()));
+ mv.getModel().put("slaveEntity", entityMeta.getName());
} else if (entityMeta.getSlaveEntity() != null) {
+ mv.getModel().put("masterEntity", entityMeta.getName());
mv.getModel().put("slaveEntity", entityMeta.getSlaveEntity().getName());
- mv.getModel().put("slaveEntityLabel", EasyMeta.getLabel(entityMeta.getSlaveEntity()));
}
return mv;
@@ -90,6 +91,10 @@ public class MetaEntityControll extends BaseControll {
public void listEntity(HttpServletRequest request, HttpServletResponse response) throws IOException {
List