diff --git a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/mapper/config/StrategyVoDtoMapper.java b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/mapper/config/StrategyVoDtoMapper.java index e377e44ea74178dce4e9759b26e322879677fd22..90ddfa35aeb506ade6b4325dfb4da368a117d3dc 100644 --- a/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/mapper/config/StrategyVoDtoMapper.java +++ b/rec-admin/rec-admin-biz/src/main/java/cn/icanci/rec/admin/biz/mapper/config/StrategyVoDtoMapper.java @@ -1,19 +1,19 @@ package cn.icanci.rec.admin.biz.mapper.config; -import org.mapstruct.Mapper; -import org.mapstruct.NullValueMappingStrategy; - import cn.icanci.rec.admin.biz.mapper.convertor.*; import cn.icanci.rec.common.aggregation.model.StrategyDTO; import cn.icanci.rec.common.model.config.StrategyVO; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueMappingStrategy; + /** * @author icanci * @since 1.0 Created in 2022/11/11 17:49 */ @Mapper(componentModel = "spring", uses = { DataSourceTypeEnumConverter.class, RuleTypeEnumConverter.class, OperatorEnumConverter.class, InterruptEnumConverter.class, ResultTypeEnumConverter.class, RuleModeEnumConverter.class }, nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL) -public interface StrategyVoDtoMapper extends BaseMapper { +public interface StrategyVoDtoMapper { StrategyDTO vo2dto(StrategyVO strategyVO); diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java index c0e5dcd3eefc24089089c95e6f610052ccb755d2..f6b3413caec6492500287bc5641b1766d5ff8e18 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/ContainCondition.java @@ -1,6 +1,8 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; import javax.script.Bindings; @@ -17,6 +19,18 @@ public class ContainCondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + + switch (dataType) { + case STRING: + case METADATA: + return leftValue.contains(rightValue); + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java index 96a966851ab81f94ff97af6927d448183847cebb..de86dc569580840f11e28a2077f3545533b14bac 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTCondition.java @@ -1,7 +1,12 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; +import cn.icanci.rec.common.utils.DateUtils; + +import java.math.BigDecimal; import javax.script.Bindings; @@ -17,6 +22,18 @@ public class GTCondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + switch (dataType) { + case NUMBER: + return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) > 0; + case DATE: + return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) > 0; + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java index 0243b193fecfab8a90c7895c655b02afe85b8718..5535a10268b34234a3de43f9bdf5482bf5be07d2 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/GTECondition.java @@ -1,7 +1,12 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; +import cn.icanci.rec.common.utils.DateUtils; + +import java.math.BigDecimal; import javax.script.Bindings; @@ -17,6 +22,18 @@ public class GTECondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + switch (dataType) { + case NUMBER: + return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) >= 0; + case DATE: + return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) >= 0; + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java index 994f4fa0cd1e564164d067b141a98105b62cf30f..5a1d3d379b90f5b6c1bfe0447caa9ed6bbdac159 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/IncludedCondition.java @@ -1,8 +1,13 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; +import java.util.Arrays; +import java.util.List; + import javax.script.Bindings; import org.springframework.stereotype.Component; @@ -14,9 +19,23 @@ import org.springframework.stereotype.Component; @Component @ConditionBean(OperatorEnum.INCLUDED) public class IncludedCondition extends AbstractCondition { + /** 右值分隔符 */ + private static final String RIGHT_SPLIT = "::"; @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + List rightValueList = Arrays.asList(rightValue.split(RIGHT_SPLIT)); + switch (dataType) { + case STRING: + case METADATA: + return rightValueList.contains(leftValue); + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java index 3b6d916bf4e0d7a18c64c3ce6458a75d45ad3f0e..0333efbfbc5e6365b9f270c8621b1040fefe8a6c 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTCondition.java @@ -1,7 +1,12 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; +import cn.icanci.rec.common.utils.DateUtils; + +import java.math.BigDecimal; import javax.script.Bindings; @@ -17,6 +22,18 @@ public class LTCondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + switch (dataType) { + case NUMBER: + return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) < 0; + case DATE: + return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) < 0; + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java index 13807f4f03b229140cce6ed33c7bd09f31c0789d..ae87554a76d7c9dcbe4c2393dbf3071421c59458 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/LTECondition.java @@ -1,12 +1,17 @@ package cn.icanci.rec.engine.sdk.condition; -import cn.icanci.rec.common.aggregation.model.StrategyDTO; -import cn.icanci.rec.common.enums.OperatorEnum; +import java.math.BigDecimal; import javax.script.Bindings; import org.springframework.stereotype.Component; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; +import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; +import cn.icanci.rec.common.enums.OperatorEnum; +import cn.icanci.rec.common.utils.DateUtils; + /** * @author icanci * @since 1.0 Created in 2022/11/17 09:22 @@ -17,6 +22,18 @@ public class LTECondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + switch (dataType) { + case NUMBER: + return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) <= 0; + case DATE: + return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) <= 0; + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java index da9d6d684ee083080ad99dd1b06375229a6aa4af..8f0d571606cdb1cebb11e325c3b6d53c7b98fad9 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/NECondition.java @@ -1,10 +1,16 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; +import cn.icanci.rec.common.utils.DateUtils; + +import java.math.BigDecimal; import javax.script.Bindings; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; /** @@ -16,6 +22,23 @@ import org.springframework.stereotype.Component; public class NECondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + switch (dataType) { + case BOOLEAN: + return !StringUtils.equalsIgnoreCase(leftValue, rightValue); + case STRING: + case METADATA: + return !StringUtils.equals(leftValue, rightValue); + case NUMBER: + return new BigDecimal(leftValue).compareTo(new BigDecimal(rightValue)) != 0; + case DATE: + return DateUtils.parse(leftValue, DateUtils.YYYY_MM_DD_HH_MM_SS).compareTo(DateUtils.parse(rightValue, DateUtils.YYYY_MM_DD_HH_MM_SS)) != 0; + default: + // no op + } return false; } } diff --git a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java index 3c3cf558ff391e177fd065307d784b9d96f6bc6e..97c8fbe23f030055c845f4b7335355964b144129 100644 --- a/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java +++ b/rec-engine/rec-engine-sdk/src/main/java/cn/icanci/rec/engine/sdk/condition/UnContainCondition.java @@ -1,6 +1,8 @@ package cn.icanci.rec.engine.sdk.condition; +import cn.icanci.rec.common.aggregation.model.BaseDataDTO; import cn.icanci.rec.common.aggregation.model.StrategyDTO; +import cn.icanci.rec.common.enums.DataTypeEnum; import cn.icanci.rec.common.enums.OperatorEnum; import javax.script.Bindings; @@ -16,6 +18,17 @@ import org.springframework.stereotype.Component; public class UnContainCondition extends AbstractCondition { @Override public boolean match(Bindings bindings, StrategyDTO.SingleCondition singleCondition, String domainCode) { + BaseDataDTO baseData = engineRepositoryHolder.getBaseData(domainCode, singleCondition.getLeftValue()); + String leftValue = getValue(bindings, baseData); + String rightValue = singleCondition.getRightValue(); + DataTypeEnum dataType = DataTypeEnum.valueOf(baseData.getDataType()); + switch (dataType) { + case STRING: + case METADATA: + return !leftValue.contains(rightValue); + default: + // no op + } return false; } }