Skip to content

Commit

Permalink
Merge branch 'develop' into view-bin-data-105
Browse files Browse the repository at this point in the history
  • Loading branch information
getrebuild committed Dec 2, 2023
2 parents a5e178a + 2811df9 commit 817e76b
Show file tree
Hide file tree
Showing 28 changed files with 213 additions and 101 deletions.
2 changes: 1 addition & 1 deletion @rbv
Submodule @rbv updated from 186f16 to b7e5e1
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,12 @@
import com.rebuild.core.metadata.easymeta.DisplayType;
import com.rebuild.core.metadata.easymeta.EasyField;
import com.rebuild.core.metadata.easymeta.EasyFile;
import com.rebuild.core.metadata.easymeta.EasyID;
import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.metadata.easymeta.EasyN2NReference;
import com.rebuild.core.metadata.easymeta.MixValue;
import com.rebuild.core.metadata.impl.EasyFieldConfigProps;
import com.rebuild.core.support.general.FieldValueHelper;
import com.rebuild.utils.JSONUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.CaseInsensitiveMap;
Expand Down Expand Up @@ -294,6 +297,8 @@ protected Object conversionCompatibleValue(Field source, Field target, Object va
if (!(newValue instanceof String) || sourceEasy instanceof EasyFile) {
newValue = sourceEasy.wrapValue(newValue);
}
} else if (sourceEasy instanceof EasyID && targetEasy instanceof EasyN2NReference) {
newValue = FieldValueHelper.wrapFieldValue(newValue, targetEasy);
}

