Skip to content

Commit

Permalink
Merge branch 'master' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
getrebuild committed Nov 30, 2023
2 parents 6a803d4 + 6ddfd6e commit 09eb2d0
Show file tree
Hide file tree
Showing 48 changed files with 326 additions and 172 deletions.
2 changes: 1 addition & 1 deletion @rbv
Submodule @rbv updated from 15d7f4 to 2e44d4
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</parent>
<groupId>com.rebuild</groupId>
<artifactId>rebuild</artifactId>
<version>3.5.0-beta1</version>
<version>3.5.0-beta2</version>
<name>rebuild</name>
<description>Building your business-systems freely!</description>
<!-- UNCOMMENT USE TOMCAT -->
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/rebuild/core/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,11 @@ public class Application implements ApplicationListener<ApplicationStartedEvent>
/**
* Rebuild Version
*/
public static final String VER = "3.5.0-beta1";
public static final String VER = "3.5.0-beta2";
/**
* Rebuild Build [MAJOR]{1}[MINOR]{2}[PATCH]{2}[BUILD]{2}
*/
public static final int BUILD = 3050000;
public static final int BUILD = 3050002;

static {
// Driver for DB
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,24 +78,27 @@ public JSONArray getFillinValue(Field field, ID sourceId) {
String cascadingField = easyField.getExtraAttr(EasyFieldConfigProps.REFERENCE_CASCADINGFIELD);
if (StringUtils.isNotBlank(cascadingField)) {
String[] ts = cascadingField.split(MetadataHelper.SPLITER_RE);
ConfigBean fake = new ConfigBean()
.set("target", ts[0])
.set("source", ts[1])
.set("whenCreate", true)
.set("whenUpdate", true)
.set("fillinForce", true);

// 移除冲突的表单回填配置
for (Iterator<ConfigBean> iter = config.iterator(); iter.hasNext(); ) {
ConfigBean cb = iter.next();
if (StringUtils.equals(cb.getString("source"), fake.getString("source"))
&& StringUtils.equals(cb.getString("target"), fake.getString("target"))) {
iter.remove();
break;
// v35 父级的忽略
if (!ts[0].contains(".")) {
ConfigBean fake = new ConfigBean()
.set("target", ts[0])
.set("source", ts[1])
.set("whenCreate", true)
.set("whenUpdate", true)
.set("fillinForce", true);

// 移除冲突的表单回填配置
for (Iterator<ConfigBean> iter = config.iterator(); iter.hasNext(); ) {
ConfigBean cb = iter.next();
if (StringUtils.equals(cb.getString("source"), fake.getString("source"))
&& StringUtils.equals(cb.getString("target"), fake.getString("target"))) {
iter.remove();
break;
}
}
}

config.add(fake);
config.add(fake);
}
}

if (config.isEmpty()) return JSONUtils.EMPTY_ARRAY;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,13 @@ public Set<String> getListFilterPaneFields(ID user, String entity) {

for (String s : quickFields) {
if (s.startsWith("&")) s = s.substring(1);
paneFields.add(s);

if (entityMeta.containsField(s)) {
paneFields.add(s);
} else {
// 不支持二级
if (!s.contains(".")) log.warn("No field in filter pane : {}#{}", entity, s);
}
}
}

Expand Down
18 changes: 6 additions & 12 deletions src/main/java/com/rebuild/core/metadata/EntityRecordCreator.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@ public boolean onSetFieldValueWarn(Field field, String value, Record record) {

final boolean isNew = record.getPrimary() == null;

// 明细关联主记录
if (isNew && isDtmField(field)) return true;
// 明细关联主记录 + 位置定位
if (isNew && isForceCreateable(field)) return true;

// 公共字段前台可能会布局出来
// 此处忽略检查没问题,因为最后还会复写,即 EntityHelper#bindCommonsFieldsValue
Expand Down Expand Up @@ -182,20 +182,14 @@ public void verify(Record record) {
keepFieldValueSafe(record);
}

// 明细关联主记录字段
private boolean isDtmField(Field field) {
// 强制可新建的字段
private boolean isForceCreateable(Field field) {
// DTF 字段(明细关联主记录字段)
if (field.getType() == FieldType.REFERENCE && entity.getMainEntity() != null) {
return field.equals(MetadataHelper.getDetailToMainField(entity));
}
return false;
}

// 强制可新建的字段
private boolean isForceCreateable(Field field) {
// DTF 字段
if (isDtmField(field)) return true;

// 自动定位的
// 启用自动定位的
EasyField easyField = EasyMetaFactory.valueOf(field);
if (easyField.getDisplayType() == DisplayType.LOCATION) {
return BooleanUtils.toBoolean(easyField.getExtraAttr(EasyFieldConfigProps.LOCATION_AUTOLOCATION));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,14 @@ else if (dt == DisplayType.BARCODE) {
}

JSONObject extraAttrs = JSON.parseObject(fieldElement.valueOf("@extra-attrs"));
if (extraAttrs.containsKey("_cascadingFieldChild") && extraAttrs.getString("_cascadingFieldChild").contains(".")) {
// 优先明细>主实体
String _cascadingFieldChild = extraAttrs.getString("_cascadingFieldChild");
if (_cascadingFieldChild != null && _cascadingFieldChild.contains(".")) {
// 优先使用明细>主实体
} else {
extraAttrs.put("_cascadingFieldChild", fs[2] + SPLITER + fs[3]);
fieldElement.addAttribute("extra-attrs", extraAttrs.toJSONString());
}
// FIXME v35 多个子级(使用 ; 分割)
}

if (log.isDebugEnabled()) XmlHelper.dump(rootElement);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.rebuild.core.privileges.UserHelper;
import com.rebuild.core.privileges.UserService;
import com.rebuild.core.service.query.AdvFilterParser;
import com.rebuild.core.service.query.ParseHelper;
import com.rebuild.core.support.SetUser;
import com.rebuild.core.support.general.FieldValueHelper;
import com.rebuild.core.support.i18n.Language;
Expand Down Expand Up @@ -217,17 +218,17 @@ protected String getFilterSql() {
}
}

JSONObject filterExp = config.getJSONObject("filter");
if (filterExp == null || filterExp.isEmpty()) {
return previewFilter + "(1=1)";
JSONObject filterExpr = config.getJSONObject("filter");
if (ParseHelper.validAdvFilter(filterExpr)) {
AdvFilterParser filterParser = new AdvFilterParser(filterExpr);
String sqlWhere = filterParser.toSqlWhere();
if (sqlWhere != null) {
sqlWhere = previewFilter + sqlWhere;
}
return StringUtils.defaultIfBlank(sqlWhere, "(1=1)");
}

AdvFilterParser filterParser = new AdvFilterParser(filterExp);
String sqlWhere = filterParser.toSqlWhere();
if (sqlWhere != null) {
sqlWhere = previewFilter + sqlWhere;
}
return StringUtils.defaultIfBlank(sqlWhere, "(1=1)");
return previewFilter + "(1=1)";
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ protected ID checkoutReferenceValue(Field field, Cell cell) {
if (refEntity.getEntityCode() == EntityHelper.User) {
String sql = MessageFormat.format(
"select userId from User where loginName = ''{0}'' or email = ''{0}'' or fullName = ''{0}''",
CommonsUtils.escapeSql(val2Text.toString()));
CommonsUtils.escapeSql(val2Text));
query = Application.createQueryNoFilter(sql);
} else {
// 查找引用实体的名称字段和自动编号字段
Expand All @@ -248,7 +248,7 @@ protected ID checkoutReferenceValue(Field field, Cell cell) {
String.format("select %s from %s where ", refEntity.getPrimaryField().getName(), refEntity.getName()));
for (String qf : queryFields) {
sql.append(
String.format("%s = '%s' or ", qf, CommonsUtils.escapeSql(val2Text.toString())));
String.format("%s = '%s' or ", qf, CommonsUtils.escapeSql(val2Text)));
}
sql = new StringBuilder(sql.substring(0, sql.length() - 4));

Expand Down
12 changes: 12 additions & 0 deletions src/main/java/com/rebuild/core/service/query/AdvFilterParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@ public AdvFilterParser(JSONObject filterExpr, Entity rootEntity) {
this.filterExpr = filterExpr;
this.rootEntity = rootEntity;
this.varRecord = null;

String entityName = filterExpr.getString("entity");
if (entityName != null) {
Assert.isTrue(entityName.equalsIgnoreCase(this.rootEntity.getName()),
"Filter#2 uses different entities : " + entityName + "/" + this.rootEntity.getName());
}
}

/**
Expand All @@ -115,6 +121,12 @@ public AdvFilterParser(JSONObject filterExpr, ID varRecord) {
this.filterExpr = filterExpr;
this.rootEntity = MetadataHelper.getEntity(varRecord.getEntityCode());
this.varRecord = License.isRbvAttached() ? varRecord : null;

String entityName = filterExpr.getString("entity");
if (entityName != null) {
Assert.isTrue(entityName.equalsIgnoreCase(this.rootEntity.getName()),
"Filter#3 uses different entities : " + entityName + "/" + this.rootEntity.getName());
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@ public FilterRecordChecker(JSONObject filterExpr) {
* @return
*/
public boolean check(ID recordId) {
if (filterExpr == null || filterExpr.isEmpty()
|| filterExpr.getJSONArray("items") == null || filterExpr.getJSONArray("items").isEmpty()) {
return true;
}
if (!ParseHelper.validAdvFilter(filterExpr)) return true;

Entity entity = MetadataHelper.getEntity(recordId.getEntityCode());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.rebuild.core.service.general.OperatingContext;
import com.rebuild.core.service.general.RecordDifference;
import com.rebuild.core.service.query.AdvFilterParser;
import com.rebuild.core.service.query.ParseHelper;
import com.rebuild.core.service.query.QueryHelper;
import com.rebuild.core.service.trigger.ActionContext;
import com.rebuild.core.service.trigger.ActionType;
Expand Down Expand Up @@ -161,7 +162,7 @@ public Object execute(OperatingContext operatingContext) throws TriggerException
// 聚合数据过滤
JSONObject dataFilter = ((JSONObject) actionContext.getActionContent()).getJSONObject("dataFilter");
String dataFilterSql = null;
if (dataFilter != null && !dataFilter.isEmpty()) {
if (ParseHelper.validAdvFilter(dataFilter)) {
dataFilterSql = new AdvFilterParser(dataFilter, operatingContext.getFixedRecordId()).toSqlWhere();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ public void refresh() {
fa.targetEntity = parent.targetEntity;
fa.targetRecordIds = Collections.singleton(beforeValue);

Record fakeSourceRecord = EntityHelper.forUpdate(EntityHelper.newUnsavedId(fa.sourceEntity.getEntityCode()), triggerUser, false);
ID fakeSourceId = EntityHelper.newUnsavedId(fa.sourceEntity.getEntityCode());
Record fakeSourceRecord = EntityHelper.forUpdate(fakeSourceId, triggerUser, false);
OperatingContext oCtx = OperatingContext.create(triggerUser, BizzPermission.NONE, fakeSourceRecord, fakeSourceRecord);
fa.targetRecordData = fa.buildTargetRecordData(oCtx, true);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.rebuild.core.service.trigger.ActionType;
import com.rebuild.core.service.trigger.TriggerException;
import com.rebuild.core.support.i18n.Language;
import com.rebuild.utils.CommonsUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;
Expand Down Expand Up @@ -223,28 +224,28 @@ else if (sourceFieldEasy.getDisplayType() == DisplayType.CLASSIFICATION) {
}
}

qFields.add(String.format("%s = '%s'", targetField, val));
qFieldsFollow.add(String.format("%s = '%s'", sourceField, val));
qFields.add(String.format("%s = '%s'", targetField, CommonsUtils.escapeSql(val)));
qFieldsFollow.add(String.format("%s = '%s'", sourceField, CommonsUtils.escapeSql(val)));
allNull = false;
}

qFieldsRefresh.add(new String[] { targetField, sourceField, val == null ? null : val.toString() });
}

if (allNull) {
// 如果分组字段值全空将会触发全量更新
if (!valueChanged.isEmpty()) {
this.groupAggregationRefresh = new GroupAggregationRefresh(this, qFieldsRefresh);
} else {
if (valueChanged.isEmpty()) {
log.warn("All values of group-fields are null, ignored");
} else {
// 如果分组字段值全空将会触发全量更新
this.groupAggregationRefresh = new GroupAggregationRefresh(this, qFieldsRefresh, operatingContext.getFixedRecordId());
}
return;
}

this.followSourceWhere = StringUtils.join(qFieldsFollow.iterator(), " and ");

if (isGroupUpdate) {
this.groupAggregationRefresh = new GroupAggregationRefresh(this, qFieldsRefresh);
this.groupAggregationRefresh = new GroupAggregationRefresh(this, qFieldsRefresh, operatingContext.getFixedRecordId());
}

sql = String.format("select %s from %s where ( %s )",
Expand Down
Loading

0 comments on commit 09eb2d0

Please sign in to comment.