diff --git a/src/main/java/com/rebuild/server/metadata/entity/Entity2Schema.java b/src/main/java/com/rebuild/server/metadata/entity/Entity2Schema.java index 3513f41f0..038314899 100644 --- a/src/main/java/com/rebuild/server/metadata/entity/Entity2Schema.java +++ b/src/main/java/com/rebuild/server/metadata/entity/Entity2Schema.java @@ -184,7 +184,19 @@ public class Entity2Schema extends Field2Schema { } if (entity.getSlaveEntity() != null) { - throw new ModifiyMetadataException("不能直接删除主实体,请先删除明细实体"); + if (force) { + boolean dropSlave = this.dropEntity(entity.getSlaveEntity(), true); + if (dropSlave) { + entity = MetadataHelper.getEntity(entity.getEntityCode()); + easyMeta = EasyMeta.valueOf(entity); + + } else { + throw new ModifiyMetadataException("不能直接删除主实体,请先删除明细实体"); + } + + } else { + throw new ModifiyMetadataException("不能直接删除主实体,请先删除明细实体"); + } } for (Field whoRef : entity.getReferenceToFields(true)) { diff --git a/src/main/java/com/rebuild/web/admin/rbstore/MetaschemaControll.java b/src/main/java/com/rebuild/web/admin/rbstore/MetaschemaControll.java index 50ecb9097..2facf722d 100644 --- a/src/main/java/com/rebuild/web/admin/rbstore/MetaschemaControll.java +++ b/src/main/java/com/rebuild/web/admin/rbstore/MetaschemaControll.java @@ -18,16 +18,23 @@ along with this program. If not, see . package com.rebuild.web.admin.rbstore; -import cn.devezhao.persist4j.engine.ID; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.rebuild.server.RebuildException; import com.rebuild.server.business.rbstore.MetaschemaImporter; +import com.rebuild.server.business.rbstore.RBStore; import com.rebuild.server.helper.task.TaskExecutors; +import com.rebuild.server.metadata.MetadataHelper; import com.rebuild.web.BaseControll; import org.springframework.stereotype.Controller; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * 导入元数据模型 @@ -40,10 +47,51 @@ public class MetaschemaControll extends BaseControll { @RequestMapping("/admin/metaschema/imports") public void imports(HttpServletRequest request, HttpServletResponse response) throws IOException { - ID user = getRequestUser(request); - String fileUrl = getParameterNotNull(request, "file"); - - MetaschemaImporter importer = new MetaschemaImporter(fileUrl); + final String entityKey = getParameterNotNull(request, "key"); + + JSONArray index = (JSONArray) RBStore.fetchMetaschema("index.json"); + String entityFile = null; + List refFiles = new ArrayList<>(); + for (Object o : index) { + JSONObject item = (JSONObject) o; + if (!entityKey.equalsIgnoreCase(item.getString("key"))) { + continue; + } + + entityFile = item.getString("file"); + JSONArray refs = item.getJSONArray("refs"); + if (refs != null) { + for (Object ref : refs) { + String refEntity = (String) ref; + if (!MetadataHelper.containsEntity(refEntity)) { + refFiles.add(foundFile(index, refEntity)); + } + } + } + break; + } + + Assert.notNull(entityFile, "No metaschema found : " + entityKey); + + // 先处理引用实体 + // NOTE 失败后无回滚 + for (String file : refFiles) { + MetaschemaImporter importer = new MetaschemaImporter(file); + try { + String hasError = importer.verfiy(); + if (hasError != null) { + writeFailure(response, hasError); + return; + } + + TaskExecutors.exec(importer); + } catch (Exception ex) { + writeFailure(response, ex.getLocalizedMessage()); + return; + } + } + + MetaschemaImporter importer = new MetaschemaImporter(entityFile); try { String hasError = importer.verfiy(); if (hasError != null) { @@ -53,8 +101,19 @@ public class MetaschemaControll extends BaseControll { Object entityName = TaskExecutors.exec(importer); writeSuccess(response, entityName); + } catch (Exception ex) { writeFailure(response, ex.getLocalizedMessage()); } } + + private String foundFile(JSONArray index, String key) { + for (Object o : index) { + JSONObject item = (JSONObject) o; + if (key.equalsIgnoreCase(item.getString("key"))) { + return item.getString("file"); + } + } + throw new RebuildException("No metaschema found : " + key); + } } diff --git a/src/main/java/com/rebuild/web/admin/rbstore/RBStoreControll.java b/src/main/java/com/rebuild/web/admin/rbstore/RBStoreControll.java index d403b5ee7..11506b944 100644 --- a/src/main/java/com/rebuild/web/admin/rbstore/RBStoreControll.java +++ b/src/main/java/com/rebuild/web/admin/rbstore/RBStoreControll.java @@ -19,7 +19,10 @@ along with this program. If not, see . package com.rebuild.web.admin.rbstore; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.rebuild.server.business.rbstore.RBStore; +import com.rebuild.server.metadata.MetadataHelper; import com.rebuild.web.BasePageControll; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -40,10 +43,20 @@ public class RBStoreControll extends BasePageControll { public void loadDataIndex(HttpServletRequest request, HttpServletResponse response) throws IOException { String type = getParameterNotNull(request, "type"); JSON index = RBStore.fetchRemoteJson(type + "/index.json"); - if (index == null) { - writeSuccess(response, "无法获取索引数据"); - } else { - writeSuccess(response, index); + writeSuccess(response, index); + } + + @RequestMapping("load-metaschemas") + public void loadMetaschemas(HttpServletResponse response) throws IOException { + JSONArray index = (JSONArray) RBStore.fetchMetaschema("index.json"); + + for (Object o : index) { + JSONObject item = (JSONObject) o; + String key = item.getString("key"); + if (MetadataHelper.containsEntity(key)) { + item.put("exists", true); + } } + writeSuccess(response, index); } } diff --git a/src/main/webapp/assets/css/rb-page.css b/src/main/webapp/assets/css/rb-page.css index e53064905..4e3315580 100644 --- a/src/main/webapp/assets/css/rb-page.css +++ b/src/main/webapp/assets/css/rb-page.css @@ -2081,19 +2081,21 @@ form { } .rbs-indexes>div { - padding: 15px 15px 13px; + padding: 10px 15px; + padding-top: 13px; border-radius: 3px; background-color: #eee; } .rbs-indexes>div+div { - margin-top: 15px; + margin-top: 10px; } .rbs-indexes>div h5 { font-size: 1rem; font-weight: bold; - margin: 0 0 6px; + margin: 0 !important; + margin-bottom: 3px !important; } .rbs-indexes>div .text-muted, diff --git a/src/main/webapp/assets/js/entityhub/classification-editor.jsx b/src/main/webapp/assets/js/entityhub/classification-editor.jsx index 1fb58da5d..7a0fa7e12 100644 --- a/src/main/webapp/assets/js/entityhub/classification-editor.jsx +++ b/src/main/webapp/assets/js/entityhub/classification-editor.jsx @@ -289,7 +289,7 @@ class DlgImports extends RbModalHandler { {item.updated && (' · ' + item.updated)} -
+
diff --git a/src/main/webapp/assets/js/entityhub/entity-new.jsx b/src/main/webapp/assets/js/entityhub/entity-new.jsx index 600eab18b..f916cd6dc 100644 --- a/src/main/webapp/assets/js/entityhub/entity-new.jsx +++ b/src/main/webapp/assets/js/entityhub/entity-new.jsx @@ -71,8 +71,11 @@ class MetaschemaList extends React.Component { {item.updated && (' · ' + item.updated)}
-
- +
+ {item.exists ? + : + + }
) @@ -82,30 +85,38 @@ class MetaschemaList extends React.Component { } componentDidMount() { - $.get('/admin/rbstore/load-index?type=metaschemas', (res) => { + $.get('/admin/rbstore/load-metaschemas', (res) => { if (res.error_code === 0) this.setState({ indexes: res.data }, () => { parent.RbModal.resize() }) else RbHighbar.error(res.error_msg) }) } - imports = (e) => { - const file = e.currentTarget.dataset.file - const name = e.currentTarget.dataset.name + imports(item) { + let tips = `导入 [ ${item.name} ]
` + if ((item.refs || []).length > 0) { + const refNames = [] + this.state.indexes.forEach((bar) => { + if (item.refs.includes(bar.key) && !bar.exists) refNames.push(bar.name) + }) + if (refNames.length > 0) tips += `导入本实体将同时导入 ${refNames.length} 个依赖实体(${refNames.join('、')})。` + } + tips += '你可在导入后进行适当调整。开始导入吗?' + const that = this const $mp2 = (parent && parent.$mp) ? parent.$mp : $mp - parent.RbAlert.create(`导入 [ ${name} ]
你可在导入后进行适当调整。开始导入吗?`, { + parent.RbAlert.create(tips, { html: true, confirm: function () { this.hide() that.setState({ inProgress: true }) $mp2.start() - $.post(`/admin/metaschema/imports?file=${$encode(file)}`, (res) => { + $.post(`/admin/metaschema/imports?key=${(item.key)}`, (res) => { $mp2.end() that.setState({ inProgress: false }) if (res.error_code === 0) { RbHighbar.success('导入完成') - setTimeout(() => { parent.location.href = `../../entity/${res.data}/base` }, 1500) + setTimeout(() => parent.location.href = `../../entity/${res.data}/base`, 1500) } else RbHighbar.error(res.error_msg) }) }