return newValue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -474,8 +474,8 @@ protected void buildModelElements(JSONArray elements, Entity entity, Record reco

// 默认值
if (el.get("value") == null) {
if (dt == DisplayType.SERIES
/*|| EntityHelper.ApprovalLastTime.equals(fieldName) || EntityHelper.ApprovalLastRemark.equals(fieldName)*/) {
if (dt == DisplayType.SERIES || EntityHelper.ApprovalLastTime.equals(fieldName)
|| EntityHelper.ApprovalLastRemark.equals(fieldName) || EntityHelper.ApprovalLastUser.equals(fieldName)) {
el.put("readonlyw", READONLYW_RO);
} else {
Object defaultValue = easyField.exprDefaultValue();
Expand Down
20 changes: 15 additions & 5 deletions src/main/java/com/rebuild/core/metadata/MetadataSorter.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

/**
* 元数据辅助类,注意此类返回的数据会过滤和排序
Expand Down Expand Up @@ -159,14 +161,14 @@ public static Field[] sortFields(Field[] fields, DisplayType... usesTypes) {
*/
static Field[] sortByLevel(List<BaseMeta> fields) {
List<BaseMeta> othersFields = new ArrayList<>();
List<BaseMeta> commonsFields = new ArrayList<>();
List<BaseMeta> approvalFields = new ArrayList<>();
Map<String, BaseMeta> commonsFieldsMap = new HashMap<>();

for (BaseMeta field : fields) {
if (MetadataHelper.isApprovalField(field.getName())) {
approvalFields.add(field);
} else if (MetadataHelper.isCommonsField((Field) field)) {
commonsFields.add(field);
commonsFieldsMap.put(field.getName(), field);
} else {
othersFields.add(field);
}
Expand All @@ -175,12 +177,20 @@ static Field[] sortByLevel(List<BaseMeta> fields) {
sortByLabel(othersFields);
List<BaseMeta> allFields = new ArrayList<>(othersFields);

sortByLabel(commonsFields);
allFields.addAll(commonsFields);

sortByLabel(approvalFields);
allFields.addAll(approvalFields);

// v35 特殊排序
final String[] SPEC_SORTS = new String[] {
EntityHelper.CreatedBy, EntityHelper.CreatedOn, EntityHelper.ModifiedBy, EntityHelper.ModifiedOn, EntityHelper.OwningUser, EntityHelper.OwningDept
};
List<BaseMeta> commonsFields = new ArrayList<>();
for (String s : SPEC_SORTS) {
BaseMeta b = commonsFieldsMap.get(s);
if (b != null) commonsFields.add(b);
}
allFields.addAll(commonsFields);

return allFields.toArray(new Field[0]);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public Object exprDefaultValue() {
/**
* 转换返回值,输出用(默认实现为原值返回)
*
* @param value 原值
* @param value 原值,必须符合值类型
* @return
* @see com.rebuild.core.support.general.FieldValueHelper
*/
Expand Down
15 changes: 13 additions & 2 deletions src/main/java/com/rebuild/core/service/query/AdvFilterParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.core.Application;
import com.rebuild.core.UserContextHolder;
import com.rebuild.core.metadata.EntityHelper;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.metadata.easymeta.DisplayType;
Expand All @@ -46,6 +47,7 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

import static cn.devezhao.commons.CalendarUtils.addDay;
Expand Down Expand Up @@ -251,8 +253,7 @@ private String parseItem(JSONObject item, JSONObject values, Entity specRootEnti

DisplayType dt = EasyMetaFactory.getDisplayType(lastFieldMeta);

if (dt == DisplayType.CLASSIFICATION
|| (dt == DisplayType.PICKLIST && hasNameFlag) /* 快速查询 */) {
if (dt == DisplayType.CLASSIFICATION || (dt == DisplayType.PICKLIST && hasNameFlag) /* 快速查询 */) {
field = NAME_FIELD_PREFIX + field;
} else if (hasNameFlag) {
if (!(dt == DisplayType.REFERENCE || dt == DisplayType.N2NREFERENCE)) {
Expand Down Expand Up @@ -717,6 +718,7 @@ private JSONArray buildQuickFilterItems(String quickFields) {
private static final String CURRENT_ANY = "CURRENT";
private static final String CURRENT_DATE = "NOW";

// 获取字段变量值
private String useValueOfVarRecord(String value, Field queryField) {
if (StringUtils.isBlank(value) || !value.matches(PATT_FIELDVAR)) return value;

Expand All @@ -730,6 +732,15 @@ private String useValueOfVarRecord(String value, Field queryField) {
DisplayType dt = EasyMetaFactory.getDisplayType(queryField);
if (dt == DisplayType.DATE || dt == DisplayType.DATETIME || dt == DisplayType.TIME) {
useValue = CalendarUtils.now();

} else if (dt == DisplayType.REFERENCE) {
if (queryField.getReferenceEntity().getEntityCode() == EntityHelper.User) {
useValue = UserContextHolder.getUser();
} else if (queryField.getReferenceEntity().getEntityCode() == EntityHelper.Department) {
Department dept = UserHelper.getDepartment(UserContextHolder.getUser());
if (dept != null) useValue = dept.getIdentity();
}

} else {
log.warn("Cannot use `CURRENT` in `{}` (None date fields)", queryField);
return StringUtils.EMPTY;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ private Object evalRbJoin(int mode) {
CollectionUtils.addAll(nvList, (ID[]) n);
} else if (n instanceof ID) {
if (field.getType() == FieldType.PRIMARY) {
nvList.add(n.toString()); // 保持主键
nvList.add(n.toString()); // 保持主键为文本
} else {
nvList.add(n);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public class FieldAggregation extends TriggerAction {
protected String followSourceWhere;

public FieldAggregation(ActionContext context) {
this(context, Boolean.FALSE);
this(context, Boolean.TRUE);
}

protected FieldAggregation(ActionContext context, boolean ignoreSame) {
Expand Down Expand Up @@ -215,7 +215,10 @@ public Object execute(OperatingContext operatingContext) throws TriggerException
} else if (dt == DisplayType.N2NREFERENCE) {
// 强制去重
Set<ID> idSet = new LinkedHashSet<>();
for (Object id : oArray) idSet.add((ID) id);
for (Object id : oArray) {
if (id instanceof ID) idSet.add((ID) id);
else idSet.add(ID.valueOf((String) id)); // 主键会保持文本
}
targetRecord.setIDArray(targetField, idSet.toArray(new ID[0]));

} else {
Expand Down Expand Up @@ -274,19 +277,19 @@ public Object execute(OperatingContext operatingContext) throws TriggerException

// 回填 (v3.1)
// 仅分组聚合有此配置

String fillbackField = ((JSONObject) actionContext.getActionContent()).getString("fillbackField");
if (fillbackField != null && MetadataHelper.checkAndWarnField(sourceEntity, fillbackField)) {
String sql = String.format("select %s from %s where %s",
sourceEntity.getPrimaryField().getName(), sourceEntity.getName(), filterSql);
String sql = String.format("select %s,%s from %s where %s",
sourceEntity.getPrimaryField().getName(), fillbackField, sourceEntity.getName(), filterSql);
Object[][] fillbacks = Application.createQueryNoFilter(sql).array();

for (Object[] to : fillbacks) {
Record fbRecord = EntityHelper.forUpdate((ID) to[0], UserService.SYSTEM_USER, false);
fbRecord.setID(fillbackField, targetRecordId);
for (Object[] o : fillbacks) {
if (CommonsUtils.isSame(o[1], targetRecordId)) continue;

// FIXME 回填仅更新,无业务规则
Application.getCommonsService().update(fbRecord, false);
Record r = EntityHelper.forUpdate((ID) o[0], UserService.SYSTEM_USER, false);
r.setID(fillbackField, targetRecordId);
Application.getCommonsService().update(r, false);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ public GroupAggregation(ActionContext context) {
this(context, Boolean.FALSE);
}

// ignoreSame 本触发器有回填,忽略同值会导致无法回填
public GroupAggregation(ActionContext context, boolean ignoreSame) {
super(context, ignoreSame);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ public static BufferedImage createBarCode(String content, int width, int height,
protected static BitMatrix createBarCodeImage(String content, BarcodeFormat format, int width, int height) {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, AppUtils.UTF8);
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); // 高级别导致空白边框???
hints.put(EncodeHintType.MARGIN, 0);

try {
Expand Down
38 changes: 30 additions & 8 deletions src/main/java/com/rebuild/utils/CommonsUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import com.rebuild.core.Application;
import com.rebuild.core.RebuildException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
Expand All @@ -26,6 +27,7 @@
import java.math.RoundingMode;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Collection;
import java.util.Objects;
import java.util.UUID;
Expand Down Expand Up @@ -258,17 +260,37 @@ public static boolean hasLength(Object any) {
* @param b
* @return
*/
@SuppressWarnings("unchecked")
public static boolean isSame(Object a, Object b) {
boolean e = Objects.equals(a, b);
if (!e) {
if (a instanceof Number && b instanceof Number) {
// FIXME 有精度问题
e = ObjectUtils.toDouble(a) == ObjectUtils.toDouble(b);
}
if (a == null && b != null) return false;
if (a != null && b == null) return false;
if (Objects.equals(a, b)) return true;

// 数字
if (a instanceof Number && b instanceof Number) {
// FIXME 有精度问题
return ObjectUtils.toDouble(a) == ObjectUtils.toDouble(b);
}
return e;
}

// 集合/数组
if ((a instanceof Collection || a instanceof Object[]) && (b instanceof Collection || b instanceof Object[])) {
Collection<Object> aColl;
if (a instanceof Object[]) aColl = Arrays.asList((Object[]) a);
else aColl = (Collection<Object>) a;
Collection<Object> bColl;
if (b instanceof Object[]) bColl = Arrays.asList((Object[]) b);
else bColl = (Collection<Object>) b;

if (aColl.size() != bColl.size()) return false;
if (aColl.isEmpty()) return true;
return CollectionUtils.containsAll(aColl, bColl) && CollectionUtils.containsAll(bColl, aColl);
}

// 其他
// FIXME 完善不同值类型的比较
return StringUtils.equals(a.toString(), b.toString());
}

/**
* 指定范围的随机数
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,13 @@ public RespBody checkTemplate(@EntityParam Entity entity, HttpServletRequest req
final String file = getParameterNotNull(request, "file");
final int type = getIntParameter(request, "type", DataReportManager.TYPE_RECORD);

boolean isDocx = file.toLowerCase().endsWith(".docx");
if (type == DataReportManager.TYPE_WORD) {
if (!isDocx) return RespBody.errorl("上传 WORD 文件请选择 WORD 模板类型");
} else {
if (isDocx) return RespBody.errorl("上传 EXCEL 文件请选择 EXCEL 模板类型");
}

File template = RebuildConfiguration.getFileOfData(file);
Map<String, String> vars = null;
try {
Expand All @@ -121,7 +128,7 @@ public RespBody checkTemplate(@EntityParam Entity entity, HttpServletRequest req

} catch (Exception ex) {
Log.error(null, ex);
return RespBody.error(Language.L("无效模板文件 (无法读取模板文件)"));
return RespBody.error(Language.L("无效模板文件 (无法读取文件内容)"));
}

if (vars == null || vars.isEmpty()) {
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/rebuild/web/commons/FileUploader.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void upload(HttpServletRequest request, HttpServletResponse response) {
break;
}

if (file == null || file.isEmpty()) {
if (file == null) {
writeFailure(response, "No file found");
return;
}
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/com/rebuild/web/commons/MetadataGetting.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,12 @@ public List<JSON> entities(HttpServletRequest request) {
@GetMapping("fields")
public JSON fields(HttpServletRequest request) {
Entity entity = MetadataHelper.getEntity(getParameterNotNull(request, "entity"));
// 返回引用实体的字段
// 返回引用实体的字段层级
int appendRefFields = getIntParameter(request, "deep", 0);
// 返回ID主键字段
boolean forceWithId = getBoolParameter(request, "withid");

return MetaFormatter.buildFieldsWithRefs(entity, appendRefFields, true, field -> {
return MetaFormatter.buildFieldsWithRefs(entity, appendRefFields, true, forceWithId, field -> {
if (!field.isQueryable()) return true;

if (field instanceof Field) {
Expand Down
20 changes: 20 additions & 0 deletions src/main/java/com/rebuild/web/general/MetaFormatter.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ public static JSONObject buildRichField(EasyField field) {
* @param deep
* @param filter
* @return
* @see #buildFieldsWithRefs(Entity, int, boolean, boolean, Predicate)
*/
public static JSONArray buildFieldsWithRefs(Entity entity, int deep, Predicate<BaseMeta> filter) {
return buildFieldsWithRefs(entity, deep, false, filter);
Expand All @@ -90,8 +91,23 @@ public static JSONArray buildFieldsWithRefs(Entity entity, int deep, Predicate<B
* @param riching
* @param filter
* @return
* @see #buildFieldsWithRefs(Entity, int, boolean, boolean, Predicate)
*/
public static JSONArray buildFieldsWithRefs(Entity entity, int deep, boolean riching, Predicate<BaseMeta> filter) {
return buildFieldsWithRefs(entity, deep, riching, false, filter);
}

/**
* 获取字段列表
*
* @param entity
* @param deep 几级
* @param riching
* @param forceWithId 带有主键ID
* @param filter
* @return
*/
public static JSONArray buildFieldsWithRefs(Entity entity, int deep, boolean riching, boolean forceWithId, Predicate<BaseMeta> filter) {
JSONArray res = new JSONArray();

// 一级
Expand All @@ -101,6 +117,10 @@ public static JSONArray buildFieldsWithRefs(Entity entity, int deep, boolean ric

res.add(buildField(easyField, null, riching));
}
if (forceWithId) {
res.add(buildField(EasyMetaFactory.valueOf(entity.getPrimaryField()), null, false));
}

if (deep < 2) return res;

List<Object[]> deep3Refs = new ArrayList<>();
Expand Down
Loading

0 comments on commit 817e76b

Please sign in to comment.