Bladeren bron

feat: 客户放行申请补充财务中心一级负责人

lfx 3 dagen geleden
bovenliggende
commit
4b416944a5

+ 9 - 0
src/main/java/com/malk/minglei/service/impl/yida/CustomerReleaseFormPushHandler.java

@@ -36,6 +36,8 @@ public class CustomerReleaseFormPushHandler implements YidaFormPushHandler {
     private static final String FORM_UUID = "FORM-3BA9FE18494F4FDD85FE6ABF7DE741BAE30C";
     private static final String PROCESS_CODE = "TPROC--6TG66381N8G8Y7L9GBEEY7QVXTUY2LBBGZ7TMU";
     private static final String DEFAULT_ORIGINATOR_USER_ID = "41603502201288023";
+    // 与客户放行申请表单中“财务中心”字段的默认值保持一致。
+    private static final String DEFAULT_FINANCE_DEPARTMENT_ID = "962219827";
 
     private static final String TITLE_FIELD_ID = "textField_mtv1tgg1";
     private static final String APPLICANT_FIELD_ID = "employeeField_msh186rr";
@@ -44,6 +46,8 @@ public class CustomerReleaseFormPushHandler implements YidaFormPushHandler {
     private static final String FIRST_LEVEL_MANAGER_FIELD_ID = "employeeField_mt6thsdh";
     private static final String SECOND_LEVEL_MANAGER_FIELD_ID = "employeeField_mt6thsdi";
     private static final String THIRD_LEVEL_MANAGER_FIELD_ID = "employeeField_mt6v6alx";
+    private static final String FINANCE_DEPARTMENT_FIELD_ID = "textField_mte1kc0i";
+    private static final String FINANCE_MANAGER_FIELD_ID = "employeeField_mte1kc0g";
     private static final String APPLY_DATE_FIELD_ID = "dateField_msh186rs";
     private static final String FORM_TITLE_FIELD_ID = "textField_mspcpz92";
     private static final String RELEASE_NO_FIELD_ID = "textField_mt7zi4fy";
@@ -172,6 +176,11 @@ public class CustomerReleaseFormPushHandler implements YidaFormPushHandler {
         putIfNotBlank(formData, FIRST_LEVEL_MANAGER_FIELD_ID, toStringList(departmentConfiguration.get("firstLevelManagerUserIds"), null));
         putIfNotBlank(formData, SECOND_LEVEL_MANAGER_FIELD_ID, toStringList(departmentConfiguration.get("secondLevelManagerUserIds"), null));
         putIfNotBlank(formData, THIRD_LEVEL_MANAGER_FIELD_ID, toStringList(departmentConfiguration.get("thirdLevelManagerUserIds"), null));
+        String financeDepartmentId = defaultText(toText(formData.get(FINANCE_DEPARTMENT_FIELD_ID)), DEFAULT_FINANCE_DEPARTMENT_ID);
+        formData.put(FINANCE_DEPARTMENT_FIELD_ID, financeDepartmentId);
+        Map<String, Object> financeManagers = mingleiDocumentService.queryDepartmentManagersByDepartmentId(financeDepartmentId);
+        formData.remove(FINANCE_MANAGER_FIELD_ID);
+        putIfNotBlank(formData, FINANCE_MANAGER_FIELD_ID, toStringList(financeManagers.get("employeeField_mszdqrl8"), null));
         return formData;
     }
 

+ 87 - 8
src/test/java/com/malk/minglei/service/impl/yida/CustomerReleaseDepartmentConfigurationTest.java

@@ -30,9 +30,11 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyMap;
+import static org.mockito.ArgumentMatchers.argThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -113,6 +115,62 @@ class CustomerReleaseDepartmentConfigurationTest {
         }
     }
 
+    @Test
+    void fillsFinanceManagerUsingFinanceDepartmentDefaultInsteadOfApplicantDepartment() {
+        Map<String, Object> applicantConfiguration = Collections.<String, Object>singletonMap(
+                "employeeField_mszdqrl8_id", Collections.singletonList("applicant-manager"));
+        try (Fixture fixture = new Fixture(Collections.<String, Object>singletonMap("main_dept_id", 20L), applicantConfiguration)) {
+            fixture.financeConfiguration = new LinkedHashMap<String, Object>();
+            fixture.financeConfiguration.put("employeeField_mszdqrl8", Collections.singletonList("Finance Display Name"));
+            fixture.financeConfiguration.put("employeeField_mszdqrl8_id", Collections.singletonList("finance-manager"));
+            JSONObject form = fixture.start();
+            assertEquals("962219827", form.getString("textField_mte1kc0i"));
+            assertEquals(Collections.singletonList("finance-manager"), form.getJSONArray("employeeField_mte1kc0g"));
+            assertEquals(Collections.singletonList("applicant-manager"), form.getJSONArray("employeeField_mt6thsdh"));
+            fixture.verifyFinanceQuery("962219827");
+        }
+    }
+
+    @ParameterizedTest
+    @ValueSource(booleans = {true, false})
+    void startsNormallyWhenFinanceConfigurationOrManagerIsMissing(boolean noRecord) {
+        try (Fixture fixture = new Fixture(Collections.<String, Object>singletonMap("main_dept_id", 20L), null)) {
+            if (!noRecord) {
+                fixture.financeConfiguration = new LinkedHashMap<String, Object>();
+                fixture.financeConfiguration.put("employeeField_mszdqrl8", Collections.singletonList("Display Name Only"));
+                fixture.financeConfiguration.put("employeeField_mszdqrl8_id", Collections.emptyList());
+            }
+            JSONObject form = fixture.start();
+            assertEquals("962219827", form.getString("textField_mte1kc0i"));
+            assertFalse(form.containsKey("employeeField_mte1kc0g"));
+            fixture.verifyFinanceQuery("962219827");
+        }
+    }
+
+    @Test
+    void usesProvidedFinanceDepartmentBeforeTheDefault() {
+        try (Fixture fixture = new Fixture(Collections.<String, Object>singletonMap("main_dept_id", 20L), null)) {
+            ((ErpYidaPushMainData) fixture.request.getMainData()).setExtraField("textField_mte1kc0i", "30");
+            fixture.financeDepartmentId = "30";
+            fixture.financeConfiguration = Collections.<String, Object>singletonMap(
+                    "employeeField_mszdqrl8_id", Collections.singletonList("other-finance-manager"));
+            JSONObject form = fixture.start();
+            assertEquals("30", form.getString("textField_mte1kc0i"));
+            assertEquals(Collections.singletonList("other-finance-manager"), form.getJSONArray("employeeField_mte1kc0g"));
+            fixture.verifyFinanceQuery("30");
+        }
+    }
+
+    @Test
+    void doesNotStartWhenFinanceConfigurationQueryFails() {
+        try (Fixture fixture = new Fixture(Collections.<String, Object>singletonMap("main_dept_id", 20L), null)) {
+            when(fixture.masterDataClient.queryData(argThat((YDParam parameter) -> parameter.getSearchFieldJson().contains("962219827")),
+                    eq(YDConf.FORM_QUERY.retrieve_search_form))).thenThrow(new IllegalStateException("Finance configuration unavailable"));
+            assertThrows(IllegalStateException.class, () -> fixture.handler.push(fixture.request));
+            verify(fixture.processClient, never()).startProcess(anyMap());
+        }
+    }
+
     private static class Fixture implements AutoCloseable {
         private final YDClient masterDataClient = mock(YDClient.class);
         private final YidaProcessOpenApiClient processClient = mock(YidaProcessOpenApiClient.class);
@@ -120,6 +178,8 @@ class CustomerReleaseDepartmentConfigurationTest {
         private final AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
         private final ErpYidaPushRequest request = new ErpYidaPushRequest();
         private final CustomerReleaseFormPushHandler handler;
+        private String financeDepartmentId = "962219827";
+        private Map<String, Object> financeConfiguration;
 
         private Fixture(Map<String, Object> user, Map<String, Object> configuration) {
             DDClient dingTalkClient = mock(DDClient.class);
@@ -133,11 +193,16 @@ class CustomerReleaseDepartmentConfigurationTest {
             applications.getCoordinationOffice().setSystemToken("office-token");
             applications.getMasterData().setAppType("APP_KI0AOTH7OLFS2UAUHZXI");
             applications.getMasterData().setSystemToken("master-data-token");
-            DDR_New queryResponse = mock(DDR_New.class);
-            when(queryResponse.getRecords()).thenReturn(configuration == null ? Collections.emptyList()
-                    : Collections.singletonList(Collections.singletonMap("formData", configuration)));
             when(masterDataClient.queryData(any(YDParam.class), eq(YDConf.FORM_QUERY.retrieve_search_form)))
-                    .thenReturn(queryResponse);
+                    .thenAnswer(invocation -> {
+                        YDParam parameter = invocation.getArgument(0);
+                        String departmentId = JSONObject.parseArray(parameter.getSearchFieldJson()).getJSONObject(0).getString("value");
+                        Map<String, Object> selected = financeDepartmentId.equals(departmentId) ? financeConfiguration : configuration;
+                        DDR_New queryResponse = mock(DDR_New.class);
+                        when(queryResponse.getRecords()).thenReturn(selected == null ? Collections.emptyList()
+                                : Collections.singletonList(Collections.singletonMap("formData", selected)));
+                        return queryResponse;
+                    });
             DDR_New startResponse = new DDR_New();
             startResponse.setResult("process-1");
             when(processClient.startProcess(anyMap())).thenReturn(startResponse);
@@ -156,6 +221,7 @@ class CustomerReleaseDepartmentConfigurationTest {
             main.setExtraField("employeeField_mt6thsdh", Collections.singletonList("wrong-manager"));
             main.setExtraField("employeeField_mt6thsdi", Collections.singletonList("wrong-manager"));
             main.setExtraField("employeeField_mt6v6alx", Collections.singletonList("wrong-manager"));
+            main.setExtraField("employeeField_mte1kc0g", Collections.singletonList("wrong-finance-manager"));
             request.setType("axmt140");
             request.setOriginatorUserId("applicant-1");
             request.setGs("ERP Company");
@@ -175,10 +241,23 @@ class CustomerReleaseDepartmentConfigurationTest {
         private void verifyDepartmentQuery(String departmentId) {
             verify(contactsClient).getUserInfoById("access-token", "applicant-1");
             ArgumentCaptor<YDParam> parameter = ArgumentCaptor.forClass(YDParam.class);
-            verify(masterDataClient).queryData(parameter.capture(), eq(YDConf.FORM_QUERY.retrieve_search_form));
-            assertEquals("APP_KI0AOTH7OLFS2UAUHZXI", parameter.getValue().getAppType());
-            assertEquals("FORM-8F527F696C5B4AF7AB7A53979527FBA23USO", parameter.getValue().getFormUuid());
-            JSONObject filter = JSONObject.parseArray(parameter.getValue().getSearchFieldJson()).getJSONObject(0);
+            verify(masterDataClient, times(2)).queryData(parameter.capture(), eq(YDConf.FORM_QUERY.retrieve_search_form));
+            YDParam applicantQuery = parameter.getAllValues().get(0);
+            assertEquals("APP_KI0AOTH7OLFS2UAUHZXI", applicantQuery.getAppType());
+            assertEquals("FORM-8F527F696C5B4AF7AB7A53979527FBA23USO", applicantQuery.getFormUuid());
+            JSONObject filter = JSONObject.parseArray(applicantQuery.getSearchFieldJson()).getJSONObject(0);
+            assertEquals("textField_msztwhs2", filter.getString("key"));
+            assertEquals(departmentId, filter.getString("value"));
+            assertEquals("eq", filter.getString("operator"));
+        }
+
+        private void verifyFinanceQuery(String departmentId) {
+            ArgumentCaptor<YDParam> parameter = ArgumentCaptor.forClass(YDParam.class);
+            verify(masterDataClient, times(2)).queryData(parameter.capture(), eq(YDConf.FORM_QUERY.retrieve_search_form));
+            YDParam financeQuery = parameter.getAllValues().get(1);
+            assertEquals("APP_KI0AOTH7OLFS2UAUHZXI", financeQuery.getAppType());
+            assertEquals("FORM-8F527F696C5B4AF7AB7A53979527FBA23USO", financeQuery.getFormUuid());
+            JSONObject filter = JSONObject.parseArray(financeQuery.getSearchFieldJson()).getJSONObject(0);
             assertEquals("textField_msztwhs2", filter.getString("key"));
             assertEquals(departmentId, filter.getString("value"));
             assertEquals("eq", filter.getString("operator"));