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('添加实体')}]] - - - -
    -
    - -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - -
    -
    -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    -
    - -
    - -

    [[${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 @@ + + diff --git a/src/main/resources/web/admin/metadata/form-design.html b/src/main/resources/web/admin/metadata/form-design.html index fe102238a..7c38a9ecb 100644 --- a/src/main/resources/web/admin/metadata/form-design.html +++ b/src/main/resources/web/admin/metadata/form-design.html @@ -35,7 +35,7 @@
    -