|
|
@@ -0,0 +1,741 @@
|
|
|
+package com.malk.minglei.service.impl.dictionary;
|
|
|
+
|
|
|
+import org.junit.jupiter.api.Test;
|
|
|
+import org.mockito.ArgumentCaptor;
|
|
|
+import org.springframework.beans.factory.ObjectProvider;
|
|
|
+import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
|
|
+import org.springframework.jdbc.core.namedparam.SqlParameterSource;
|
|
|
+
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
+import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
+import static org.mockito.ArgumentMatchers.anyString;
|
|
|
+import static org.mockito.ArgumentMatchers.eq;
|
|
|
+import static org.mockito.BDDMockito.given;
|
|
|
+import static org.mockito.Mockito.mock;
|
|
|
+import static org.mockito.Mockito.verify;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 数据字典查询服务分页和筛选测试。
|
|
|
+ */
|
|
|
+class DictionaryQueryServiceImplTest {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证供应商名称模糊匹配使用默认分页,并返回总数和记录列表。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpSupplierUsesFuzzyFilterAndDefaultPage() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(125L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>singletonList(pageRow("PMAAL004", "明磊供应商")));
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "ML");
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("pmaal004", "供应商");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-supplier", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals("select count(1) from DSDATA.erp_apmt440_pmaauc_v where pmabsite = :t100id and pmaaent = :ent " +
|
|
|
+ "and pmaal004 like :pmaal004", countSql.getValue());
|
|
|
+ assertEquals("%供应商%", countParameters.getValue().getValue("pmaal004"));
|
|
|
+ assertEquals(Long.valueOf(86L), countParameters.getValue().getValue("ent"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("rownum <= :endRow"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(125L), result.get("total"));
|
|
|
+ List<Map<String, Object>> records = records(result);
|
|
|
+ assertEquals("明磊供应商", records.get(0).get("PMAAL004"));
|
|
|
+ assertEquals(null, records.get(0).get("DICTIONARY_PAGE_ROW_NUM"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证明磊包材 B9 开窗视图的关键字会匹配料件编号、中文品名和规格,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpPackagingB9WindowViewUsesKeywordAcrossThreeFieldsAndFixedPage() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(61L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "VN");
|
|
|
+ filters.put("ent", "越南");
|
|
|
+ filters.put("keyword", "电池");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-packaging-b9-window-view", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "and (imaf001 like :keyword or imaal003 like :keyword or imaal004 like :keyword)"));
|
|
|
+ assertEquals("%电池%", countParameters.getValue().getValue("keyword"));
|
|
|
+ assertEquals(Long.valueOf(60L), countParameters.getValue().getValue("ent"));
|
|
|
+
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(anyString(), pageParameters.capture());
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(61L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证包材关键字会匹配编号、名称和中文材质类型。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpPackagingMaterialUsesKeywordAcrossThreeFieldsAndFixedPage() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(4L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("keyword", "彩盒");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-packaging-material", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "and (pmaauc001 like :keyword or pmaauc002 like :keyword or case pmaauc016"));
|
|
|
+ assertEquals(Long.valueOf(86L), countParameters.getValue().getValue("ent"));
|
|
|
+ assertEquals("%彩盒%", countParameters.getValue().getValue("keyword"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("case pmaauc016 when '1' then '说明书'"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(4L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证原单价按材料编号和公司精确查询,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpMaterialOriginalPriceUsesMaterialCodeAndCompany() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(1L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("czbh", "B9-001");
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-material-original-price", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("pmaauc001 = :czbh and pmaaucent = :ent"));
|
|
|
+ assertEquals("B9-001", countParameters.getValue().getValue("czbh"));
|
|
|
+ assertEquals(Long.valueOf(86L), countParameters.getValue().getValue("ent"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("select pmaauc002, pmaauc015, pmaauc001, pmaaucent"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(1L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证料件视图可按料号或中文品名模糊筛选,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpItemViewUsesKeywordAndFixedPage() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(101L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("ent", "越南");
|
|
|
+ filters.put("keyword", "电池");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-item-view", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "and (imaa001 like :keyword or imaal003 like :keyword)"));
|
|
|
+ assertEquals(Long.valueOf(60L), countParameters.getValue().getValue("ent"));
|
|
|
+ assertEquals("%电池%", countParameters.getValue().getValue("keyword"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("select * from DSDATA.erp_apmt440_imaauc_v"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(101L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证有效料号可按料号或中文品名模糊筛选,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpActiveItemUsesKeywordAcrossItemCodeAndName() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(11L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("keyword", "B9");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-active-item", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "and (imaa001 like :keyword or imaal003 like :keyword)"));
|
|
|
+ assertEquals("%B9%", countParameters.getValue().getValue("keyword"));
|
|
|
+
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(anyString(), pageParameters.capture());
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(11L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证销售订单开窗按据点和订单号模糊查询明磊公司已审核的未交订单,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpSalesOrderUsesSiteAndFixedPage() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(12L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "ML");
|
|
|
+ filters.put("keyword", "SO-001");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-sales-order", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("select distinct xmdasite, xmdadocno"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("where xmdaent = 86 and xmdasite = :t100id"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("and xmdastus = 'Y'"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("and xmdadocno like :keyword"));
|
|
|
+ assertEquals("ML", countParameters.getValue().getValue("t100id"));
|
|
|
+ assertEquals("%SO-001%", countParameters.getValue().getValue("keyword"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("to_char(xmdadocdt, 'yyyy-mm-dd') xmdadocdt"));
|
|
|
+ assertEquals(true, pageSql.getValue().contains("left join DSDATA.ooff_t"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(12L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证生产令开窗按据点和逗号分隔的拥有者权限查询,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpProductionOrderUsesSiteAndOwnerPermissions() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(8L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "ML");
|
|
|
+ filters.put("qx", "OWNER-A, OWNER-B");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-production-order", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("and xmdaownid in (:qx)"));
|
|
|
+ assertEquals("ML", countParameters.getValue().getValue("t100id"));
|
|
|
+ assertEquals(Arrays.asList("OWNER-A", "OWNER-B"), countParameters.getValue().getValue("qx"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("select distinct xmdasite, xmdadocno"));
|
|
|
+ assertEquals(true, pageSql.getValue().contains("and xmdastus = 'Y' and xmdaownid in (:qx)"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(8L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证禁用供应商视图使用据点和公司参数,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpSupplierDisabledUsesSiteAndCompany() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(5L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "ML");
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("keyword", "供应商");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-supplier-disabled", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("DSDATA.ERP_APMT440_PMAAUC_N"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("and pmaal004 like :keyword"));
|
|
|
+ assertEquals("ML", countParameters.getValue().getValue("t100id"));
|
|
|
+ assertEquals(Long.valueOf(86L), countParameters.getValue().getValue("ent"));
|
|
|
+ assertEquals("%供应商%", countParameters.getValue().getValue("keyword"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(5L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证固定条件的有效料号和范本料号字典均可按默认分页查询。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryFixedViewDictionariesUseConfiguredSql() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(1L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+
|
|
|
+ service.query("erp-active-item", Collections.<String, String>emptyMap());
|
|
|
+ Map<String, Object> result = service.query("erp-template-item", Collections.<String, String>emptyMap());
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ verify(jdbcTemplate, org.mockito.Mockito.times(2))
|
|
|
+ .queryForObject(countSql.capture(), any(SqlParameterSource.class), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getAllValues().get(0).contains("imafsite = 'ML'"));
|
|
|
+ assertEquals(true, countSql.getAllValues().get(1).contains("left join DSDATA.imaal_t"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证范本料号可按料号或中文品名模糊筛选。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpTemplateItemUsesKeywordAcrossItemCodeAndName() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(2L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("keyword", "B9");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-template-item", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "and (imaa001 like :keyword or imaal003 like :keyword)"));
|
|
|
+ assertEquals("%B9%", countParameters.getValue().getValue("keyword"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(2L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证范本料号订单查询将料号参数绑定为前缀匹配值。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpTemplateOrdersUsesItemPrefix() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(7L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("bgfblh", "B9");
|
|
|
+ filters.put("keyword", "SO-001");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-template-orders", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("xmdcsite = 'ML' and xmdc001 like :bgfblh"));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "xmdc001 like :bgfblh and xmdadocno like :keyword)"));
|
|
|
+ assertEquals("B9%", countParameters.getValue().getValue("bgfblh"));
|
|
|
+ assertEquals("%SO-001%", countParameters.getValue().getValue("keyword"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(7L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证料号上次价格查询使用宜搭主表与子表字段,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpLastPriceUsesFormItemAndDetailItemCode() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(1L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("main.pmdi004", "SUP-001");
|
|
|
+ filters.put("detail_1.ljbh", "B9-001");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-last-price", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("t1.pmdi004 = :mainPmdi004"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("t1.pmdj002 = :detail1Ljbh"));
|
|
|
+ assertEquals("SUP-001", countParameters.getValue().getValue("mainPmdi004"));
|
|
|
+ assertEquals("B9-001", countParameters.getValue().getValue("detail1Ljbh"));
|
|
|
+
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(anyString(), pageParameters.capture());
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(1L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证已审核未发齐出通单按公司、据点和出通单项次精确查询,并固定返回前 100 条记录。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpUnfulfilledOrderUsesCompanyAndSite() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(6L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("site", "ML");
|
|
|
+ filters.put("keyword", "MLCT6261023002-1");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-unfulfilled-order", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("from DSDATA.xmdg_t"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("inner join DSDATA.xmda_t"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("inner join DSDATA.xmdc_t"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("inner join DSDATA.imaal_t"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("inner join DSDATA.pmaal_t"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("xmda_t.xmdasite = xmdc_t.xmdcsite"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("xmdg_t.xmdgent = :ent and xmdg_t.xmdgsite = :site"));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "xmdg_t.xmdgdocno || '-' || to_char(xmdh_t.xmdhseq) = :keyword"));
|
|
|
+ assertEquals(Long.valueOf(86L), countParameters.getValue().getValue("ent"));
|
|
|
+ assertEquals("ML", countParameters.getValue().getValue("site"));
|
|
|
+ assertEquals("MLCT6261023002-1", countParameters.getValue().getValue("keyword"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("xmdg_t.xmdgdocno, xmdh_t.xmdhseq, xmda_t.xmda048"));
|
|
|
+ assertEquals(true, pageSql.getValue().contains("xmdg_t.xmdg005, pmaal_t.pmaal003"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(6L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证出通单列表按公司、据点和指定出通状态查询,并可按出通单号模糊筛选。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpDeliveryOrderUsesCompanySiteAndDeliveryStatuses() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(8L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("site", "ML");
|
|
|
+ filters.put("keyword", "110001-1");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-delivery-order", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("xmdg_t.xmdgstus in ('Y', 'H', 'N')"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("xmdg_t.xmdgsite = :site and xmdg_t.xmdgent = :ent"));
|
|
|
+ assertEquals(true, countSql.getValue().contains(
|
|
|
+ "and (xmdg_t.xmdgdocno || '-' || to_char(xmdh_t.xmdhseq)) like :keyword"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("left join DSDATA.xmdc_t"));
|
|
|
+ assertEquals(Long.valueOf(86L), countParameters.getValue().getValue("ent"));
|
|
|
+ assertEquals("ML", countParameters.getValue().getValue("site"));
|
|
|
+ assertEquals("%110001-1%", countParameters.getValue().getValue("keyword"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("case when xmdc_t.xmdc019 = '9' then '样品' else '一般' end xmdc019"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(8L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证委外采购单开窗使用表单采购单号,并固定限定明磊公司与 ML 据点。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpOutsourcedPurchaseOrderWindowUsesPurchaseOrderNumberAndFixedPage() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(3L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("formtable_main_158_dt1_wwcgdh", "WWCG-001");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-outsourced-purchase-order-window", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("pmdp_t.pmdpent = 86 and pmdp_t.pmdpsite = 'ML'"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("left join DSDATA.sfaa_t"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("sfaa_t.sfaadocno = pmdp_t.pmdp003"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("pmdp_t.pmdpdocno = :formtable_main_158_dt1_wwcgdh"));
|
|
|
+ assertEquals("WWCG-001", countParameters.getValue().getValue("formtable_main_158_dt1_wwcgdh"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("select pmdp_t.pmdpseq, pmdp_t.pmdp003, pmdp_t.pmdp001"));
|
|
|
+ assertEquals(true, pageSql.getValue().contains("sfaa_t.sfaaud009"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(3L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证委外采购对应工单备料使用采购单号与采购项次,并固定限定明磊公司与 ML 据点。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpOutsourcedBomUsesPurchaseOrderAndSequence() {
|
|
|
+ ObjectProvider<NamedParameterJdbcTemplate> jdbcTemplateProvider = mock(ObjectProvider.class);
|
|
|
+ NamedParameterJdbcTemplate jdbcTemplate = mock(NamedParameterJdbcTemplate.class);
|
|
|
+ given(jdbcTemplateProvider.getIfAvailable()).willReturn(jdbcTemplate);
|
|
|
+ given(jdbcTemplate.queryForObject(anyString(), any(SqlParameterSource.class), eq(Long.class)))
|
|
|
+ .willReturn(Long.valueOf(2L));
|
|
|
+ given(jdbcTemplate.queryForList(anyString(), any(SqlParameterSource.class)))
|
|
|
+ .willReturn(Collections.<Map<String, Object>>emptyList());
|
|
|
+
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(jdbcTemplateProvider);
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("formtable_main_158_dt1_wwcgdh", "WWCG-001");
|
|
|
+ filters.put("formtable_main_158_dt1_cgxc", "10");
|
|
|
+
|
|
|
+ Map<String, Object> result = service.query("erp-outsourced-bom", filters);
|
|
|
+
|
|
|
+ ArgumentCaptor<String> countSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> countParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForObject(countSql.capture(), countParameters.capture(), eq(Long.class));
|
|
|
+ assertEquals(true, countSql.getValue().contains("pmdpent = 86 and pmdpsite = 'ML'"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("pmdpdocno = :formtable_main_158_dt1_wwcgdh"));
|
|
|
+ assertEquals(true, countSql.getValue().contains("pmdpseq = :formtable_main_158_dt1_cgxc"));
|
|
|
+ assertEquals("WWCG-001", countParameters.getValue().getValue("formtable_main_158_dt1_wwcgdh"));
|
|
|
+ assertEquals("10", countParameters.getValue().getValue("formtable_main_158_dt1_cgxc"));
|
|
|
+
|
|
|
+ ArgumentCaptor<String> pageSql = ArgumentCaptor.forClass(String.class);
|
|
|
+ ArgumentCaptor<SqlParameterSource> pageParameters = ArgumentCaptor.forClass(SqlParameterSource.class);
|
|
|
+ verify(jdbcTemplate).queryForList(pageSql.capture(), pageParameters.capture());
|
|
|
+ assertEquals(true, pageSql.getValue().contains("select sfba006, imaal003, imaal004, sfba013"));
|
|
|
+ assertEquals(Long.valueOf(0L), pageParameters.getValue().getValue("offset"));
|
|
|
+ assertEquals(Long.valueOf(100L), pageParameters.getValue().getValue("endRow"));
|
|
|
+ assertEquals(1, result.get("page"));
|
|
|
+ assertEquals(100, result.get("pageSize"));
|
|
|
+ assertEquals(Long.valueOf(2L), result.get("total"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证数据字典不接受调用方传入的分页参数。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryRejectsPageSizeFilter() {
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(mock(ObjectProvider.class));
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "ML");
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("pageSize", "100");
|
|
|
+
|
|
|
+ IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
|
|
|
+ () -> service.query("erp-supplier", filters));
|
|
|
+
|
|
|
+ assertEquals("Unsupported filter for erp-supplier: pageSize", exception.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证已删除的封存单字典编码不会触发任意数据库查询。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryRejectsRemovedErpArchiveOrderDictionaryCode() {
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(mock(ObjectProvider.class));
|
|
|
+ String removedDictionaryCode = "erp-archive-order";
|
|
|
+
|
|
|
+ IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
|
|
|
+ () -> service.query(removedDictionaryCode, Collections.<String, String>emptyMap()));
|
|
|
+
|
|
|
+ assertEquals("dictionaryCode is not registered: " + removedDictionaryCode, exception.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证旧的长字典编码不保留兼容路由,避免调用方继续依赖已废弃路径。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryRejectsLegacyOutsourcedBomDictionaryCode() {
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(mock(ObjectProvider.class));
|
|
|
+ String legacyDictionaryCode = "erp-outsourced-purchase-work-order-material-window";
|
|
|
+
|
|
|
+ IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
|
|
|
+ () -> service.query(legacyDictionaryCode, Collections.<String, String>emptyMap()));
|
|
|
+
|
|
|
+ assertEquals("dictionaryCode is not registered: " + legacyDictionaryCode, exception.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 验证未声明的筛选条件不会进入供应商视图 SQL。
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void queryErpSupplierRejectsUnsupportedFilter() {
|
|
|
+ DictionaryQueryServiceImpl service = new DictionaryQueryServiceImpl(mock(ObjectProvider.class));
|
|
|
+ Map<String, String> filters = new LinkedHashMap<String, String>();
|
|
|
+ filters.put("t100id", "ML");
|
|
|
+ filters.put("ent", "明磊");
|
|
|
+ filters.put("supplierCode", "SUP-001");
|
|
|
+
|
|
|
+ IllegalArgumentException exception = assertThrows(IllegalArgumentException.class,
|
|
|
+ () -> service.query("erp-supplier", filters));
|
|
|
+
|
|
|
+ assertEquals("Unsupported filter for erp-supplier: supplierCode", exception.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ private List<Map<String, Object>> records(Map<String, Object> result) {
|
|
|
+ return (List<Map<String, Object>>) result.get("records");
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> pageRow(String columnName, Object value) {
|
|
|
+ Map<String, Object> row = new LinkedHashMap<String, Object>();
|
|
|
+ row.put(columnName, value);
|
|
|
+ row.put("DICTIONARY_PAGE_ROW_NUM", Long.valueOf(1L));
|
|
|
+ return row;
|
|
|
+ }
|
|
|
+}
|