diff --git a/@rbv b/@rbv
index 1055750e8..8d66ac27e 160000
--- a/@rbv
+++ b/@rbv
@@ -1 +1 @@
-Subproject commit 1055750e8b4add3af4d1ce51a3f1d73f1643d99a
+Subproject commit 8d66ac27ecebf958e3675fd44c39a9d6670d2ed4
diff --git a/src/main/java/com/rebuild/core/configuration/NavBuilder.java b/src/main/java/com/rebuild/core/configuration/NavBuilder.java
index 0124c7395..0de13c0ae 100644
--- a/src/main/java/com/rebuild/core/configuration/NavBuilder.java
+++ b/src/main/java/com/rebuild/core/configuration/NavBuilder.java
@@ -505,8 +505,8 @@ public class NavBuilder extends NavManager {
StringBuilder topNavHtml = new StringBuilder();
for (Object[] nd : topNav) {
- String url = AppUtils.getContextPath("/app/home?n=" + nd[0]);
- if (nd[1] != null) url += "&d=" + nd[1];
+ String url = AppUtils.getContextPath("/app/home?def=" + nd[0]);
+ if (nd[1] != null) url += ":" + nd[1];
topNavHtml.append(String.format(
"
%s", nd[0], url, nd[2]));
}
diff --git a/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java b/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java
index 215b4e245..60b244ba2 100644
--- a/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java
+++ b/src/main/java/com/rebuild/core/metadata/impl/Entity2Schema.java
@@ -56,15 +56,12 @@ public class Entity2Schema extends Field2Schema {
* @return Returns 实体名称
*/
public String createEntity(String entityName, String entityLabel, String comments, String mainEntity, boolean haveNameField, boolean haveSeriesField) {
- entityName = StringUtils.trim(entityName);
- entityLabel = StringUtils.trim(entityLabel);
-
if (!License.isCommercial() && MetadataHelper.getEntities().length >= 100) {
throw new NeedRbvException(Language.L("实体数量超出免费版限制"));
}
+ entityLabel = CommonsUtils.maxstr(StringUtils.trim(entityLabel), 40);
entityName = StringUtils.trim(entityName);
- entityLabel = StringUtils.trim(entityLabel);
if (entityName != null) {
if (MetadataHelper.containsEntity(entityName)) {
diff --git a/src/main/java/com/rebuild/core/metadata/impl/ExcelEntity.java b/src/main/java/com/rebuild/core/metadata/impl/ExcelEntity.java
new file mode 100644
index 000000000..1138f15e4
--- /dev/null
+++ b/src/main/java/com/rebuild/core/metadata/impl/ExcelEntity.java
@@ -0,0 +1,70 @@
+package com.rebuild.core.metadata.impl;
+
+import cn.devezhao.persist4j.Entity;
+import cn.devezhao.persist4j.engine.ID;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.rebuild.core.metadata.MetadataHelper;
+import com.rebuild.core.metadata.easymeta.DisplayType;
+import com.rebuild.core.privileges.UserHelper;
+import com.rebuild.core.support.i18n.Language;
+import com.rebuild.utils.JSONUtils;
+import com.rebuild.utils.RbAssert;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.Assert;
+
+/**
+ * EXCEL 导入实体
+ *
+ * @author RB
+ * @see CopyEntity
+ * @since 2023/12/18
+ */
+@Slf4j
+public class ExcelEntity extends Entity2Schema {
+
+ /**
+ * @param entityName
+ * @param fields
+ * @return
+ */
+ public String imports(String entityName, JSONArray fields) {
+ final ID user = getUser();
+ RbAssert.isAllow(UserHelper.isSuperAdmin(user), Language.L("仅超级管理员可操作"));
+
+ // 1.实体
+ String uniqueEntityName = createEntity(null, entityName, null, null, false, false);
+ Entity entityNew = MetadataHelper.getEntity(uniqueEntityName);
+
+ // 2.字段
+ try {
+ for (Object o : fields) {
+ JSONArray item = (JSONArray) o;
+ String name = item.getString(0);
+ String type = item.getString(1);
+
+ String refEntityOrClass = item.size() > 2 ? item.getString(2) : null;
+ JSON extConfig = null;
+ if ("CLASSIFICATION".equals(type)) {
+ Assert.notNull(refEntityOrClass, "[refEntityOrClass] cannot be null");
+ ID dataId = ID.valueOf(refEntityOrClass);
+ extConfig = JSONUtils.toJSONObject(EasyFieldConfigProps.CLASSIFICATION_USE, dataId);
+ refEntityOrClass = null;
+ }
+
+ createField(entityNew, name, DisplayType.valueOf(type), null, refEntityOrClass, extConfig);
+ }
+
+ } catch (Throwable ex) {
+ // DROP
+ dropEntity(entityNew, true);
+
+ if (ex instanceof MetadataModificationException) {
+ throw (MetadataModificationException) ex;
+ }
+ throw new MetadataModificationException(Language.L("无法导入实体 : %s", ex.getLocalizedMessage()));
+ }
+
+ return uniqueEntityName;
+ }
+}
diff --git a/src/main/java/com/rebuild/core/metadata/impl/Field2Schema.java b/src/main/java/com/rebuild/core/metadata/impl/Field2Schema.java
index 114d88839..0f48762ee 100644
--- a/src/main/java/com/rebuild/core/metadata/impl/Field2Schema.java
+++ b/src/main/java/com/rebuild/core/metadata/impl/Field2Schema.java
@@ -100,7 +100,7 @@ public class Field2Schema extends SetUser {
* @return
*/
public String createField(Entity entity, String fieldLabel, String fieldName, DisplayType type, String comments, String refEntity, JSON extConfig) {
- fieldLabel = StringUtils.trim(fieldLabel);
+ fieldLabel = CommonsUtils.maxstr(StringUtils.trim(fieldLabel), 40);
fieldName = StringUtils.trim(fieldName);
if (StringUtils.length(fieldName) < 4) fieldName = toPinyinName(fieldLabel);
diff --git a/src/main/java/com/rebuild/core/service/general/ObservableService.java b/src/main/java/com/rebuild/core/service/general/ObservableService.java
index d03a9dac5..c6df9e1aa 100644
--- a/src/main/java/com/rebuild/core/service/general/ObservableService.java
+++ b/src/main/java/com/rebuild/core/service/general/ObservableService.java
@@ -100,6 +100,7 @@ public abstract class ObservableService extends Observable implements ServiceSpe
if (countObservers() > 0) {
deleted = EntityHelper.forUpdate(recordId, currentUser, Boolean.FALSE);
deleted = recordSnap(deleted, true);
+ if (deleted == null) return 0;
// 删除前触发,做一些状态保持
setChanged();
diff --git a/src/main/java/com/rebuild/core/service/trigger/aviator/OverOperatorType.java b/src/main/java/com/rebuild/core/service/trigger/aviator/OverOperatorType.java
index 6609dd9a8..d2ab5cda5 100644
--- a/src/main/java/com/rebuild/core/service/trigger/aviator/OverOperatorType.java
+++ b/src/main/java/com/rebuild/core/service/trigger/aviator/OverOperatorType.java
@@ -30,6 +30,7 @@ public class OverOperatorType {
* 日期加
*/
static class DateAdd extends AbstractFunction {
+ private static final long serialVersionUID = -7871678038170332371L;
@Override
public String getName() {
return OperatorType.ADD.getToken();
@@ -54,6 +55,7 @@ public class OverOperatorType {
* 日期减
*/
static class DateSub extends AbstractFunction {
+ private static final long serialVersionUID = 8208361199770129766L;
@Override
public String getName() {
return OperatorType.SUB.getToken();
diff --git a/src/main/java/com/rebuild/utils/CommonsUtils.java b/src/main/java/com/rebuild/utils/CommonsUtils.java
index 10f23cbdd..dc7bfdb23 100644
--- a/src/main/java/com/rebuild/utils/CommonsUtils.java
+++ b/src/main/java/com/rebuild/utils/CommonsUtils.java
@@ -82,9 +82,8 @@ public class CommonsUtils {
* @return
*/
public static String maxstr(String text, int maxLength) {
- if (text.length() > maxLength) {
- return text.substring(0, maxLength);
- }
+ if (text == null) return null;
+ if (text.length() > maxLength) return text.substring(0, maxLength);
return text;
}
diff --git a/src/main/java/com/rebuild/web/admin/data/DataImportController.java b/src/main/java/com/rebuild/web/admin/data/DataImportController.java
index fb0701f43..63b4bb9ea 100644
--- a/src/main/java/com/rebuild/web/admin/data/DataImportController.java
+++ b/src/main/java/com/rebuild/web/admin/data/DataImportController.java
@@ -93,11 +93,12 @@ public class DataImportController extends BaseController {
}
DataFileParser parser;
- int count = -1;
+ int count;
List preview;
try {
parser = new DataFileParser(tmp);
- preview = parser.parse(11);
+ preview = parser.parse(101);
+ count = parser.getRowsCount();
} catch (Exception ex) {
log.error("Parse excel error : " + file, ex);
return RespBody.error(Language.L("无法解析数据,请检查数据文件格式"));
diff --git a/src/main/java/com/rebuild/web/admin/metadata/MetaEntityController.java b/src/main/java/com/rebuild/web/admin/metadata/MetaEntityController.java
index ea8c5c4f6..66b46aa95 100644
--- a/src/main/java/com/rebuild/web/admin/metadata/MetaEntityController.java
+++ b/src/main/java/com/rebuild/web/admin/metadata/MetaEntityController.java
@@ -13,6 +13,7 @@ import cn.devezhao.persist4j.Field;
import cn.devezhao.persist4j.Record;
import cn.devezhao.persist4j.engine.ID;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.api.RespBody;
import com.rebuild.core.Application;
@@ -30,6 +31,7 @@ import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.metadata.impl.CopyEntity;
import com.rebuild.core.metadata.impl.EasyEntityConfigProps;
import com.rebuild.core.metadata.impl.Entity2Schema;
+import com.rebuild.core.metadata.impl.ExcelEntity;
import com.rebuild.core.metadata.impl.MetaEntityService;
import com.rebuild.core.privileges.UserHelper;
import com.rebuild.core.rbstore.MetaSchemaGenerator;
@@ -356,4 +358,14 @@ public class MetaEntityController extends EntityController {
mv.getModel().put("entities", entities);
return mv;
}
+
+ @PostMapping("entity/entity-excel")
+ public RespBody entityExcelEvalft(HttpServletRequest request) {
+ final JSON post = ServletUtils.getRequestJson(request);
+ String entityLabel = ((JSONObject) post).getString("entityLabel");
+ JSONArray fields = ((JSONObject) post).getJSONArray("fields");
+
+ String entityName = new ExcelEntity().imports(entityLabel, fields);
+ return RespBody.ok(entityName);
+ }
}
diff --git a/src/main/java/com/rebuild/web/commons/CommonPageView.java b/src/main/java/com/rebuild/web/commons/CommonPageView.java
index 7cc88d9c5..cf5e5cb33 100644
--- a/src/main/java/com/rebuild/web/commons/CommonPageView.java
+++ b/src/main/java/com/rebuild/web/commons/CommonPageView.java
@@ -16,11 +16,11 @@ import com.rebuild.core.support.RebuildConfiguration;
import com.rebuild.utils.AppUtils;
import com.rebuild.utils.CommonsUtils;
import com.rebuild.web.BaseController;
-import com.rebuild.web.IdParam;
import org.apache.commons.io.FileUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
@@ -87,11 +87,13 @@ public class CommonPageView extends BaseController {
}
@GetMapping("/app/home")
- public void appHome(@IdParam(name = "n", required = false) ID useNav,
- @IdParam(name = "d", required = false) ID useDash,
+ public void appHome(@RequestParam(name = "def", required = false) String def,
HttpServletResponse response) throws IOException {
- addCookie("AppHome.Nav", useNav, response);
- addCookie("AppHome.Dash", useDash, response);
+ if (def != null && def.length() >= 20) {
+ String[] defs = def.split(":");
+ addCookie("AppHome.Nav", ID.isId(defs[0]) ? ID.valueOf(defs[0]) : null, response);
+ addCookie("AppHome.Dash", defs.length > 1 && ID.isId(defs[1]) ? ID.valueOf(defs[1]) : null, response);
+ }
response.sendRedirect("../dashboard/home");
}
diff --git a/src/main/resources/web/admin/metadata/entities.html b/src/main/resources/web/admin/metadata/entities.html
index a123792d6..48782afdf 100644
--- a/src/main/resources/web/admin/metadata/entities.html
+++ b/src/main/resources/web/admin/metadata/entities.html
@@ -70,6 +70,33 @@
.new-entity .card.entity .card-body .ml-7 .text-muted {
display: none;
}
+ .entity-new2 .dialog-footer {
+ margin: 15px -35px 10px;
+ padding-top: 25px;
+ }
+
+ .entity-new2 .init-models {
+ margin-left: -10px;
+ margin-right: -10px;
+ }
+ .table.table-excel th,
+ .table.table-excel td {
+ padding: 3px;
+ border-width: 1px;
+ color: #222;
+ max-width: 200px;
+ }
+ .table.table-excel th {
+ text-align: center;
+ background-color: #dee2e6;
+ color: #444;
+ }
+ .table.table-excel .form-control {
+ width: 100%;
+ min-width: 140px;
+ /* padding: 4px; */
+ /* height: auto !important; */
+ }
@@ -113,6 +140,9 @@
isSuperAdmin: '[[${isSuperAdmin}]]' === 'true',
}
+
+
+
diff --git a/src/main/resources/web/admin/metadata/entity-new.html b/src/main/resources/web/admin/metadata/entity-new.html
deleted file mode 100644
index b58f85111..000000000
--- a/src/main/resources/web/admin/metadata/entity-new.html
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
- [[${bundle.L('添加实体')}]]
-
-
-
-
-
-
-
-
-
diff --git a/src/main/resources/web/admin/metadata/field-new.html b/src/main/resources/web/admin/metadata/field-new.html
deleted file mode 100644
index c31937a51..000000000
--- a/src/main/resources/web/admin/metadata/field-new.html
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
- [[${bundle.L('添加字段')}]]
-
-
-
-
-
-
-
-
-
diff --git a/src/main/resources/web/admin/metadata/fields.html b/src/main/resources/web/admin/metadata/fields.html
index b9d45ade5..2bcaed5d3 100644
--- a/src/main/resources/web/admin/metadata/fields.html
+++ b/src/main/resources/web/admin/metadata/fields.html
@@ -52,7 +52,7 @@
@@ -101,5 +101,7 @@
+
+
|