diff --git a/@rbv b/@rbv index 09da8d287..0f0dfa3fe 160000 --- a/@rbv +++ b/@rbv @@ -1 +1 @@ -Subproject commit 09da8d287be7103eeb3bfe727cdb75d5e19e3bb1 +Subproject commit 0f0dfa3fed8bad766e863c5db1a9b472e8b1f018 diff --git a/src/main/java/com/rebuild/core/configuration/general/BaseLayoutManager.java b/src/main/java/com/rebuild/core/configuration/general/BaseLayoutManager.java index 12558b93d..e8b594c48 100644 --- a/src/main/java/com/rebuild/core/configuration/general/BaseLayoutManager.java +++ b/src/main/java/com/rebuild/core/configuration/general/BaseLayoutManager.java @@ -10,8 +10,9 @@ package com.rebuild.core.configuration.general; import cn.devezhao.persist4j.engine.ID; import com.alibaba.fastjson.JSON; import com.rebuild.core.Application; -import com.rebuild.core.RebuildException; import com.rebuild.core.configuration.ConfigBean; +import com.rebuild.core.configuration.ConfigurationException; +import com.rebuild.core.privileges.bizz.ZeroEntry; /** * 基础布局管理 @@ -36,14 +37,13 @@ public class BaseLayoutManager extends ShareToManager { public static final String TYPE_LISTSTATS = "LISTSTATS"; // 列表-查询面板 public static final String TYPE_LISTFILTERPANE = "LISTFILTERPANE"; - // 列表-图表 of Widget + // 列表-图表 public static final String TYPE_WCHARTS = "WCHARTS"; // 视图-相关项 public static final String TYPE_TAB = "TAB"; // 视图-新建相关 public static final String TYPE_ADD = "ADD"; - @Override protected String getConfigEntity() { return "LayoutConfig"; @@ -82,13 +82,19 @@ public class BaseLayoutManager extends ShareToManager { * @return */ public ConfigBean getLayout(ID user, String belongEntity, String applyType) { - ID detected = detectUseConfig(user, belongEntity, applyType); - if (detected == null) { - return null; + // 221125 无权限不允许使用自有配置 + boolean firstUseSelf = true; + if (TYPE_NAV.equals(applyType)) { + firstUseSelf = Application.getPrivilegesManager().allow(user, ZeroEntry.AllowCustomNav); + } else if (TYPE_DATALIST.equals(applyType)) { + firstUseSelf = Application.getPrivilegesManager().allow(user, ZeroEntry.AllowCustomDataList); } + ID detected = detectUseConfig(user, belongEntity, applyType, firstUseSelf); + if (detected == null) return null; + Object[][] cached = getAllConfig(belongEntity, applyType); - return findEntry(cached, detected); + return findConfigBean(cached, detected); } /** @@ -100,12 +106,10 @@ public class BaseLayoutManager extends ShareToManager { "select belongEntity,applyType from LayoutConfig where configId = ?") .setParameter(1, cfgid) .unique(); - if (o == null) { - throw new RebuildException("No config found : " + cfgid); - } + if (o == null) throw new ConfigurationException("No config found : " + cfgid); Object[][] cached = getAllConfig((String) o[0], (String) o[1]); - return findEntry(cached, cfgid); + return findConfigBean(cached, cfgid); } /** @@ -113,7 +117,7 @@ public class BaseLayoutManager extends ShareToManager { * @param cfgid * @return */ - protected ConfigBean findEntry(Object[][] uses, ID cfgid) { + protected ConfigBean findConfigBean(Object[][] uses, ID cfgid) { for (Object[] c : uses) { if (c[0].equals(cfgid)) { return new ConfigBean() diff --git a/src/main/java/com/rebuild/core/configuration/general/DataListCategory.java b/src/main/java/com/rebuild/core/configuration/general/DataListCategory.java index f91959d01..160334058 100644 --- a/src/main/java/com/rebuild/core/configuration/general/DataListCategory.java +++ b/src/main/java/com/rebuild/core/configuration/general/DataListCategory.java @@ -64,13 +64,18 @@ public class DataListCategory { } else { + String cf = EasyMetaFactory.valueOf(entity).getExtraAttr(EasyEntityConfigProps.ADV_LIST_SHOWCATEGORY); + String[] ff = cf.split(":"); + String ffField = ff[0]; + String ffFormat = ff.length > 1 ? ff[1] : null; + String sql; if (dt == DisplayType.N2NREFERENCE) { sql = MessageFormat.format( "select distinct referenceId from NreferenceItem where belongEntity = ''{0}'' and belongField = ''{1}''", - entity.getName(), categoryField.getName()); + entity.getName(), ffField); } else { - String wrapField = categoryField.getName(); + String wrapField = ffField; if (dt == DisplayType.DATETIME) { wrapField = String.format("DATE_FORMAT(%s, '%%Y-%%m-%%d')", wrapField); } @@ -85,10 +90,6 @@ public class DataListCategory { : Application.getQueryFactory().createQuery(sql, user); Object[][] array = query.array(); - String cf = EasyMetaFactory.valueOf(entity).getExtraAttr(EasyEntityConfigProps.ADV_LIST_SHOWCATEGORY); - String[] ff = cf.split(":"); - String format = ff.length > 1 ? ff[1] : null; - Set unique = new HashSet<>(); for (Object[] o : array) { @@ -96,11 +97,11 @@ public class DataListCategory { Object label; if (dt == DisplayType.DATE || dt == DisplayType.DATETIME) { - format = StringUtils.defaultIfBlank(format, CalendarUtils.UTC_DATE_FORMAT); + ffFormat = StringUtils.defaultIfBlank(ffFormat, CalendarUtils.UTC_DATE_FORMAT); if (id instanceof Date) { - label = CalendarUtils.format(format, (Date) id); + label = CalendarUtils.format(ffFormat, (Date) id); } else { - label = id.toString().substring(0, format.length()); + label = id.toString().substring(0, ffFormat.length()); } id = label; diff --git a/src/main/java/com/rebuild/core/configuration/general/DataListManager.java b/src/main/java/com/rebuild/core/configuration/general/DataListManager.java index ba2eb3b7b..2e26a44c4 100644 --- a/src/main/java/com/rebuild/core/configuration/general/DataListManager.java +++ b/src/main/java/com/rebuild/core/configuration/general/DataListManager.java @@ -47,19 +47,21 @@ public class DataListManager extends BaseLayoutManager { * @param entity * @param user * @return + * @see #formatListFields(String, ID, boolean, ConfigBean) */ - public JSON getFieldsLayout(String entity, ID user) { - return getFieldsLayout(entity, user, true); + public JSON getListFields(String entity, ID user) { + return getListFields(entity, user, true); } /** * @param entity * @param user - * @param filter 过滤无读取权限的字段 + * @param filter * @return + * @see #formatListFields(String, ID, boolean, ConfigBean) */ - public JSON getFieldsLayout(String entity, ID user, boolean filter) { - return formatFieldsLayout(entity, user, filter, getLayoutOfDatalist(user, entity)); + public JSON getListFields(String entity, ID user, boolean filter) { + return formatListFields(entity, user, filter, getLayoutOfDatalist(user, entity)); } /** @@ -69,7 +71,7 @@ public class DataListManager extends BaseLayoutManager { * @param config * @return */ - public JSON formatFieldsLayout(String entity, ID user, boolean filter, ConfigBean config) { + public JSON formatListFields(String entity, ID user, boolean filter, ConfigBean config) { List> columnList = new ArrayList<>(); Entity entityMeta = MetadataHelper.getEntity(entity); Field namedField = entityMeta.getNameField(); @@ -259,7 +261,7 @@ public class DataListManager extends BaseLayoutManager { * @return */ public JSON getFieldsLayoutMode2(Entity entity) { - JSONObject emptyConfig = (JSONObject) formatFieldsLayout(entity.getName(), null, true, null); + JSONObject emptyConfig = (JSONObject) formatListFields(entity.getName(), null, true, null); JSONArray fields = emptyConfig.getJSONArray("fields"); if (entity.containsField(EntityHelper.ApprovalState)) { diff --git a/src/main/java/com/rebuild/core/configuration/general/FormsBuilder.java b/src/main/java/com/rebuild/core/configuration/general/FormsBuilder.java index dfb610537..404e0c640 100644 --- a/src/main/java/com/rebuild/core/configuration/general/FormsBuilder.java +++ b/src/main/java/com/rebuild/core/configuration/general/FormsBuilder.java @@ -179,10 +179,17 @@ public class FormsBuilder extends FormsManager { // 自动只读 Set roAutos = EasyMetaFactory.getAutoReadonlyFields(entity); + Set roAutosWithout = record == null ? null : Collections.emptySet(); for (Object o : elements) { JSONObject field = (JSONObject) o; if (roAutos.contains(field.getString("field"))) { field.put("readonly", true); + + // 前端可收集值 + if (roAutosWithout == null) roAutosWithout = AutoFillinManager.instance.getAutoReadonlyFields(entity); + if (roAutosWithout.contains(field.getString("field"))) { + field.put("readonlyw", true); + } } } diff --git a/src/main/java/com/rebuild/core/configuration/general/ShareToManager.java b/src/main/java/com/rebuild/core/configuration/general/ShareToManager.java index df916ac73..403bfce7b 100644 --- a/src/main/java/com/rebuild/core/configuration/general/ShareToManager.java +++ b/src/main/java/com/rebuild/core/configuration/general/ShareToManager.java @@ -73,16 +73,30 @@ public abstract class ShareToManager implements ConfigManager { * @param belongEntity * @param applyType * @return + * @see #detectUseConfig(ID, String, String, boolean) */ public ID detectUseConfig(ID user, String belongEntity, String applyType) { + return detectUseConfig(user, belongEntity, applyType, Boolean.TRUE); + } + + /** + * @param user + * @param belongEntity + * @param applyType + * @param firstUseSelf + * @return + */ + protected ID detectUseConfig(ID user, String belongEntity, String applyType, boolean firstUseSelf) { final Object[][] alls = getAllConfig(belongEntity, applyType); if (alls.length == 0) return null; // 1.优先使用自己的 - for (Object[] d : alls) { - ID createdBy = (ID) d[2]; - if (UserHelper.isSelf(user, createdBy)) { - return (ID) d[0]; + if (firstUseSelf) { + for (Object[] d : alls) { + ID createdBy = (ID) d[2]; + if (UserHelper.isSelf(user, createdBy)) { + return (ID) d[0]; + } } } diff --git a/src/main/java/com/rebuild/core/metadata/EntityHelper.java b/src/main/java/com/rebuild/core/metadata/EntityHelper.java index 160f8e561..231b28542 100644 --- a/src/main/java/com/rebuild/core/metadata/EntityHelper.java +++ b/src/main/java/com/rebuild/core/metadata/EntityHelper.java @@ -23,7 +23,7 @@ import java.util.Date; /** * @author Zhao Fangfang * @see MetadataHelper - * @since 1.0, 2013-6-26 + * @since 1.0, 2018-6-26 */ public class EntityHelper { diff --git a/src/main/java/com/rebuild/core/metadata/EntityRecordCreator.java b/src/main/java/com/rebuild/core/metadata/EntityRecordCreator.java index fdcccf145..203fa3747 100644 --- a/src/main/java/com/rebuild/core/metadata/EntityRecordCreator.java +++ b/src/main/java/com/rebuild/core/metadata/EntityRecordCreator.java @@ -35,7 +35,7 @@ import java.util.regex.Pattern; * 从 JSON 解析 Record * * @author Zhao Fangfang - * @since 1.0, 2013-6-26 + * @since 1.0, 2018-6-26 * @see RecordBuilder */ @Slf4j diff --git a/src/main/java/com/rebuild/core/privileges/RoleBaseQueryFilter.java b/src/main/java/com/rebuild/core/privileges/RoleBaseQueryFilter.java index f2da666af..3712c2bd5 100644 --- a/src/main/java/com/rebuild/core/privileges/RoleBaseQueryFilter.java +++ b/src/main/java/com/rebuild/core/privileges/RoleBaseQueryFilter.java @@ -39,7 +39,7 @@ import java.util.Set; * 基于角色权限的查询过滤器 * * @author Zhao Fangfang - * @since 1.0, 2013-6-21 + * @since 1.0, 2018-6-21 */ @Slf4j public class RoleBaseQueryFilter implements Filter, QueryFilter { diff --git a/src/main/java/com/rebuild/core/service/dataimport/DataExporter.java b/src/main/java/com/rebuild/core/service/dataimport/DataExporter.java index 24ecf6368..c6be7f5f5 100644 --- a/src/main/java/com/rebuild/core/service/dataimport/DataExporter.java +++ b/src/main/java/com/rebuild/core/service/dataimport/DataExporter.java @@ -220,7 +220,7 @@ public class DataExporter extends SetUser { @Override protected DataListWrapper createDataListWrapper(int totalRows, Object[][] data, Query query) { DataListWrapper wrapper = super.createDataListWrapper(totalRows, data, query); - wrapper.setSecWrapper(false); + wrapper.setMixWrapper(false); return wrapper; } } 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 da724c455..5e89575ba 100644 --- a/src/main/java/com/rebuild/core/service/general/ObservableService.java +++ b/src/main/java/com/rebuild/core/service/general/ObservableService.java @@ -125,9 +125,7 @@ public abstract class ObservableService extends Observable implements ServiceSpe fields.add(base.getEntity().getPrimaryField().getName()); Record snap = Application.getQueryFactory().recordNoFilter(primaryId, fields.toArray(new String[0])); - if (snap == null) { - throw new NoRecordFoundException(primaryId); - } + if (snap == null) throw new NoRecordFoundException(primaryId); return snap; } diff --git a/src/main/java/com/rebuild/core/service/general/series/IncreasingVar.java b/src/main/java/com/rebuild/core/service/general/series/IncreasingVar.java index bc7c7943b..b39f563c3 100644 --- a/src/main/java/com/rebuild/core/service/general/series/IncreasingVar.java +++ b/src/main/java/com/rebuild/core/service/general/series/IncreasingVar.java @@ -12,10 +12,13 @@ import cn.devezhao.commons.ObjectUtils; import cn.devezhao.persist4j.Field; import com.rebuild.core.Application; import com.rebuild.core.support.KVStorage; +import com.rebuild.core.support.RebuildConfiguration; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; /** * 数字自增系列 @@ -23,9 +26,11 @@ import java.util.Map; * @author devezhao * @since 12/24/2018 */ +@Slf4j public class IncreasingVar extends SeriesVar { - private static final Map LOCKs = new HashMap<>(); + private static final Object LOCK = new Object(); + private static final Map INCREASINGS = new ConcurrentHashMap<>(); private Field field; private String zeroFlag; @@ -57,51 +62,40 @@ public class IncreasingVar extends SeriesVar { } final String nameKey = String.format("Series-%s.%s", field.getOwnEntity().getName(), field.getName()); - Object keyLock = null; - synchronized (LOCKs) { - if (null == keyLock) { - keyLock = LOCKs.computeIfAbsent(nameKey, k -> new Object()); - } - } - int nextValue; - synchronized (keyLock) { - String val = KVStorage.getCustomValue(nameKey); - if (val != null) { - nextValue = ObjectUtils.toInt(val); - } else { - nextValue = countFromDb(); - } - nextValue += 1; + synchronized (LOCK) { + AtomicInteger incr = INCREASINGS.get(nameKey); + if (incr == null) { + String val = KVStorage.getCustomValue(nameKey); + int init = val == null ? countFromDb() : ObjectUtils.toInt(val); - // TODO 使用缓存,避免频繁更新数据库 - KVStorage.setCustomValue(nameKey, nextValue); + incr = new AtomicInteger(init); + INCREASINGS.put(nameKey, incr); + } + + int nextValue = incr.incrementAndGet(); + RebuildConfiguration.setCustomValue(nameKey, nextValue, Boolean.TRUE); + + return StringUtils.leftPad(nextValue + "", getSymbols().length(), '0'); } - return StringUtils.leftPad(nextValue + "", getSymbols().length(), '0'); } /** * 清空序号缓存 */ protected void clean() { - if (this.field == null) { - return; - } + if (this.field == null) return; final String nameKey = String.format("Series-%s.%s", field.getOwnEntity().getName(), field.getName()); - Object keyLock = null; - synchronized (LOCKs) { - if (null == keyLock) { - keyLock = LOCKs.computeIfAbsent(nameKey, k -> new Object()); - } - } - synchronized (keyLock) { - KVStorage.setCustomValue(nameKey, 0); + synchronized (LOCK) { + INCREASINGS.remove(nameKey); + RebuildConfiguration.setCustomValue(nameKey, 0, Boolean.TRUE); } } /** + * NOTE * 例如有100条记录,序号也为100。 * 但是删除了10条后,调用此方法所生产的序号只有 90(直接采用 count 记录数) * @@ -123,7 +117,8 @@ public class IncreasingVar extends SeriesVar { dateLimit = "(1=1)"; } - String sql = String.format("select count(%s) from %s where %s", field.getName(), field.getOwnEntity().getName(), dateLimit); + String sql = String.format("select count(%s) from %s where %s", + field.getName(), field.getOwnEntity().getName(), dateLimit); Object[] count = Application.createQueryNoFilter(sql).unique(); return ObjectUtils.toInt(count[0]); } diff --git a/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregation.java b/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregation.java index 9adaae6ca..3d0e6d282 100644 --- a/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregation.java +++ b/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregation.java @@ -264,6 +264,16 @@ public class FieldAggregation extends TriggerAction { targetRecordId = (ID) o[0]; } + // fix: v3.1.3 清空字段值以后无法找到记录 + if (o != null && targetRecordId == null + && operatingContext.getAction() == BizzPermission.UPDATE && this.getClass() == FieldAggregation.class) { + ID beforeValue = operatingContext.getBeforeRecord().getID(followSourceField); + ID afterValue = operatingContext.getAfterRecord().getID(followSourceField); + if (beforeValue != null && afterValue == null) { + targetRecordId = beforeValue; + } + } + this.followSourceWhere = String.format("%s = '%s'", followSourceField, targetRecordId); } diff --git a/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregationRefresh.java b/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregationRefresh.java index 53edf955f..e2e73bf47 100644 --- a/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregationRefresh.java +++ b/src/main/java/com/rebuild/core/service/trigger/impl/FieldAggregationRefresh.java @@ -45,14 +45,15 @@ public class FieldAggregationRefresh { // FIELD.ENTITY String[] targetFieldEntity = ((JSONObject) parentAc.getActionContent()).getString("targetEntity").split("\\."); + String followSourceField = targetFieldEntity[0]; - ID beforeRefreshedId = operatingContext.getBeforeRecord().getID(targetFieldEntity[0]); - ID afterRefreshedId = operatingContext.getAfterRecord().getID(targetFieldEntity[0]); + final ID beforeValue = operatingContext.getBeforeRecord().getID(followSourceField); + final ID afterValue = operatingContext.getAfterRecord().getID(followSourceField); // 之前未聚合 - if (beforeRefreshedId == null) return; + if (beforeValue == null) return; // 未更新 - if (beforeRefreshedId.equals(afterRefreshedId)) return; + if (beforeValue.equals(afterValue)) return; ActionContext actionContext = new ActionContext(null, parentAc.getSourceEntity(), parentAc.getActionContent(), parentAc.getConfigId()); @@ -60,17 +61,14 @@ public class FieldAggregationRefresh { FieldAggregation fa = new FieldAggregation(actionContext, true); fa.sourceEntity = parent.sourceEntity; fa.targetEntity = parent.targetEntity; - fa.targetRecordId = beforeRefreshedId; - fa.followSourceWhere = String.format("%s = '%s'", targetFieldEntity[0], beforeRefreshedId); + fa.targetRecordId = beforeValue; + fa.followSourceWhere = String.format("%s = '%s'", followSourceField, beforeValue); - Record fakeSourceRecord = EntityHelper.forUpdate(beforeRefreshedId, triggerUser, false); + Record fakeSourceRecord = EntityHelper.forUpdate(beforeValue, triggerUser, false); OperatingContext oCtx = OperatingContext.create(triggerUser, BizzPermission.NONE, fakeSourceRecord, fakeSourceRecord); try { fa.execute(oCtx); -// } catch (Throwable ex) { -// // v3.1 出现异常可能导致事物回滚执行,因此此处 catch 并无意义 -// log.error("Error on trigger ({}) refresh", parentAc.getConfigId(), ex); } finally { fa.clean(); } diff --git a/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregation.java b/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregation.java index 1e3b04ed7..8237bd1a8 100644 --- a/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregation.java +++ b/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregation.java @@ -11,6 +11,7 @@ import cn.devezhao.bizz.privileges.impl.BizzPermission; import cn.devezhao.commons.CalendarUtils; import cn.devezhao.persist4j.Record; import cn.devezhao.persist4j.engine.ID; +import cn.devezhao.persist4j.engine.NullValue; import cn.devezhao.persist4j.metadata.MissingMetaExcetion; import com.alibaba.fastjson.JSONObject; import com.rebuild.core.Application; @@ -107,11 +108,11 @@ public class GroupAggregation extends FieldAggregation { // 1.源记录数据 - String ql = String.format("select %s from %s where %s = ?", + String sql = String.format("select %s from %s where %s = ?", StringUtils.join(groupFieldsMapping.keySet().iterator(), ","), sourceEntity.getName(), sourceEntity.getPrimaryField().getName()); - Record sourceRecord = Application.createQueryNoFilter(ql) + final Record sourceRecord = Application.createQueryNoFilter(sql) .setParameter(1, actionContext.getSourceRecord()) .record(); @@ -122,10 +123,24 @@ public class GroupAggregation extends FieldAggregation { List qFieldsRefresh = new ArrayList<>(); boolean allNull = true; + final boolean isGroupUpdate = operatingContext.getAction() == BizzPermission.UPDATE && this.getClass() == GroupAggregation.class; + + // 保存前/后值 + Map valueChanged = new HashMap<>(); + for (Map.Entry e : groupFieldsMapping.entrySet()) { String sourceField = e.getKey(); String targetField = e.getValue(); + if (isGroupUpdate) { + Object beforeValue = operatingContext.getBeforeRecord().getObjectValue(sourceField); + Object afterValue = operatingContext.getAfterRecord().getObjectValue(sourceField); + if (NullValue.isNull(beforeValue) && NullValue.isNull(afterValue)) { + } else { + valueChanged.put(sourceField, new Object[] { beforeValue, afterValue }); + } + } + Object val = sourceRecord.getObjectValue(sourceField); if (val == null) { qFields.add(String.format("%s is null", targetField)); @@ -211,21 +226,26 @@ public class GroupAggregation extends FieldAggregation { } if (allNull) { - log.warn("All group-fields are null"); + // 如果分组字段值全空将会触发全量更新 + if (!valueChanged.isEmpty()) { + this.groupAggregationRefresh = new GroupAggregationRefresh(this, qFieldsRefresh); + } else { + log.warn("All group-fields are null, ignored"); + } return; } this.followSourceWhere = StringUtils.join(qFieldsFollow.iterator(), " and "); - if (operatingContext.getAction() == BizzPermission.UPDATE && this.getClass() == GroupAggregation.class) { + if (isGroupUpdate) { this.groupAggregationRefresh = new GroupAggregationRefresh(this, qFieldsRefresh); } - ql = String.format("select %s from %s where ( %s )", + sql = String.format("select %s from %s where ( %s )", targetEntity.getPrimaryField().getName(), targetEntity.getName(), StringUtils.join(qFields.iterator(), " and ")); - Object[] targetRecord = Application.createQueryNoFilter(ql).unique(); + Object[] targetRecord = Application.createQueryNoFilter(sql).unique(); if (targetRecord != null) { targetRecordId = (ID) targetRecord[0]; return; diff --git a/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregationRefresh.java b/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregationRefresh.java index cea317360..63b67ab5d 100644 --- a/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregationRefresh.java +++ b/src/main/java/com/rebuild/core/service/trigger/impl/GroupAggregationRefresh.java @@ -59,7 +59,7 @@ public class GroupAggregationRefresh { } } - // 全部刷新 + // 全量刷新,性能较低 if (targetWhere.size() <= 1) { targetWhere.clear(); targetWhere.add("(1=1)"); @@ -72,6 +72,7 @@ public class GroupAggregationRefresh { entity.getPrimaryField().getName(), entity.getName(), StringUtils.join(targetWhere, " or ")); + Object[][] targetArray = Application.createQueryNoFilter(sql).array(); log.info("Maybe refresh target record(s) : {}", targetArray.length); @@ -98,6 +99,7 @@ public class GroupAggregationRefresh { } ID fakeUpdateReferenceId = null; + // 1.尝试获取触发源 for (int i = 0; i < o.length - 1; i++) { Object mayId = o[i]; @@ -140,9 +142,6 @@ public class GroupAggregationRefresh { try { ga.execute(oCtx); -// } catch (Throwable ex) { -// // v3.1 出现异常可能导致事物回滚执行,因此此处 catch 并无意义 -// log.error("Error on trigger ({}) refresh record : {}", parentAc.getConfigId(), targetRecordId, ex); } finally { ga.clean(); } diff --git a/src/main/java/com/rebuild/core/support/KVStorage.java b/src/main/java/com/rebuild/core/support/KVStorage.java index 5ef206bb5..0c5935ff4 100644 --- a/src/main/java/com/rebuild/core/support/KVStorage.java +++ b/src/main/java/com/rebuild/core/support/KVStorage.java @@ -13,45 +13,67 @@ import com.rebuild.core.Application; import com.rebuild.core.BootEnvironmentPostProcessor; import com.rebuild.core.metadata.EntityHelper; import com.rebuild.core.privileges.UserService; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import java.util.HashMap; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ConcurrentHashMap; + /** * K/V 对存储 * * @author devezhao * @since 2019/11/22 */ +@Slf4j public class KVStorage { public static final Object SETNULL = new Object(); + private static final String CUSTOM_PREFIX = "custom."; + /** - * 存储 - * + * 取 * @param key 会自动加 `custom.` 前缀 * @return */ public static String getCustomValue(String key) { - return getValue("custom." + key, false, null); + return getValue(CUSTOM_PREFIX + key, false, null); } /** - * 获取 - * - * @param key 会自动加 `custom.` 前缀 + * 存 + * @param key * @param value */ public static void setCustomValue(String key, Object value) { - setValue("custom." + key, value); + setValue(CUSTOM_PREFIX + key, value); } /** + * 存 + * @param key + * @param value + * @param throttled 是否节流 + */ + public static void setCustomValue(String key, Object value, boolean throttled) { + if (throttled) THROTTLED_QUEUE.put(key, value); + else setCustomValue(key, value); + } + + /** + * 删 * @param key */ public static void removeCustomValue(String key) { setCustomValue(key, SETNULL); } + // -- RAW + /** * @param key * @param value @@ -130,4 +152,26 @@ public class KVStorage { return value; } + + // -- ASYNC + + private static final Timer THROTTLED_TIMER = new Timer("KVStorage-Timer"); + private static final Map THROTTLED_QUEUE = new ConcurrentHashMap<>(); + + static { + THROTTLED_TIMER.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + if (THROTTLED_QUEUE.isEmpty()) return; + + final Map queue = new HashMap<>(THROTTLED_QUEUE); + THROTTLED_QUEUE.clear(); + + log.info("Synchronize KV pairs ... {}", queue); + for (Map.Entry e : queue.entrySet()) { + RebuildConfiguration.setCustomValue(e.getKey(), e.getValue()); + } + } + }, 1000, 1000); + } } diff --git a/src/main/java/com/rebuild/core/support/License.java b/src/main/java/com/rebuild/core/support/License.java index ac17d8cf5..8203e9501 100644 --- a/src/main/java/com/rebuild/core/support/License.java +++ b/src/main/java/com/rebuild/core/support/License.java @@ -24,8 +24,8 @@ import java.util.Locale; import java.util.Map; /** - * @author ZHAO - * @since 2019-08-23 + * !!!! 请勿修改或删除本文件 + * !!!! 请严格遵守《REBUILD 用户服务协议》https://getrebuild.com/legal/service-terms */ @Slf4j public final class License { diff --git a/src/main/java/com/rebuild/core/support/general/DataListBuilder.java b/src/main/java/com/rebuild/core/support/general/DataListBuilder.java index 7e8cbad8c..fe288ca20 100644 --- a/src/main/java/com/rebuild/core/support/general/DataListBuilder.java +++ b/src/main/java/com/rebuild/core/support/general/DataListBuilder.java @@ -12,7 +12,7 @@ import com.alibaba.fastjson.JSON; /** * @author Zhao Fangfang - * @since 1.0, 2013-6-20 + * @since 1.0, 2018-6-20 */ public interface DataListBuilder { diff --git a/src/main/java/com/rebuild/core/support/general/DataListBuilderImpl.java b/src/main/java/com/rebuild/core/support/general/DataListBuilderImpl.java index 52c7c4649..29640f0f9 100644 --- a/src/main/java/com/rebuild/core/support/general/DataListBuilderImpl.java +++ b/src/main/java/com/rebuild/core/support/general/DataListBuilderImpl.java @@ -34,7 +34,7 @@ import java.util.Map; * 数据列表数据构建 * * @author Zhao Fangfang - * @since 1.0, 2013-6-20 + * @since 1.0, 2018-6-20 */ public class DataListBuilderImpl implements DataListBuilder { diff --git a/src/main/java/com/rebuild/core/support/general/DataListWrapper.java b/src/main/java/com/rebuild/core/support/general/DataListWrapper.java index 4317625fa..1a386657f 100644 --- a/src/main/java/com/rebuild/core/support/general/DataListWrapper.java +++ b/src/main/java/com/rebuild/core/support/general/DataListWrapper.java @@ -13,6 +13,7 @@ import cn.devezhao.persist4j.dialect.FieldType; import cn.devezhao.persist4j.engine.ID; import cn.devezhao.persist4j.query.compiler.SelectItem; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.rebuild.core.Application; import com.rebuild.core.configuration.ConfigBean; @@ -26,6 +27,7 @@ import com.rebuild.core.privileges.bizz.ZeroEntry; import com.rebuild.core.support.ConfigurationItem; import com.rebuild.core.support.RebuildConfiguration; import com.rebuild.utils.JSONUtils; +import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import java.util.ArrayList; @@ -36,7 +38,7 @@ import java.util.Map; * 数据包装 * * @author Zhao Fangfang - * @since 1.0, 2013-6-20 + * @since 1.0, 2018-6-20 */ public class DataListWrapper { @@ -52,7 +54,7 @@ public class DataListWrapper { // 信息脱敏 protected boolean useDesensitized = false; - private boolean secWrapper = true; + private boolean mixWrapper = true; /** @@ -93,6 +95,8 @@ public class DataListWrapper { */ public JSON toJson() { final Field nameFiled = entity.getNameField(); + final EasyField nameFieldEasy = EasyMetaFactory.valueOf(nameFiled); + final int joinFieldsLen = queryJoinFields == null ? 0 : queryJoinFields.size(); final int selectFieldsLen = selectFields.length - joinFieldsLen; @@ -119,26 +123,31 @@ public class DataListWrapper { continue; } - SelectItem fieldItem = selectFields[colIndex]; - Field field = fieldItem.getField(); - if (field.equals(nameFiled) && !fieldItem.getFieldPath().contains(".")) { + final SelectItem fieldItem = selectFields[colIndex]; + final Field fieldMeta = fieldItem.getField(); + + // 名称字段值 + if (fieldMeta.equals(nameFiled) && !fieldItem.getFieldPath().contains(".")) { nameValue = value; } - // 如果最终没能取得名称字段则补充 - if (field.getType() == FieldType.PRIMARY) { + // At last + if (fieldMeta.getType() == FieldType.PRIMARY) { + // 如无名称字段值则补充 if (nameValue == null) { nameValue = FieldValueHelper.getLabel((ID) value, StringUtils.EMPTY); } else { nameValue = FieldValueHelper.wrapFieldValue(nameValue, nameFiled, true); - if (nameValue == null) { - nameValue = StringUtils.EMPTY; - } } - ((ID) value).setLabel(nameValue); + + if (nameValue != null && isUseDesensitized(nameFieldEasy)) { + nameValue = FieldValueHelper.desensitized(nameFieldEasy, nameValue); + } + + ((ID) value).setLabel(ObjectUtils.defaultIfNull(nameValue, StringUtils.EMPTY)); } - row[colIndex] = wrapFieldValue(value, field); + row[colIndex] = wrapFieldValue(value, fieldMeta); } } @@ -156,21 +165,32 @@ public class DataListWrapper { return FieldValueHelper.wrapMixValue((ID) value, null); } + final DisplayType dt = easyField.getDisplayType(); final Object originValue = value; - boolean unpack = easyField.getDisplayType() == DisplayType.CLASSIFICATION - || easyField.getDisplayType() == DisplayType.PICKLIST - || easyField.getDisplayType() == DisplayType.STATE - || easyField.getDisplayType() == DisplayType.BOOL; + boolean unpack = dt == DisplayType.CLASSIFICATION || dt == DisplayType.PICKLIST + || dt == DisplayType.STATE || dt == DisplayType.BOOL; value = FieldValueHelper.wrapFieldValue(value, easyField, unpack); - if (value != null && isUseDesensitized(easyField)) { - value = FieldValueHelper.desensitized(easyField, value); + if (value != null) { + if (isUseDesensitized(easyField)) { + value = FieldValueHelper.desensitized(easyField, value); + } + + // v3.1.3 引用字段使用名称字段作为脱敏依据 + if (this.useDesensitized + && (dt == DisplayType.REFERENCE || dt == DisplayType.N2NREFERENCE)) { + Field useNameField = easyField.getRawMeta().getReferenceEntity().getNameField(); + EasyField useNameFieldEasy = EasyMetaFactory.valueOf(useNameField); + if (useNameFieldEasy.isDesensitized()) { + desensitizedMixValue((JSON) value, useNameFieldEasy); + } + } } // v2.10 Color - if (value != null && this.secWrapper) { + if (value != null && this.mixWrapper) { if (easyField.getDisplayType() == DisplayType.PICKLIST) { String color = PickListManager.instance.getColor((ID) originValue); if (StringUtils.isNotBlank(color)) { @@ -205,6 +225,19 @@ public class DataListWrapper { return value; } + private void desensitizedMixValue(JSON value, EasyField easyField) { + if (value instanceof JSONObject) { + String text = ((JSONObject) value).getString("text"); + if (text != null) { + ((JSONObject) value).put("text", FieldValueHelper.desensitized(easyField, text)); + } + } + // N2N + else if (value instanceof JSONArray) { + for (Object o : (JSONArray) value) desensitizedMixValue((JSON) o, easyField); + } + } + /** * @see FieldValueHelper#isUseDesensitized(EasyField, ID) */ @@ -237,9 +270,9 @@ public class DataListWrapper { /** * 进一步封装查询结果 * - * @param secWrapper + * @param mixWrapper */ - public void setSecWrapper(boolean secWrapper) { - this.secWrapper = secWrapper; + public void setMixWrapper(boolean mixWrapper) { + this.mixWrapper = mixWrapper; } } diff --git a/src/main/java/com/rebuild/core/support/general/ProtocolFilterParser.java b/src/main/java/com/rebuild/core/support/general/ProtocolFilterParser.java index 0301ac1f1..1f2d19574 100644 --- a/src/main/java/com/rebuild/core/support/general/ProtocolFilterParser.java +++ b/src/main/java/com/rebuild/core/support/general/ProtocolFilterParser.java @@ -190,18 +190,27 @@ public class ProtocolFilterParser { protected String parseCategory(String entity, String value) { Entity rootEntity = MetadataHelper.getEntity(entity); Field categoryField = DataListCategory.instance.getFieldOfCategory(rootEntity); - if (categoryField == null) return "(9=9)"; + if (categoryField == null || StringUtils.isBlank(value)) return "(9=9)"; DisplayType dt = EasyMetaFactory.getDisplayType(categoryField); + value = StringEscapeUtils.escapeSql(value); if (dt == DisplayType.MULTISELECT) { return String.format("%s && %d", categoryField.getName(), ObjectUtils.toInt(value)); } else if (dt == DisplayType.N2NREFERENCE) { return String.format( "exists (select recordId from NreferenceItem where ^%s = recordId and belongField = '%s' and referenceId = '%s')", - rootEntity.getPrimaryField().getName(), categoryField.getName(), StringEscapeUtils.escapeSql(value)); - } else { - return String.format("%s = '%s'", categoryField.getName(), StringEscapeUtils.escapeSql(value)); + rootEntity.getPrimaryField().getName(), categoryField.getName(), value); + } else if (dt == DisplayType.DATETIME || dt == DisplayType.DATE) { + String s = value + "0000-01-01 00:00:00".substring(value.length()); + String e = value + "0000-12-31 23:59:59".substring(value.length()); + if (dt == DisplayType.DATE) { + s = s.split(" ")[0]; + e = e.split(" ")[0]; + } + return MessageFormat.format("({0} >= ''{1}'' and {0} <= ''{2}'')", categoryField.getName(), s, e); + } else { + return String.format("%s = '%s'", categoryField.getName(), value); } } diff --git a/src/main/java/com/rebuild/core/support/general/QueryParser.java b/src/main/java/com/rebuild/core/support/general/QueryParser.java index 6e89103b2..3be181d8c 100644 --- a/src/main/java/com/rebuild/core/support/general/QueryParser.java +++ b/src/main/java/com/rebuild/core/support/general/QueryParser.java @@ -28,7 +28,7 @@ import java.util.*; * 列表查询解析 * * @author Zhao Fangfang - * @since 1.0, 2013-6-20 + * @since 1.0, 2018-6-20 */ public class QueryParser { diff --git a/src/main/java/com/rebuild/web/admin/audit/LoginLogController.java b/src/main/java/com/rebuild/web/admin/audit/LoginLogController.java index 75ac148ed..d80d5bdb6 100644 --- a/src/main/java/com/rebuild/web/admin/audit/LoginLogController.java +++ b/src/main/java/com/rebuild/web/admin/audit/LoginLogController.java @@ -43,7 +43,7 @@ public class LoginLogController extends EntityController { public ModelAndView pageList(HttpServletRequest request) { ID user = getRequestUser(request); ModelAndView mv = createModelAndView("/admin/audit/login-logs", "LoginLog", user); - JSON config = DataListManager.instance.getFieldsLayout("LoginLog", user); + JSON config = DataListManager.instance.getListFields("LoginLog", user); mv.getModel().put("DataListConfig", JSON.toJSONString(config)); return mv; } diff --git a/src/main/java/com/rebuild/web/admin/bizz/DepartmentController.java b/src/main/java/com/rebuild/web/admin/bizz/DepartmentController.java index 4e147a9e9..e55e131d6 100644 --- a/src/main/java/com/rebuild/web/admin/bizz/DepartmentController.java +++ b/src/main/java/com/rebuild/web/admin/bizz/DepartmentController.java @@ -41,7 +41,7 @@ public class DepartmentController extends EntityController { final ID user = getRequestUser(request); ModelAndView mv = createModelAndView("/admin/bizuser/dept-list", "Department", user); - JSON config = DataListManager.instance.getFieldsLayout("Department", user); + JSON config = DataListManager.instance.getListFields("Department", user); mv.getModel().put("DataListConfig", JSON.toJSONString(config)); return mv; } diff --git a/src/main/java/com/rebuild/web/admin/bizz/TeamController.java b/src/main/java/com/rebuild/web/admin/bizz/TeamController.java index fc955c76b..634e23864 100644 --- a/src/main/java/com/rebuild/web/admin/bizz/TeamController.java +++ b/src/main/java/com/rebuild/web/admin/bizz/TeamController.java @@ -46,7 +46,7 @@ public class TeamController extends EntityController { final ID user = getRequestUser(request); ModelAndView mv = createModelAndView("/admin/bizuser/team-list", "Team", user); - JSON config = DataListManager.instance.getFieldsLayout("Team", user); + JSON config = DataListManager.instance.getListFields("Team", user); mv.getModel().put("DataListConfig", JSON.toJSONString(config)); return mv; } diff --git a/src/main/java/com/rebuild/web/admin/bizz/UserController.java b/src/main/java/com/rebuild/web/admin/bizz/UserController.java index b52fcb113..1b5e6bb15 100644 --- a/src/main/java/com/rebuild/web/admin/bizz/UserController.java +++ b/src/main/java/com/rebuild/web/admin/bizz/UserController.java @@ -48,7 +48,7 @@ public class UserController extends EntityController { final ID user = getRequestUser(request); ModelAndView mv = createModelAndView("/admin/bizuser/user-list", "User", user); - JSON config = DataListManager.instance.getFieldsLayout("User", user); + JSON config = DataListManager.instance.getListFields("User", user); mv.getModel().put("DataListConfig", JSON.toJSONString(config)); mv.getModel().put("serviceMail", SMSender.availableMail()); return mv; diff --git a/src/main/java/com/rebuild/web/commons/FileDownloader.java b/src/main/java/com/rebuild/web/commons/FileDownloader.java index 42a91399e..a7db5839a 100644 --- a/src/main/java/com/rebuild/web/commons/FileDownloader.java +++ b/src/main/java/com/rebuild/web/commons/FileDownloader.java @@ -15,10 +15,7 @@ import com.rebuild.core.Application; import com.rebuild.core.support.RebuildConfiguration; import com.rebuild.core.support.i18n.Language; import com.rebuild.core.support.integration.QiniuCloud; -import com.rebuild.utils.AppUtils; -import com.rebuild.utils.ImageView2; -import com.rebuild.utils.OkHttpUtils; -import com.rebuild.utils.RbAssert; +import com.rebuild.utils.*; import com.rebuild.web.BaseController; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; @@ -129,7 +126,7 @@ public class FileDownloader extends BaseController { // 共享查看 if (request.getRequestURI().contains("/filex/access/")) { String e = getParameter(request, "e"); - if (StringUtils.isBlank(e) || Application.getCommonsCache().get(e) == null) { + if (!checkEsign(e)) { response.sendError(HttpStatus.FORBIDDEN.value(), Language.L("分享的文件已过期")); return; } @@ -161,16 +158,22 @@ public class FileDownloader extends BaseController { @GetMapping(value = "read-raw") public void readRaw(HttpServletRequest request, HttpServletResponse response) throws IOException { - RbAssert.isAllow(checkUser(request), "Unauthorized access"); String filePath = getParameterNotNull(request, "url"); + boolean fullUrl = CommonsUtils.isExternalUrl(filePath); String charset = getParameter(request, "charset", AppUtils.UTF8); String content; if (QiniuCloud.instance().available()) { - String privateUrl = QiniuCloud.instance().makeUrl(filePath); + String privateUrl = fullUrl ? filePath : QiniuCloud.instance().makeUrl(filePath); content = OkHttpUtils.get(privateUrl, null, charset); } else { + if (fullUrl) { + String e = filePath.split("\\?e=")[1]; + RbAssert.is(checkEsign(e), "Unauthorized access"); + filePath = filePath.split("/filex/access/")[1].split("\\?")[0]; + } + // Local storage filePath = checkFilePath(filePath); File file = RebuildConfiguration.getFileOfData(filePath); @@ -209,6 +212,11 @@ public class FileDownloader extends BaseController { return user != null; } + private static boolean checkEsign(String e) { + String check = e == null ? null : Application.getCommonsCache().get(e); + return "rb".equalsIgnoreCase(check); + } + private static String checkFilePath(String filepath) { filepath = CodecUtils.urlDecode(filepath); filepath = filepath.replace("\\", "/"); diff --git a/src/main/java/com/rebuild/web/configuration/ShowFieldsController.java b/src/main/java/com/rebuild/web/configuration/ShowFieldsController.java index a7777e5a5..a8ff0cc0f 100644 --- a/src/main/java/com/rebuild/web/configuration/ShowFieldsController.java +++ b/src/main/java/com/rebuild/web/configuration/ShowFieldsController.java @@ -139,7 +139,7 @@ public class ShowFieldsController extends BaseController implements ShareTo { raw = DataListManager.instance.getLayoutOfDatalist(user, entity); } - JSONObject config = (JSONObject) DataListManager.instance.formatFieldsLayout(entity, user, false, raw); + JSONObject config = (JSONObject) DataListManager.instance.formatListFields(entity, user, false, raw); Map ret = new HashMap<>(); ret.put("fieldList", fieldList); diff --git a/src/main/java/com/rebuild/web/general/GeneralListController.java b/src/main/java/com/rebuild/web/general/GeneralListController.java index 4ad373224..6fa89ae2a 100644 --- a/src/main/java/com/rebuild/web/general/GeneralListController.java +++ b/src/main/java/com/rebuild/web/general/GeneralListController.java @@ -27,9 +27,7 @@ import com.rebuild.core.service.query.ParseHelper; import com.rebuild.core.support.general.DataListBuilder; import com.rebuild.core.support.general.DataListBuilderImpl; import com.rebuild.core.support.i18n.Language; -import com.rebuild.utils.JSONUtils; import com.rebuild.web.EntityController; -import org.apache.commons.codec.language.bm.Lang; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.*; @@ -81,7 +79,7 @@ public class GeneralListController extends EntityController { JSON listConfig = null; if (listMode == 1) { - listConfig = DataListManager.instance.getFieldsLayout(entity, user); + listConfig = DataListManager.instance.getListFields(entity, user); // 扩展配置 String advListHideFilters = easyEntity.getExtraAttr(EasyEntityConfigProps.ADV_LIST_HIDE_FILTERS); diff --git a/src/main/java/com/rebuild/web/general/ReferenceSearchController.java b/src/main/java/com/rebuild/web/general/ReferenceSearchController.java index dba85ac29..021730441 100644 --- a/src/main/java/com/rebuild/web/general/ReferenceSearchController.java +++ b/src/main/java/com/rebuild/web/general/ReferenceSearchController.java @@ -284,7 +284,7 @@ public class ReferenceSearchController extends EntityController { ModelAndView mv = createModelAndView("/general/reference-search"); putEntityMeta(mv, searchEntity); - JSON config = DataListManager.instance.getFieldsLayout(searchEntity.getName(), user); + JSON config = DataListManager.instance.getListFields(searchEntity.getName(), user); mv.getModel().put("DataListConfig", JSON.toJSONString(config)); // 可新建 diff --git a/src/main/java/com/rebuild/web/general/RelatedListController.java b/src/main/java/com/rebuild/web/general/RelatedListController.java index c58add9ce..1fc21ee47 100644 --- a/src/main/java/com/rebuild/web/general/RelatedListController.java +++ b/src/main/java/com/rebuild/web/general/RelatedListController.java @@ -170,7 +170,7 @@ public class RelatedListController extends BaseController { @GetMapping("related-list-config") public RespBody getDataListConfig(HttpServletRequest req, @EntityParam Entity listEntity) { final ID user = getRequestUser(req); - JSON config = DataListManager.instance.getFieldsLayout(listEntity.getName(), user); + JSON config = DataListManager.instance.getListFields(listEntity.getName(), user); return RespBody.ok(config); } } diff --git a/src/main/java/com/rebuild/web/robot/approval/ApprovalController.java b/src/main/java/com/rebuild/web/robot/approval/ApprovalController.java index 1074bcc9f..5d6e57a1f 100644 --- a/src/main/java/com/rebuild/web/robot/approval/ApprovalController.java +++ b/src/main/java/com/rebuild/web/robot/approval/ApprovalController.java @@ -141,6 +141,7 @@ public class ApprovalController extends BaseController { JSONArray aform = new FormBuilder(recordId, user).build(editableFields); if (aform != null && !aform.isEmpty()) { data.put("aform", aform); + data.put("aentity", MetadataHelper.getEntityName(recordId)); } } diff --git a/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java b/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java index 99231f972..c5d8018f7 100644 --- a/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java +++ b/src/main/java/com/rebuild/web/robot/trigger/TriggerAdminController.java @@ -10,6 +10,7 @@ package com.rebuild.web.robot.trigger; import cn.devezhao.persist4j.Entity; import cn.devezhao.persist4j.engine.ID; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.rebuild.core.Application; import com.rebuild.core.metadata.MetadataHelper; import com.rebuild.core.metadata.MetadataSorter; @@ -20,6 +21,7 @@ import com.rebuild.core.service.trigger.TriggerAction; import com.rebuild.core.support.CommonsLock; import com.rebuild.core.support.License; import com.rebuild.core.support.i18n.Language; +import com.rebuild.utils.JSONUtils; import com.rebuild.web.BaseController; import com.rebuild.web.admin.ConfigCommons; import org.apache.commons.lang.StringUtils; @@ -113,7 +115,7 @@ public class TriggerAdminController extends BaseController { public Object[][] triggerList(HttpServletRequest request) { String belongEntity = getParameter(request, "entity"); String q = getParameter(request, "q"); - String sql = "select configId,belongEntity,belongEntity,name,isDisabled,modifiedOn,when,actionType,configId,priority from RobotTriggerConfig" + + String sql = "select configId,belongEntity,belongEntity,name,isDisabled,modifiedOn,when,actionType,configId,priority,actionContent from RobotTriggerConfig" + " where (1=1) and (2=2)" + " order by modifiedOn desc, name"; @@ -121,7 +123,27 @@ public class TriggerAdminController extends BaseController { for (Object[] o : array) { o[7] = Language.L(ActionType.valueOf((String) o[7])); o[8] = CommonsLock.getLockedUserFormat((ID) o[8]); + + // 目标实体 + o[10] = parseTargetEntity((String) o[10], (String) o[1]); } return array; } + + private String parseTargetEntity(String config, String sourceEntity) { + if (!JSONUtils.wellFormat(config)) return null; + + JSONObject configJson = JSON.parseObject(config); + String targetEntity = configJson.getString("targetEntity"); + if (StringUtils.isBlank(targetEntity)) return null; + + if (targetEntity.startsWith(TriggerAction.SOURCE_SELF)) targetEntity = sourceEntity; + else if (targetEntity.contains(".")) targetEntity = targetEntity.split("\\.")[1]; + + if (MetadataHelper.containsEntity(targetEntity)) { + return EasyMetaFactory.getLabel(targetEntity); + } else { + return String.format("[%s]", targetEntity.toUpperCase()); + } + } } diff --git a/src/main/resources/web/admin/robot/approval-design.html b/src/main/resources/web/admin/robot/approval-design.html index 4025c7561..be6808199 100644 --- a/src/main/resources/web/admin/robot/approval-design.html +++ b/src/main/resources/web/admin/robot/approval-design.html @@ -5,6 +5,11 @@ [[${bundle.L('审批流程')}]] +