diff --git a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java index 059826d5..c07543a6 100644 --- a/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java +++ b/ccdi-project/src/main/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolver.java @@ -14,10 +14,13 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; /** * 流水标签规则执行参数解析器 */ +@Slf4j @Component public class BankTagRuleConfigResolver { @@ -61,11 +64,23 @@ public class BankTagRuleConfigResolver { Map thresholdValues = new LinkedHashMap<>(); Set requiredParamCodes = RULE_PARAM_MAPPING.getOrDefault(ruleMeta.getRuleCode(), Set.of()); + log.info("【流水标签】解析规则参数: projectId={}, effectiveProjectId={}, ruleCode={}, requiredParams={}", + projectId, effectiveProjectId, ruleMeta.getRuleCode(), requiredParamCodes); for (CcdiModelParam param : params) { if (requiredParamCodes.contains(param.getParamCode())) { thresholdValues.put(param.getParamCode(), param.getParamValue()); } } + log.debug("【流水标签】规则参数解析结果: projectId={}, ruleCode={}, thresholdValues={}", + projectId, ruleMeta.getRuleCode(), thresholdValues); + + Set missingParamCodes = requiredParamCodes.stream() + .filter(code -> !thresholdValues.containsKey(code)) + .collect(Collectors.toSet()); + if (!missingParamCodes.isEmpty()) { + log.warn("【流水标签】规则参数缺失: projectId={}, ruleCode={}, missingParams={}", + projectId, ruleMeta.getRuleCode(), missingParamCodes); + } BankTagRuleExecutionConfig config = new BankTagRuleExecutionConfig(); config.setProjectId(projectId); diff --git a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java index b2d51553..619eb8ad 100644 --- a/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java +++ b/ccdi-project/src/test/java/com/ruoyi/ccdi/project/service/impl/BankTagRuleConfigResolverTest.java @@ -1,5 +1,8 @@ package com.ruoyi.ccdi.project.service.impl; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.read.ListAppender; import com.ruoyi.ccdi.project.domain.CcdiModelParam; import com.ruoyi.ccdi.project.domain.CcdiProject; import com.ruoyi.ccdi.project.domain.entity.CcdiBankTagRule; @@ -11,10 +14,12 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.slf4j.LoggerFactory; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) @@ -49,6 +54,42 @@ class BankTagRuleConfigResolverTest { assertEquals("1111", config.getThresholdValue("SINGLE_TRANSACTION_AMOUNT")); } + @Test + void resolve_shouldLogThresholdSourceAndMissingParams() { + CcdiProject project = new CcdiProject(); + project.setProjectId(40L); + project.setConfigType("default"); + when(projectMapper.selectById(40L)).thenReturn(project); + when(modelParamMapper.selectByProjectAndModel(0L, "LARGE_TRANSACTION")).thenReturn(List.of( + buildParam("LARGE_CASH_DEPOSIT", "50000") + )); + + CcdiBankTagRule ruleMeta = new CcdiBankTagRule(); + ruleMeta.setModelCode("LARGE_TRANSACTION"); + ruleMeta.setRuleCode("FREQUENT_CASH_DEPOSIT"); + + Logger logger = (Logger) LoggerFactory.getLogger(BankTagRuleConfigResolver.class); + ListAppender logAppender = new ListAppender<>(); + logAppender.start(); + logger.addAppender(logAppender); + + try { + resolver.resolve(40L, ruleMeta); + + assertTrue(logAppender.list.stream().map(ILoggingEvent::getFormattedMessage) + .anyMatch(message -> message.contains("解析规则参数") + && message.contains("projectId=40") + && message.contains("effectiveProjectId=0") + && message.contains("FREQUENT_CASH_DEPOSIT"))); + assertTrue(logAppender.list.stream().map(ILoggingEvent::getFormattedMessage) + .anyMatch(message -> message.contains("规则参数缺失") + && message.contains("projectId=40") + && message.contains("FREQUENT_CASH_DEPOSIT"))); + } finally { + logger.detachAppender(logAppender); + } + } + private CcdiModelParam buildParam(String paramCode, String paramValue) { CcdiModelParam param = new CcdiModelParam(); param.setProjectId(0L);