Metaschema cascade

This commit is contained in:
oahzeved 2020-05-07 18:28:51 +08:00
parent 6c05345bb4
commit e0e0d4fb7f
6 changed files with 120 additions and 23 deletions

View file

@ -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)) {

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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,

View file

@ -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>

View file

@ -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)
})
}