vertx-pin/zero-vie/src/main/java/io/mature/extension/refine/OxField.java
package io.mature.extension.refine;
import io.mature.extension.cv.OxCv;
import io.modello.eon.em.EmAttribute;
import io.modello.specification.atom.HRule;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.mod.atom.modeling.builtin.DataAtom;
import io.vertx.up.eon.KName;
import io.vertx.up.util.Ut;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
* ## 字段工具
*
* ### 1. 基本介绍
*
* 用来计算字段相关信息的专用<strong>字段工具</strong>类信息。
*
* @author <a href="http://www.origin-x.cn">Lang</a>
*/
final class OxField {
/**
* <value>key, createdAt, createdBy, updatedAt, updatedBy, confirmStatus</value>,默认忽略字段。
*
* - key:主键
* - createdAt:创建时间
* - createdBy:创建人
* - updatedAt:更新时间
* - updatedBy:更新人
* - confirmStatus:确认状态(confirmed,已确认 / unconfirmed,未确认)
*/
private static final Set<String> IGNORE_FIELDS = new HashSet<String>() {
{
/* 主键,上下关系 */
this.add(KName.KEY);
/* Auditor,字段信息 */
this.add(KName.CREATED_AT);
this.add(KName.CREATED_BY);
this.add(KName.UPDATED_AT);
this.add(KName.UPDATED_BY);
/* confirmStatus,在 Tracking 中取消 */
this.add(OxCv.Field.CONFIRM_STATUS);
this.add(OxCv.Field.LIFE_CYCLE);
this.add(KName.GLOBAL_ID);
}
};
private static final Set<String> IGNORE_API = new HashSet<String>() {
{
this.add(KName.KEY);
this.add(KName.CODE);
this.add(OxCv.Field.CATEGORY_THIRD);
this.add(OxCv.Field.CATEGORY_SECOND);
this.add(OxCv.Field.CATEGORY_FIRST);
/* confirmStatus,在 Tracking 中取消 */
this.add(OxCv.Field.LIFE_CYCLE);
this.add(OxCv.Field.CONFIRM_STATUS);
}
};
/*
* 私有构造函数(工具类转换)
*/
private OxField() {
}
/**
* 返回默认忽略字段集 + 输入忽略字段集,合并返回。
*
* @param ignores 输入的忽略字段集。
*
* @return {@link Set}<{@link String}> 默认字段集
*/
static Set<String> toIgnores(final Set<String> ignores) {
final Set<String> ignoreSet = new HashSet<>(IGNORE_FIELDS);
ignoreSet.addAll(ignores);
return ignoreSet;
}
/*
* ATOM-001/ATOM-003
* 这个流程需要创建待确认,所以它的 ignoreSet 的计算为:
* 1. 本身不执行变更历史生成的字段:track = false
* 2. 拉取数据过程中准入禁用的字段:syncIn = false
*/
static Set<String> ignorePull(final DataAtom atom) {
final Set<String> fieldSet = toIgnores(atom.marker().disabled(EmAttribute.Marker.track));
fieldSet.addAll(atom.marker().disabled(EmAttribute.Marker.syncIn));
return fieldSet;
}
static Set<String> ignorePush(final DataAtom atom) {
return atom.marker().disabled(EmAttribute.Marker.syncOut);
}
/*
* compareEdit比对流程专用
*/
static Set<String> ignoreIn(final DataAtom atom) {
return toIgnores(atom.marker().disabled(EmAttribute.Marker.syncIn));
}
static Set<String> ignorePure(final DataAtom atom) {
return toIgnores(atom.marker().disabled(EmAttribute.Marker.track));
}
static Set<String> ignoreApi(final DataAtom atom) {
final HRule unique = atom.ruleAtom();
final Set<String> fieldSet = new HashSet<>(IGNORE_API);
if (Objects.nonNull(unique)) {
unique.rulePure().stream()
.flatMap(term -> term.getFields().stream())
.forEach(fieldSet::add);
}
return fieldSet;
}
/**
* 元数据执行器
*
* 支持功能:
*
* - 针对字段`metadata`执行Json转换。
* - 按`visible = true/false`执行过滤,如果不存在则默认为`true`,筛选元素。
* - 针对字段`columns`执行Json转换。
*
* @param input 输入的最终响应数据
*
* @return {@link JsonArray} 同步执行结果
*/
static JsonArray metadata(final JsonArray input) {
final JsonArray normalized = new JsonArray();
Ut.itJArray(input)
.map(item -> Ut.valueToJObject(item, KName.METADATA))
.filter(item -> {
final JsonObject metadata = item.getJsonObject(KName.METADATA);
if (Ut.isNotNil(metadata)) {
return metadata.getBoolean("visible", Boolean.TRUE);
} else {
return true;
}
})
.map(item -> Ut.valueToString(item, KName.Ui.COLUMNS))
.forEach(normalized::add);
return normalized;
}
}