diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportInstanceService.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportInstanceService.java index 974e730f363cdf4014c37f104f8f81136c3f7abd..daf5c5e0f0f7555e68926f4a5b4617d215363da6 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportInstanceService.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportInstanceService.java @@ -105,9 +105,20 @@ public class ReportInstanceService implements ReportInstanceStub { { // 很重要的参数提取 paramMap.forEach(paramsMiddle::put); - final String timeStr = Ut.valueString(params, "reportAt"); - final String time = Ut.fromDate(Ut.parseFull(timeStr), "yyyy-MM-dd"); - paramsMiddle.put("time", time); + final String reportStartTime = Ut.valueString(params, "reportStartTime"); + final String reportEndTime = Ut.valueString(params, "reportEndTime"); + if(reportStartTime==null&&reportEndTime==null){ + final String timeStr = Ut.valueString(params, "reportAt"); + final String time = Ut.fromDate(Ut.parseFull(timeStr), "yyyy-MM-dd"); + paramsMiddle.put("time", time); + }else { + final String time = Ut.fromDate(Ut.parseFull(reportStartTime), "yyyy-MM-dd"); + final String time2 = Ut.fromDate(Ut.parseFull(reportEndTime), "yyyy-MM-dd"); + paramsMiddle.put("time", time); + paramsMiddle.put("time2", time2); + } + + } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java index 247c19fecbd74913cfd08fc1ca8ace1669eaba8c..efbf0dd3bd09fa7a24fcea859c34ddab4d80fe23 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/api/service/ReportService.java @@ -91,6 +91,7 @@ public class ReportService implements ReportStub { // ERR-80702 return Ut.Bnd.failOut(_400ReportDataSetException.class, this.getClass(), reportId); } + return DataSet.Tool.outputArray(params, dataSet); }); } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/atom/RDimension.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/atom/RDimension.java index 202c5fec5b907255a848f0f2107db64b46d8c0d9..b833efa888fbb4bbd6ee76b55075565c3ab5d7e9 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/atom/RDimension.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/atom/RDimension.java @@ -7,6 +7,8 @@ import io.zerows.extension.runtime.report.eon.RpConstant; import io.zerows.extension.runtime.report.eon.em.EmDim; import java.io.Serializable; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.LinkedHashSet; import java.util.Objects; import java.util.Set; @@ -85,22 +87,33 @@ public class RDimension implements Serializable { return sourceData.size(); } final Stream waiting = Ut.itJArray(sourceData) - .map(item -> item.getValue(aggregator.field())) - .filter(Objects::nonNull) - .map(Object::toString) - .filter(Ut::isDecimal) - .map(Double::parseDouble); + .map(item -> item.getValue(aggregator.field())) + .filter(Objects::nonNull) + .map(Object::toString) + .filter(value -> Ut.isDecimal(value) || Ut.isInteger(value)) // 支持整数和小数 + .map(value -> { + // 将字符串解析为 Double,无论是整数还是小数 + if (Ut.isInteger(value)) { + return Double.valueOf(Integer.parseInt(value)); + } + return Double.parseDouble(value); + }); + if (EmDim.Aggregator.SUM == type) { - return waiting.reduce(Double::sum).orElse(0.0); + double result = waiting.reduce(Double::sum).orElse(0.00); + return BigDecimal.valueOf(result).setScale(2, RoundingMode.DOWN); } if (EmDim.Aggregator.AVG == type) { - return waiting.reduce(Double::sum).orElse(0.0) / sourceData.size(); + double result = waiting.reduce(Double::sum).orElse(0.00) / sourceData.size(); + return BigDecimal.valueOf(result).setScale(2, RoundingMode.DOWN); } if (EmDim.Aggregator.MAX == type) { - return waiting.reduce(Double::max).orElse(0.0); + double result = waiting.reduce(Double::max).orElse(0.00); + return BigDecimal.valueOf(result).setScale(2, RoundingMode.DOWN); } if (EmDim.Aggregator.MIN == type) { - return waiting.reduce(Double::min).orElse(0.0); + double result = waiting.reduce(Double::min).orElse(0.00); + return BigDecimal.valueOf(result).setScale(2, RoundingMode.DOWN); } return null; } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/eon/RpConstant.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/eon/RpConstant.java index f91db31fe2db81e181708a570658a7e78e3648c9..3f0582cea72889febaa9dec152af532e25d2d786 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/eon/RpConstant.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/eon/RpConstant.java @@ -13,7 +13,11 @@ public interface RpConstant { String EXTENSION = "ds.extension"; String SOURCE = "ds.source"; } - + interface ConfigField{ + String COMBINE = "combine"; + String TOTAL = "total"; + String TOTAL_COUNT = "totalCount"; + } interface DimField { String KEY = "dimKey"; String DISPLAY = "dimDisplay"; @@ -22,7 +26,6 @@ public interface RpConstant { interface DimValue { String FIELD_GROUP = "field.group"; - String FIELD_VECTOR = "field.vector"; } interface ValuePath { diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/refine/Rp.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/refine/Rp.java index 22e344600c6371c65435fdc4fa43bc3d77410a52..b1a6f070d55afa4a1bdd44b9f1436b8f1ced67de 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/refine/Rp.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/refine/Rp.java @@ -2,6 +2,7 @@ package io.zerows.extension.runtime.report.refine; import io.vertx.core.json.JsonObject; + /** * @author lang : 2024-11-14 */ diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorData.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorData.java index 280e6889eb2ecf4d3f7c6a07c1d441df9672b85f..03f39be53baf74e782f391b037700848cd83e925 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorData.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorData.java @@ -17,9 +17,7 @@ import io.zerows.extension.runtime.report.eon.RpConstant; import io.zerows.extension.runtime.report.eon.em.EmReport; import io.zerows.extension.runtime.report.uca.feature.OFeature; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -71,6 +69,14 @@ class StepGeneratorData extends AbstractStepGenerator { final JsonArray featureA = new JsonArray(); features.forEach(feature -> { final JsonObject featureItem = new JsonObject(); + String valueConfig = feature.getValueConfig(); + if(valueConfig!=null){ + JsonObject entries = new JsonObject(valueConfig); + if(entries.getJsonObject("css")!=null){ + featureItem.mergeIn(entries.getJsonObject("css")); + } + } + featureItem.put("dataIndex", feature.getName()); featureItem.put("title", feature.getValueDisplay()); featureA.add(featureItem); @@ -90,7 +96,7 @@ class StepGeneratorData extends AbstractStepGenerator { private Future calculateContent(final JsonArray sourceData, final JsonObject params) { final RGeneration generation = this.metadata(); final List featureDim = generation.featureDim(); - if (VValue.ONE != featureDim.size()) { + if (VValue.ONE < featureDim.size()) { // TODO: 多维度计算 this.logger().warn("Current Version Does not support. key = {}", generation.key()); return Ux.futureA(); @@ -171,8 +177,7 @@ class StepGeneratorData extends AbstractStepGenerator { // combine 节点,追加维度行 final KpReport report = this.metadata().reportMeta(); final JsonObject reportConfig = Ut.toJObject(report.getReportConfig()); - final JsonObject combine = Ut.valueJObject(reportConfig, "combine"); - + final JsonObject combine = Ut.valueJObject(reportConfig, RpConstant.ConfigField.COMBINE); // 重新构造数据记录 final JsonArray reportData = new JsonArray(); dimKeys.stream().filter(groupMap::containsKey).forEach(dimKey -> { diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorFacade.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorFacade.java index ddae570f0e2e3bdb798a64c202191d42c2485755..936b47b2be463ebbb7450561064a4d80809904d1 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorFacade.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorFacade.java @@ -17,6 +17,8 @@ class StepGeneratorFacade extends AbstractStepGenerator { private final StepGenerator generatorAudit; private final StepGenerator generatorData; + private final StepGenerator generatorTotal; + StepGeneratorFacade(final RGeneration generation) { super(generation); @@ -24,6 +26,7 @@ class StepGeneratorFacade extends AbstractStepGenerator { this.generatorBelong = of(generation, StepGeneratorBelong.class); this.generatorAudit = of(generation, StepGeneratorAudit.class); this.generatorData = of(generation, StepGeneratorData.class); + this.generatorTotal = of(generation, StepGeneratorTotal.class); } @Override @@ -59,6 +62,10 @@ class StepGeneratorFacade extends AbstractStepGenerator { * reportData * reportContent */ - .compose(processed -> this.generatorData.build(processed, params, sourceData)); + .compose(processed -> this.generatorData.build(processed, params, sourceData)) + /* + * 在最底部加上合计 + */ + .compose(processed->this.generatorTotal.build(processed,params,sourceData)); } } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java new file mode 100644 index 0000000000000000000000000000000000000000..cb16444926450c5106d639d02e6ad071fd577b13 --- /dev/null +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/combiner/StepGeneratorTotal.java @@ -0,0 +1,101 @@ +package io.zerows.extension.runtime.report.uca.combiner; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.up.eon.KName; +import io.vertx.up.unity.Ux; +import io.vertx.up.util.Ut; +import io.zerows.extension.runtime.report.atom.RGeneration; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpFeature; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpReport; +import io.zerows.extension.runtime.report.domain.tables.pojos.KpReportInstance; +import io.zerows.extension.runtime.report.eon.RpConstant; +import io.zerows.extension.runtime.report.eon.em.EmReport; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author Yu : 2024-12-31 + */ +public class StepGeneratorTotal extends AbstractStepGenerator { + StepGeneratorTotal(final RGeneration generation) { + super(generation); + } + + @Override + public Future build(KpReportInstance instance, JsonObject request, JsonArray sourceData) { + final KpReport report = this.metadata().reportMeta(); + final RGeneration metadata = this.metadata(); + final List features = metadata.featureData(); + final JsonObject reportConfig = Ut.toJObject(report.getReportConfig()); + final JsonObject bottomTotal = Ut.valueJObject(reportConfig, RpConstant.ConfigField.TOTAL); + final JsonObject totalCount = Ut.valueJObject(reportConfig, RpConstant.ConfigField.TOTAL_COUNT); + final JsonObject reportContent = new JsonObject(instance.getReportContent()); + final JsonArray data = reportContent.getJsonArray(KName.DATA); + final JsonArray children = new JsonArray(); + data.forEach(item -> { + final JsonObject entries = Ux.toJson(item); + final JsonArray jsonArray = entries.getJsonArray(KName.CHILDREN); + jsonArray.forEach(children::add); + }); + final ConcurrentHashMap total = new ConcurrentHashMap<>(); + bottomTotal.fieldNames().forEach(dimFeature -> { + // 提取 Feature + final KpFeature feature = Ut.elementFind(features, item -> item.getName().equals(dimFeature)); + final EmReport.FeatureType featureType = Ut.toEnum(feature.getType(), EmReport.FeatureType.class, EmReport.FeatureType.NONE); + if (EmReport.FeatureType.AGGR == featureType) { + children.forEach(item -> { + JsonObject entries = Ux.toJson(item); + String string = entries.getString(feature.getName()); + // 使用 BigDecimal.valueOf 保留两位小数 + BigDecimal value = (string == null || string.isEmpty()) ? BigDecimal.ZERO : BigDecimal.valueOf(Double.parseDouble(string)).setScale(2, RoundingMode.HALF_UP); + // 转换为字符串,确保两位小数 + String valueString = value.toString(); + // 使用 compute 方法累加值 + total.compute(feature.getName(), (key, current) -> { + if (current == null) { + return valueString; // 如果该键没有值,直接使用当前值 + } else { + // 将当前值和新值转换为 BigDecimal,进行累加 + BigDecimal currentValue = new BigDecimal(current); + BigDecimal newValue = new BigDecimal(valueString); + BigDecimal sum = currentValue.add(newValue).setScale(2, RoundingMode.HALF_UP); + return sum.toString(); // 返回累加后的值 + } + }); + }); + } + }); + if (totalCount.fieldNames().size()!=0) { + totalCount.fieldNames().forEach(count -> { + final String formula = totalCount.getString(count); + Object result = Ut.fromExpressionT(formula, Ux.toJson(total)); + if(result==null){ + result= "0.00"; + } + final BigDecimal bigDecimal = new BigDecimal(result.toString()); + final BigDecimal truncatedValue = bigDecimal.setScale(2, RoundingMode.DOWN); + total.put(count, truncatedValue.toString()); + }); + final JsonObject entries = Ux.toJson(total); + entries.put(KName.KEY, UUID.randomUUID().toString()); + bottomTotal.fieldNames().forEach(item -> { + boolean b = total.containsKey(item); + if (!b) { + entries.put(item, bottomTotal.getString(item)); + } + }); + JsonObject entries1 = Ux.cloneT(entries); + entries.put(KName.CHILDREN,new JsonArray().add(entries1)); + data.add(entries); + } + reportContent.put(KName.DATA, data); + instance.setReportContent(reportContent.toString()); + return Ux.future(instance); + } +} diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/feature/RQueryComponent.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/feature/RQueryComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..e4b10954d1d43177c67f03436ecddf779c5886f2 --- /dev/null +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/feature/RQueryComponent.java @@ -0,0 +1,15 @@ +package io.zerows.extension.runtime.report.uca.feature; + +import io.vertx.core.Future; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; + +import java.util.concurrent.ConcurrentMap; + +/** + * @author Yu : 2024-11-27 + */ +public interface RQueryComponent { + + Future dataAsync(JsonArray dataSource, JsonObject parameters); +} diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcImpl.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcImpl.java index 9ca8e14828a3243961831343b690996b2f2da21f..8dc6a532652fde05d15898f6215c7179f2e61990 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcImpl.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcImpl.java @@ -1,5 +1,6 @@ package io.zerows.extension.runtime.report.uca.process; +import io.horizon.uca.cache.Cc; import io.vertx.core.Future; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; @@ -14,6 +15,7 @@ import io.zerows.extension.runtime.report.domain.tables.pojos.KpDimension; import io.zerows.extension.runtime.report.eon.em.EmDim; import io.zerows.extension.runtime.report.eon.em.EmReport; import io.zerows.extension.runtime.report.exception._400ReportDimTypeException; +import io.zerows.extension.runtime.report.uca.feature.RQueryComponent; import io.zerows.extension.runtime.report.uca.pull.DataSet; import org.osgi.framework.Bundle; @@ -31,6 +33,8 @@ import java.util.stream.Collectors; */ class DimProcImpl extends AbstractDimProc { + private static final Cc CC_OUT = Cc.openThread(); + private static final ConcurrentMap> SUPPLIER = new ConcurrentHashMap<>() { { this.put(EmDim.Type.TREE, (owner) -> AbstractDimProc.of(owner, DimProcTree.class)); @@ -63,11 +67,36 @@ class DimProcImpl extends AbstractDimProc { final Set dataSet = dimensions.stream().map(KpDimension::getDataSetId).collect(Collectors.toSet()); return Ux.Jooq.on(KpDataSetDao.class).fetchInAsync(KName.KEY, dataSet).compose(dataSets -> { final ConcurrentMap> resultMap = new ConcurrentHashMap<>(); - dataSets.forEach(dataSetItem -> { - final Future result = DataSet.Tool.outputArray(params, dataSetItem); - resultMap.put(dataSetItem.getKey(), result); - }); - return Fn.combineM(resultMap); + if(dataSets.size() > 0){ + KpDataSet kpDataSet = dataSets.get(0); + final JsonObject sourceJ = Ut.toJObject(kpDataSet.getDataSource()); + final DataSet executor = DataSet.of(sourceJ); + final JsonObject queryDef = Ut.toJObject(kpDataSet.getDataQuery()); + return executor.loadAsync(params, queryDef).compose(dataSouce->{ + if(kpDataSet.getDataComponent()!=null){ + String dataComponent =kpDataSet.getDataComponent(); + RQueryComponent queryComponent = CC_OUT.pick(() -> Ut.instance(dataComponent), dataComponent); + final JsonObject parameters = new JsonObject(); + parameters.put(KName.INPUT, params); + Future compose = queryComponent.dataAsync(dataSouce, parameters).compose(result -> { + if (Objects.isNull(result)) { + return Ut.future(dataSouce); + } + return Ut.future(result); + }); + resultMap.put(kpDataSet.getKey(), compose); + }else { + dataSets.forEach(dataSetItem -> { + final Future result = DataSet.Tool.outputArray(params, dataSetItem); + resultMap.put(dataSetItem.getKey(), result); + }); + } + return Fn.combineM(resultMap); + + }); + }else { + return Fn.combineM(resultMap); + } }); } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcTree.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcTree.java index 8c07c0dd5c1edf79e9a40ff142ffe2c2042ca2c2..7f2d25cebfdea0c5a0a5b78a508fa9d1882a23b1 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcTree.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/process/DimProcTree.java @@ -92,8 +92,9 @@ class DimProcTree extends AbstractDimProc { itemFinal.put(RpConstant.DimField.CHILDREN, this.dimChildren(item, data, keyId)); // 自身 itemFinal.put(RpConstant.DimField.DISPLAY, this.dimDisplay(item, data, labelConfig)); // 注意区别 - itemFinal.put(RpConstant.DimField.KEY, Ut.valueString(item, keyId)); - result.add(item); + //todo + itemFinal.put(RpConstant.DimField.KEY, Ut.valueString(item, labelField)); + result.add(itemFinal); }); } return result; diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/AbstractDataSet.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/AbstractDataSet.java index 9f55f677278412fee727c3b0631b0efb62c8f544..f322d1eaed3d897f885632ef3dc4e3152cd9aa87 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/AbstractDataSet.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/AbstractDataSet.java @@ -53,9 +53,26 @@ public abstract class AbstractDataSet implements DataSet { final JsonArray ids = Ut.valueJArray(data, whereField); final JsonObject condition = Ux.whereAnd(); + if (refConfig.containsKey("byField")) { + Object byFieldValue = refConfig.getValue("byField"); - condition.put(this.loadKey(refConfig) + ",i", ids); - + if (byFieldValue instanceof Boolean) { + // 如果 byField 是布尔类型 + if ((Boolean) byFieldValue) { + condition.put(refField + ",i", ids); + }else { + condition.put(this.loadKey(refConfig) + ",i", ids); + } + } else if (byFieldValue instanceof String byFieldStr) { + // 如果 byField 是字符串类型list = {ArrayList@32413} size = 2 + condition.put(byFieldStr + ",i", ids); + } else { + // 默认处理 + condition.put(this.loadKey(refConfig) + ",i", ids); + } + } else { + condition.put(this.loadKey(refConfig) + ",i", ids); + } final DataSet dataSet = DataSet.of(refConfig); dataMap.put(whereField, dataSet.loadAsync(condition)); // input / refField -> output @@ -78,9 +95,25 @@ public abstract class AbstractDataSet implements DataSet { final String whereField = this.loadKey(refField, refConfig); final String keyField = this.loadKey(refConfig); // 数据连接 - final ConcurrentMap whereMap = Ut.elementMap(queryData, keyField); - // 开始连接 - childData.put(whereField, Ut.toJObject(whereMap)); + if (refConfig.containsKey("byField")) { + Object byFieldValue = refConfig.getValue("byField"); + if (byFieldValue instanceof Boolean) { + // 如果 byField 是布尔类型 + if ((Boolean) byFieldValue) { + final ConcurrentMap whereMap = Ut.elementMap(queryData, whereField); + // 开始连接 + childData.put(whereField, Ut.toJObject(whereMap)); + } + } + if(byFieldValue instanceof String byFieldStr){ + final ConcurrentMap whereMap = Ut.elementMap(queryData, byFieldStr); + childData.put(whereField, Ut.toJObject(whereMap)); + } + } else { + final ConcurrentMap whereMap = Ut.elementMap(queryData, keyField); + // 开始连接 + childData.put(whereField, Ut.toJObject(whereMap)); + } }); Ut.itJArray(data).forEach(dataEach -> { @@ -88,7 +121,6 @@ public abstract class AbstractDataSet implements DataSet { final Set fieldSet = childData.fieldNames(); fieldSet.forEach(inputField -> { final String inputValue = dataEach.getString(inputField); - // 原始记录是否包含 field 对应值 final JsonObject outData = childData.getJsonObject(inputField); final JsonObject outValue = outData.getJsonObject(inputValue); diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSet.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSet.java index c7c9034e1202b8dc9803c09a1f0f2f819927ce4a..1955b312a188912720a558097bbe83c4ee214450 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSet.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSet.java @@ -7,11 +7,16 @@ import io.vertx.core.Future; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.up.eon.KName; +import io.vertx.up.fn.Fn; +import io.vertx.up.unity.Ux; import io.vertx.up.util.Ut; import io.zerows.core.metadata.uca.logging.OLog; import io.zerows.extension.runtime.report.domain.tables.pojos.KpDataSet; import io.zerows.extension.runtime.report.eon.RpConstant; import io.zerows.extension.runtime.report.eon.em.EmReport; +import io.zerows.extension.runtime.report.uca.feature.RQueryComponent; + +import java.util.Objects; /** * 数据源加载器,用于处理 dataSource 字段定义的数据源的相关信息加载,主要依赖 @@ -26,10 +31,11 @@ import io.zerows.extension.runtime.report.eon.em.EmReport; public interface DataSet { Cc CC_SKELETON = Cc.openThread(); + Cc CC_OUT = Cc.openThread(); static DataSet of(final JsonObject sourceJ) { final EmReport.SourceType type = Ut.toEnum( - () -> Ut.valueString(sourceJ, "sourceType"), EmReport.SourceType.class); + () -> Ut.valueString(sourceJ, "sourceType"), EmReport.SourceType.class); final String dsTarget; // TABLE if (EmReport.SourceType.TABLE == type) { @@ -39,7 +45,7 @@ public interface DataSet { paramConstructor.put(KName.SOURCE, dsTarget); paramConstructor.put(KName.CHILDREN, sourceJ.getValue(KName.CHILDREN)); return CC_SKELETON.pick( - () -> new DataSetTable(paramConstructor), type + VString.SLASH + dsTarget + () -> new DataSetTable(paramConstructor), type + VString.SLASH + dsTarget ); } // JOIN_2 @@ -47,7 +53,7 @@ public interface DataSet { final JsonObject paramConstructor = Ut.valueJObject(sourceJ, RpConstant.SourceTypeField.SOURCE); paramConstructor.put(KName.CHILDREN, sourceJ.getValue(KName.CHILDREN)); return CC_SKELETON.pick( - () -> new DataSetJoin2(paramConstructor), type + VString.SLASH + paramConstructor.hashCode() + () -> new DataSetJoin2(paramConstructor), type + VString.SLASH + paramConstructor.hashCode() ); } // Not Support @@ -59,7 +65,6 @@ public interface DataSet { * * @param params 读取参数 * @param queryJ 查询配置 - * * @return 返回读取的数据 */ Future loadAsync(JsonObject params, JsonObject queryJ); @@ -84,11 +89,28 @@ public interface DataSet { } static Future outputArray(final JsonObject params, final KpDataSet dataSet) { - // 新版只通过 dataSource 来构造数据源,不再使用 dataSet + /** + * 先分流 不能二义性 + * + */ final JsonObject sourceJ = Ut.toJObject(dataSet.getDataSource()); final DataSet executor = DataSet.of(sourceJ); - final JsonObject queryDef = Ut.toJObject(dataSet.getDataQuery()); + + if (dataSet.getDataComponent() != null) { + return executor.loadAsync(params, queryDef).compose(dataSouce -> { + String dataComponent = dataSet.getDataComponent(); + RQueryComponent queryComponent = CC_OUT.pick(() -> Ut.instance(dataComponent), dataComponent); + final JsonObject parameters = new JsonObject(); + parameters.put(KName.INPUT, params); + return queryComponent.dataAsync(dataSouce, parameters).compose(result -> { + if (Objects.isNull(result)) { + return Ut.future(dataSouce); + } + return Ut.future(result); + }); + }); + } return executor.loadAsync(params, queryDef); } } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSetTable.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSetTable.java index 8924c1cd44d1809738b6c167a1013a601676a0ff..6d6acfd92a9032dce54ea4fb8bca70b17fc64c68 100644 --- a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSetTable.java +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/DataSetTable.java @@ -56,6 +56,15 @@ class DataSetTable extends AbstractDataSet { this.connect.getTable(), parameters.encode()); // 提取 UxJooq final UxJooq jq = Ux.Jooq.bridge(this.connect); - return jq.fetchJAndAsync(parameters).compose(data -> this.loadChildren(data, this.children)); + if(parameters.getBoolean("")!=null){ + if(!parameters.getBoolean("")){ + return jq.fetchJOrAsync(parameters).compose(data -> this.loadChildren(data, this.children)); + }else { + return jq.fetchJAndAsync(parameters).compose(data -> this.loadChildren(data, this.children)); + } + }else { + return jq.fetchJAndAsync(parameters).compose(data -> this.loadChildren(data, this.children)); + + } } } diff --git a/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/io/AbstractRDataComponent.java b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/io/AbstractRDataComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..19895565efb703e30d08c2f989d043bdfb44dc15 --- /dev/null +++ b/Zero.Extension.Runtime.Report.DB/src/main/java/io/zerows/extension/runtime/report/uca/pull/io/AbstractRDataComponent.java @@ -0,0 +1,9 @@ +package io.zerows.extension.runtime.report.uca.pull.io; + +import io.zerows.extension.runtime.report.uca.feature.RQueryComponent; + +/** + * @author lang : 2024-11-14 + */ +public abstract class AbstractRDataComponent implements RQueryComponent { +}