mirror of
https://github.com/getrebuild/rebuild.git
synced 2024-09-20 15:35:55 +08:00
Metaschema cascade
This commit is contained in:
parent
6c05345bb4
commit
e0e0d4fb7f
|
@ -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)) {
|
||||
|
|
|
@ -18,16 +18,23 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
|
||||
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<String> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,10 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -289,7 +289,7 @@ class DlgImports extends RbModalHandler {
|
|||
{item.updated && (' · ' + item.updated)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="float-right pt-1">
|
||||
<div className="float-right">
|
||||
<button disabled={this.state.inProgress === true} className="btn btn-sm btn-primary" data-file={item.file} data-name={item.name} onClick={this.imports}>导入</button>
|
||||
</div>
|
||||
<div className="clearfix"></div>
|
||||
|
|
|
@ -71,8 +71,11 @@ class MetaschemaList extends React.Component {
|
|||
{item.updated && (' · ' + item.updated)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="float-right pt-1">
|
||||
<button disabled={this.state.inProgress === true} className="btn btn-sm btn-primary" data-file={item.file} data-name={item.name} onClick={this.imports}>导入</button>
|
||||
<div className="float-right">
|
||||
{item.exists ? <button disabled className="btn btn-sm btn-primary">已存在</button>
|
||||
:
|
||||
<button disabled={this.state.inProgress === true} className="btn btn-sm btn-primary" onClick={() => this.imports(item)}>导入</button>
|
||||
}
|
||||
</div>
|
||||
<div className="clearfix"></div>
|
||||
</div>)
|
||||
|
@ -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 = `<strong>导入 [ ${item.name} ]</strong><br>`
|
||||
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(`<strong>导入 [ ${name} ]</strong><br>你可在导入后进行适当调整。开始导入吗?`, {
|
||||
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)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue