From 67aebd57705837306fa9e1d9cfa31c6b39afb7a8 Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 19 Nov 2025 23:23:08 +0800 Subject: [PATCH] =?UTF-8?q?refactor(puzzle):=20=E7=A7=BB=E9=99=A4=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E8=A7=84=E5=88=99=E4=B8=AD=E7=9A=84=E6=99=AF=E5=8C=BA?= =?UTF-8?q?ID=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 删除 PuzzleFillRuleDTO、PuzzleFillRuleSaveRequest 和 PuzzleFillRuleEntity 中的 scenicId 字段 - 从 ConditionContext 和 DataSourceContext 中移除 scenicId 属性 - 更新 PuzzleElementFillEngine 的 execute 方法,不再接收和传递 scenicId 参数 - 修改 PuzzleGenerateServiceImpl 中调用填充引擎的逻辑,去除 scenicId 判断和传参 - 调整 PuzzleFillRuleMapper.xml 配置文件,移除 scenic_id 映射关系 - 更新所有相关单元测试用例,删除对 scenicId 的引用和验证 - 简化规则查询方法,由 listByTemplateAndScenic 改为 listByTemplateId - 移除因缺少 scenicId 而产生的警告日志和特殊处理分支 --- .../basic/puzzle/dto/PuzzleFillRuleDTO.java | 5 -- .../puzzle/dto/PuzzleFillRuleSaveRequest.java | 5 -- .../puzzle/entity/PuzzleFillRuleEntity.java | 5 -- .../puzzle/fill/PuzzleElementFillEngine.java | 9 ++-- .../fill/condition/ConditionContext.java | 5 -- .../fill/datasource/DataSourceContext.java | 5 -- .../impl/PuzzleGenerateServiceImpl.java | 8 +-- .../resources/mapper/PuzzleFillRuleMapper.xml | 1 - .../fill/PuzzleElementFillEngineTest.java | 51 +++++++++---------- .../AlwaysConditionStrategyTest.java | 1 - .../impl/PuzzleFillRuleServiceImplTest.java | 2 - .../impl/PuzzleGenerateServiceImplTest.java | 6 +-- 12 files changed, 32 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleDTO.java b/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleDTO.java index 383ac2d0..345c4d5a 100644 --- a/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleDTO.java +++ b/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleDTO.java @@ -46,11 +46,6 @@ public class PuzzleFillRuleDTO { */ private Integer enabled; - /** - * 景区ID - */ - private Long scenicId; - /** * 规则描述 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleSaveRequest.java b/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleSaveRequest.java index 18b78e0e..9db29bad 100644 --- a/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleSaveRequest.java +++ b/src/main/java/com/ycwl/basic/puzzle/dto/PuzzleFillRuleSaveRequest.java @@ -46,11 +46,6 @@ public class PuzzleFillRuleSaveRequest { */ private Integer enabled; - /** - * 景区ID - */ - private Long scenicId; - /** * 规则描述 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/entity/PuzzleFillRuleEntity.java b/src/main/java/com/ycwl/basic/puzzle/entity/PuzzleFillRuleEntity.java index bbcf0874..0d758195 100644 --- a/src/main/java/com/ycwl/basic/puzzle/entity/PuzzleFillRuleEntity.java +++ b/src/main/java/com/ycwl/basic/puzzle/entity/PuzzleFillRuleEntity.java @@ -51,11 +51,6 @@ public class PuzzleFillRuleEntity { */ private Integer enabled; - /** - * 景区ID - */ - private Long scenicId; - /** * 规则描述 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngine.java b/src/main/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngine.java index 8af69d30..0bf72fa1 100644 --- a/src/main/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngine.java +++ b/src/main/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngine.java @@ -49,14 +49,13 @@ public class PuzzleElementFillEngine { * * @param templateId 模板ID * @param faceId 人脸ID - * @param scenicId 景区ID * @return 填充后的dynamicData */ - public Map execute(Long templateId, Long faceId, Long scenicId) { + public Map execute(Long templateId, Long faceId) { Map dynamicData = new HashMap<>(); - if (faceId == null || scenicId == null) { - log.debug("自动填充被跳过, templateId={}, faceId={}, scenicId={}", templateId, faceId, scenicId); + if (faceId == null) { + log.debug("自动填充被跳过, templateId={}, faceId={}", templateId, faceId); return dynamicData; } @@ -78,7 +77,6 @@ public class PuzzleElementFillEngine { // 3. 构建条件评估上下文 ConditionContext conditionContext = ConditionContext.builder() .faceId(faceId) - .scenicId(scenicId) .deviceCount(deviceCount) .deviceIds(deviceIds) .build(); @@ -105,7 +103,6 @@ public class PuzzleElementFillEngine { // 5. 批量填充dynamicData DataSourceContext dataSourceContext = DataSourceContext.builder() .faceId(faceId) - .scenicId(scenicId) .build(); int successCount = 0; diff --git a/src/main/java/com/ycwl/basic/puzzle/fill/condition/ConditionContext.java b/src/main/java/com/ycwl/basic/puzzle/fill/condition/ConditionContext.java index 059eeb8e..42d1d524 100644 --- a/src/main/java/com/ycwl/basic/puzzle/fill/condition/ConditionContext.java +++ b/src/main/java/com/ycwl/basic/puzzle/fill/condition/ConditionContext.java @@ -18,11 +18,6 @@ public class ConditionContext { */ private Long faceId; - /** - * 景区ID - */ - private Long scenicId; - /** * 机位数量(缓存值,避免重复查询) */ diff --git a/src/main/java/com/ycwl/basic/puzzle/fill/datasource/DataSourceContext.java b/src/main/java/com/ycwl/basic/puzzle/fill/datasource/DataSourceContext.java index aeffe286..3a6f03ac 100644 --- a/src/main/java/com/ycwl/basic/puzzle/fill/datasource/DataSourceContext.java +++ b/src/main/java/com/ycwl/basic/puzzle/fill/datasource/DataSourceContext.java @@ -15,11 +15,6 @@ public class DataSourceContext { */ private Long faceId; - /** - * 景区ID - */ - private Long scenicId; - /** * 可扩展的其他上下文数据 */ diff --git a/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java b/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java index 5ae78aca..3bbdba6e 100644 --- a/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java +++ b/src/main/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImpl.java @@ -202,12 +202,11 @@ public class PuzzleGenerateServiceImpl implements IPuzzleGenerateService { Map dynamicData = new HashMap<>(); // 1. 自动填充(基于faceId和规则) - if (request.getFaceId() != null && scenicId != null) { + if (request.getFaceId() != null) { try { Map autoFilled = fillEngine.execute( template.getId(), - request.getFaceId(), - scenicId + request.getFaceId() ); if (autoFilled != null && !autoFilled.isEmpty()) { dynamicData.putAll(autoFilled); @@ -217,9 +216,6 @@ public class PuzzleGenerateServiceImpl implements IPuzzleGenerateService { log.error("自动填充异常, templateId={}, faceId={}", template.getId(), request.getFaceId(), e); // 自动填充失败不影响整体流程,继续执行 } - } else if (request.getFaceId() != null) { - log.warn("自动填充被跳过: 缺少scenicId或模板未绑定景区, templateId={}, faceId={}", - template.getId(), request.getFaceId()); } // 2. 手动数据覆盖(优先级更高) diff --git a/src/main/resources/mapper/PuzzleFillRuleMapper.xml b/src/main/resources/mapper/PuzzleFillRuleMapper.xml index f5cac85c..ccc9fc19 100644 --- a/src/main/resources/mapper/PuzzleFillRuleMapper.xml +++ b/src/main/resources/mapper/PuzzleFillRuleMapper.xml @@ -10,7 +10,6 @@ - diff --git a/src/test/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngineTest.java b/src/test/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngineTest.java index 3208d915..02a418f3 100644 --- a/src/test/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngineTest.java +++ b/src/test/java/com/ycwl/basic/puzzle/fill/PuzzleElementFillEngineTest.java @@ -66,15 +66,15 @@ class PuzzleElementFillEngineTest { Long faceId = 123L; Long scenicId = 1L; - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(new ArrayList<>()); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertTrue(result.isEmpty()); - verify(ruleMapper, times(1)).listByTemplateAndScenic(templateId, scenicId); + verify(ruleMapper, times(1)).listByTemplateId(templateId); verify(sourceMapper, never()).countDistinctDevicesByFaceId(anyLong()); } @@ -88,7 +88,7 @@ class PuzzleElementFillEngineTest { // 模拟规则 PuzzleFillRuleEntity rule = createRule(1L, "4机位规则", 100); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule)); // 模拟机位数量和机位列表 @@ -116,7 +116,7 @@ class PuzzleElementFillEngineTest { .thenReturn("https://oss.example.com/img4.jpg"); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertEquals(4, result.size()); @@ -131,14 +131,11 @@ class PuzzleElementFillEngineTest { } @Test - @DisplayName("缺少faceId或scenicId时直接返回空结果") + @DisplayName("缺少faceId时直接返回空结果") void shouldReturnEmptyWhenRequiredIdsMissing() { - Map result = engine.execute(1L, null, 10L); + Map result = engine.execute(1L, null); assertTrue(result.isEmpty()); verifyNoInteractions(ruleMapper, itemMapper, sourceMapper, conditionEvaluator, dataSourceResolver); - - Map result2 = engine.execute(1L, 10L, null); - assertTrue(result2.isEmpty()); } @Test @@ -146,12 +143,11 @@ class PuzzleElementFillEngineTest { void shouldContinueWhenRuleHasNoItems() { Long templateId = 1L; Long faceId = 123L; - Long scenicId = 1L; PuzzleFillRuleEntity highPriorityRule = createRule(1L, "高优先级无明细", 200); PuzzleFillRuleEntity lowPriorityRule = createRule(2L, "低优先级有效", 100); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(highPriorityRule, lowPriorityRule)); when(sourceMapper.countDistinctDevicesByFaceId(faceId)).thenReturn(1); when(sourceMapper.getDeviceIdsByFaceId(faceId)).thenReturn(List.of(99L)); @@ -167,7 +163,8 @@ class PuzzleElementFillEngineTest { when(dataSourceResolver.resolve(anyString(), anyString(), anyString(), anyString(), any())) .thenReturn("https://oss.example.com/valid.png"); - Map result = engine.execute(templateId, faceId, scenicId); + // When + Map result = engine.execute(templateId, faceId); assertEquals(1, result.size()); assertEquals("https://oss.example.com/valid.png", result.get("avatar")); @@ -188,7 +185,7 @@ class PuzzleElementFillEngineTest { PuzzleFillRuleEntity rule2 = createRule(2L, "中优先级规则", 50); PuzzleFillRuleEntity rule3 = createRule(3L, "低优先级规则", 10); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule1, rule2, rule3)); when(sourceMapper.countDistinctDevicesByFaceId(faceId)).thenReturn(4); @@ -209,7 +206,7 @@ class PuzzleElementFillEngineTest { .thenReturn("https://oss.example.com/img.jpg"); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertEquals(1, result.size()); @@ -236,7 +233,7 @@ class PuzzleElementFillEngineTest { PuzzleFillRuleEntity rule1 = createRule(1L, "规则1", 100); PuzzleFillRuleEntity rule2 = createRule(2L, "规则2", 50); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule1, rule2)); when(sourceMapper.countDistinctDevicesByFaceId(faceId)).thenReturn(4); @@ -247,7 +244,7 @@ class PuzzleElementFillEngineTest { when(conditionEvaluator.evaluate(any(), any())).thenReturn(false); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertTrue(result.isEmpty()); @@ -264,7 +261,7 @@ class PuzzleElementFillEngineTest { Long scenicId = 1L; PuzzleFillRuleEntity rule = createRule(1L, "测试规则", 100); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule)); when(sourceMapper.countDistinctDevicesByFaceId(faceId)).thenReturn(4); @@ -283,7 +280,7 @@ class PuzzleElementFillEngineTest { .thenReturn(null); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertEquals(1, result.size()); @@ -300,7 +297,7 @@ class PuzzleElementFillEngineTest { Long scenicId = 1L; PuzzleFillRuleEntity rule = createRule(1L, "测试规则", 100); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule)); when(sourceMapper.countDistinctDevicesByFaceId(faceId)).thenReturn(4); @@ -318,7 +315,7 @@ class PuzzleElementFillEngineTest { .thenReturn("https://oss.example.com/default.jpg"); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertEquals(1, result.size()); @@ -334,7 +331,7 @@ class PuzzleElementFillEngineTest { Long scenicId = 1L; PuzzleFillRuleEntity rule = createRule(1L, "空明细规则", 100); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule)); when(sourceMapper.countDistinctDevicesByFaceId(faceId)).thenReturn(4); @@ -345,7 +342,7 @@ class PuzzleElementFillEngineTest { when(itemMapper.listByRuleId(1L)).thenReturn(new ArrayList<>()); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertTrue(result.isEmpty()); @@ -359,11 +356,11 @@ class PuzzleElementFillEngineTest { Long faceId = 123L; Long scenicId = 1L; - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenThrow(new RuntimeException("Database error")); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertTrue(result.isEmpty()); @@ -386,7 +383,7 @@ class PuzzleElementFillEngineTest { rule.setConditionValue("{\"deviceIds\": [200, 300], \"matchMode\": \"ALL\"}"); rule.setEnabled(1); - when(ruleMapper.listByTemplateAndScenic(templateId, scenicId)) + when(ruleMapper.listByTemplateId(templateId)) .thenReturn(Arrays.asList(rule)); // 模拟机位数量和机位列表 @@ -409,7 +406,7 @@ class PuzzleElementFillEngineTest { .thenReturn("https://oss.example.com/device300.jpg"); // When - Map result = engine.execute(templateId, faceId, scenicId); + Map result = engine.execute(templateId, faceId); // Then assertEquals(2, result.size()); diff --git a/src/test/java/com/ycwl/basic/puzzle/fill/condition/AlwaysConditionStrategyTest.java b/src/test/java/com/ycwl/basic/puzzle/fill/condition/AlwaysConditionStrategyTest.java index d65193d6..f14dc96b 100644 --- a/src/test/java/com/ycwl/basic/puzzle/fill/condition/AlwaysConditionStrategyTest.java +++ b/src/test/java/com/ycwl/basic/puzzle/fill/condition/AlwaysConditionStrategyTest.java @@ -39,7 +39,6 @@ class AlwaysConditionStrategyTest { ConditionContext context = ConditionContext.builder() .deviceCount(4) .faceId(123L) - .scenicId(1L) .build(); // When diff --git a/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleFillRuleServiceImplTest.java b/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleFillRuleServiceImplTest.java index 878bb18d..a374afc8 100644 --- a/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleFillRuleServiceImplTest.java +++ b/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleFillRuleServiceImplTest.java @@ -264,7 +264,6 @@ class PuzzleFillRuleServiceImplTest { request.setConditionValue("{\"deviceCount\": 4}"); request.setPriority(100); request.setEnabled(1); - request.setScenicId(1L); request.setDescription("测试描述"); return request; } @@ -288,7 +287,6 @@ class PuzzleFillRuleServiceImplTest { entity.setConditionValue("{\"deviceCount\": 4}"); entity.setPriority(100); entity.setEnabled(1); - entity.setScenicId(1L); return entity; } diff --git a/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImplTest.java b/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImplTest.java index 9017478b..d77c9fc7 100644 --- a/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImplTest.java +++ b/src/test/java/com/ycwl/basic/puzzle/service/impl/PuzzleGenerateServiceImplTest.java @@ -74,7 +74,7 @@ class PuzzleGenerateServiceImplTest { when(templateMapper.getByCode("ticket")).thenReturn(template); when(elementMapper.getByTemplateId(template.getId())).thenReturn(List.of(element)); - when(fillEngine.execute(eq(template.getId()), eq(88L), eq(9L))) + when(fillEngine.execute(eq(template.getId()), eq(88L))) .thenReturn(Map.of("faceImage", "https://images.test/a.png")); when(imageRenderer.render(eq(template), anyList(), anyMap())) .thenReturn(new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB)); @@ -105,7 +105,7 @@ class PuzzleGenerateServiceImplTest { resetStorageFactory(); } - verify(fillEngine).execute(template.getId(), 88L, 9L); + verify(fillEngine).execute(template.getId(), 88L); ArgumentCaptor captor = ArgumentCaptor.forClass(com.ycwl.basic.puzzle.entity.PuzzleGenerationRecordEntity.class); verify(recordMapper).insert(captor.capture()); @@ -147,7 +147,7 @@ class PuzzleGenerateServiceImplTest { resetStorageFactory(); } - verify(fillEngine, never()).execute(anyLong(), anyLong(), anyLong()); + verify(fillEngine, never()).execute(anyLong(), anyLong()); } @SuppressWarnings("unchecked")