Pārlūkot izejas kodu

fix: 包材和供应商暂停改用 DingTalk To T100,停用状态改为 2

Co-authored-by: Cursor <cursoragent@cursor.com>
admin 4 dienas atpakaļ
vecāks
revīzija
35534b733c

+ 28 - 10
src/main/java/com/malk/minglei/service/impl/port/MingleiPortServiceImpl.java

@@ -34,7 +34,8 @@ public class MingleiPortServiceImpl implements MingleiPortService {
     private static final String HOST_ACCOUNT = "tiptop";
     private static final String HOST_TIMESTAMP = "20260807164700004";
     private static final String SERVICE_PRODUCT = "T100";
-    private static final String SERVICE_NAME = "ProcurementApprovalPrice";
+    static final String SUPPLIER_PRICE_APPROVAL_SERVICE_NAME = "ProcurementApprovalPrice";
+    static final String DINGTALK_TO_T100_SERVICE_NAME = "DingTalk To T100";
 
     private final RestTemplate restTemplate;
     private final MingleiPortProperties properties;
@@ -58,11 +59,11 @@ public class MingleiPortServiceImpl implements MingleiPortService {
         Map<String, Object> parameter = new LinkedHashMap<String, Object>();
         parameter.put("head", request.getHead());
         parameter.put("detail", request.getDetail());
-        return submitDocument(parameter, null);
+        return submitDocument(parameter, null, SUPPLIER_PRICE_APPROVAL_SERVICE_NAME);
     }
 
     /**
-     * 提交除供应商核价单外的通用 T100 单据。
+     * 提交除供应商核价单外的通用 T100 单据,服务名沿用供应商价格审批单。
      *
      * @param parameter T100 标准报文中的 parameter 内容
      * @param dataKeyType T100 datakey.type 单据类型
@@ -70,25 +71,40 @@ public class MingleiPortServiceImpl implements MingleiPortService {
      */
     @Override
     public Map<String, Object> submitT100Document(Map<String, Object> parameter, String dataKeyType) {
+        return submitT100Document(parameter, dataKeyType, SUPPLIER_PRICE_APPROVAL_SERVICE_NAME);
+    }
+
+    /**
+     * 提交指定服务名的 T100 单据。包材材质核价、包材料号清单和供应商暂停/退出使用 DingTalk To T100。
+     *
+     * @param parameter T100 标准报文中的 parameter 内容
+     * @param dataKeyType T100 datakey.type 单据类型
+     * @param serviceName T100 service.name
+     * @return 外部接口原始响应体
+     */
+    @Override
+    public Map<String, Object> submitT100Document(Map<String, Object> parameter, String dataKeyType, String serviceName) {
         if (parameter == null) {
             throw new IllegalArgumentException("T100 parameter must not be null");
         }
         require(dataKeyType, "T100 datakey.type must not be blank");
-        return submitDocument(parameter, dataKeyType);
+        require(serviceName, "T100 service.name must not be blank");
+        return submitDocument(parameter, dataKeyType, serviceName);
     }
 
-    private Map<String, Object> submitDocument(Map<String, Object> parameter, String dataKeyType) {
+    private Map<String, Object> submitDocument(Map<String, Object> parameter, String dataKeyType, String serviceName) {
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
         headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
 
         validateConfiguration();
-        LOGGER.info("Submitting T100 document dataKeyType={} parameterKeys={}", dataKeyType, parameter.keySet());
+        LOGGER.info("Submitting T100 document dataKeyType={} serviceName={} parameterKeys={}",
+                dataKeyType, serviceName, parameter.keySet());
 
         ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
                 properties.getSupplierPriceApprovalUrl(),
                 HttpMethod.POST,
-                new HttpEntity<Map<String, Object>>(createExternalRequest(parameter, dataKeyType), headers),
+                new HttpEntity<Map<String, Object>>(createExternalRequest(parameter, dataKeyType, serviceName), headers),
                 new ParameterizedTypeReference<Map<String, Object>>() {
                 });
         return response.getBody() == null ? Collections.<String, Object>emptyMap() : response.getBody();
@@ -97,10 +113,12 @@ public class MingleiPortServiceImpl implements MingleiPortService {
     /**
      * 使用固定的外层协议字段组装外部接口请求,仅透传调用方提供的 head 和 detail。
      *
-     * @param request 本地精简请求体
+     * @param parameter T100 标准报文中的 parameter 内容
+     * @param dataKeyType T100 datakey.type 单据类型
+     * @param serviceName T100 service.name
      * @return 外部接口完整请求体
      */
-    private Map<String, Object> createExternalRequest(Map<String, Object> parameter, String dataKeyType) {
+    private Map<String, Object> createExternalRequest(Map<String, Object> parameter, String dataKeyType, String serviceName) {
         Map<String, Object> host = new LinkedHashMap<String, Object>();
         host.put("prod", HOST_PRODUCT);
         host.put("ip", HOST_IP);
@@ -110,7 +128,7 @@ public class MingleiPortServiceImpl implements MingleiPortService {
 
         Map<String, Object> service = new LinkedHashMap<String, Object>();
         service.put("prod", SERVICE_PRODUCT);
-        service.put("name", SERVICE_NAME);
+        service.put("name", serviceName);
         service.put("ip", HOST_IP);
         service.put("id", erpT100Properties.getRequest().getServiceId());
 

+ 18 - 5
src/main/java/com/malk/minglei/service/impl/port/SupplierPriceApprovalProcessServiceImpl.java

@@ -213,10 +213,11 @@ public class SupplierPriceApprovalProcessServiceImpl implements SupplierPriceApp
         }
 
         Map<String, Object> parameter = toAdditionalT100Parameter(requestedFormId, components);
-        LOGGER.info("Submitting T100 document from formId={} formInstanceId={} processInstanceId={} dataKeyType={}",
-                requestedFormId, requestedFormInstanceId, processInstanceId, dataKeyType);
+        String serviceName = resolveServiceName(requestedFormId);
+        LOGGER.info("Submitting T100 document from formId={} formInstanceId={} processInstanceId={} dataKeyType={} serviceName={}",
+                requestedFormId, requestedFormInstanceId, processInstanceId, dataKeyType, serviceName);
         try {
-            return mingleiPortService.submitT100Document(parameter, dataKeyType);
+            return mingleiPortService.submitT100Document(parameter, dataKeyType, serviceName);
         } catch (RestClientException exception) {
             logExternalFailure("T100_DOCUMENT_PUSH", requestedFormId, requestedFormInstanceId, exception);
             throw exception;
@@ -501,14 +502,14 @@ public class SupplierPriceApprovalProcessServiceImpl implements SupplierPriceApp
     }
 
     /**
-     * T100 使用数字标记供应商状态,避免将宜搭选项文本直接写入状态字段。
+     * T100 变更类型:正常供应商为 1,停用为 2。
      */
     private String toT100SupplierStatus(String status) {
         if ("正常供应商".equals(status)) {
             return "1";
         }
         if ("停用".equals(status)) {
-            return "0";
+            return "2";
         }
         throw new IllegalArgumentException("Unsupported supplier status: " + status);
     }
@@ -831,6 +832,18 @@ public class SupplierPriceApprovalProcessServiceImpl implements SupplierPriceApp
         return null;
     }
 
+    /**
+     * 包材材质核价、包材料号清单和供应商暂停/退出走 DingTalk To T100,其余单据仍走供应商价格审批服务名。
+     */
+    private String resolveServiceName(String formId) {
+        if (PACKAGING_MATERIAL_PRICE_APPROVAL_FORM_ID.equals(formId)
+                || PACKAGING_MATERIAL_ITEM_LIST_FORM_ID.equals(formId)
+                || SUPPLIER_SUSPEND_EXIT_FORM_ID.equals(formId)) {
+            return MingleiPortServiceImpl.DINGTALK_TO_T100_SERVICE_NAME;
+        }
+        return MingleiPortServiceImpl.SUPPLIER_PRICE_APPROVAL_SERVICE_NAME;
+    }
+
     private Map<?, ?> requireMap(Object value, String message) {
         Map<?, ?> map = asMap(value);
         if (map == null) {

+ 10 - 0
src/main/java/com/malk/minglei/service/port/MingleiPortService.java

@@ -25,4 +25,14 @@ public interface MingleiPortService {
      * @return 外部接口原始响应体
      */
     Map<String, Object> submitT100Document(Map<String, Object> parameter, String dataKeyType);
+
+    /**
+     * 将指定类型的 T100 单据参数提交至外部接口,并使用调用方指定的服务名。
+     *
+     * @param parameter T100 标准报文中的 parameter 内容
+     * @param dataKeyType T100 datakey.type 单据类型
+     * @param serviceName T100 service.name
+     * @return 外部接口原始响应体
+     */
+    Map<String, Object> submitT100Document(Map<String, Object> parameter, String dataKeyType, String serviceName);
 }

+ 1 - 0
src/main/resources/application.yml

@@ -43,6 +43,7 @@ minglei:
     enterprise-private-key: ${MINGLEI_BANKING_ENTERPRISE_PRIVATE_KEY:MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgffvSW7BkE9MSvfXIdEyAtSrecDzkECtwoaymGZjyQGugCgYIKoEcz1UBgi2hRANCAATjayFlLuOhGVerrwFTitrTbXUBd6URu2/PBJ4yMoGuwJ7vLliHkhSkp9xXnTpxF7T/MZUH3irBMALoRHXLaUFq}
     connect-timeout-millis: ${MINGLEI_BANKING_CONNECT_TIMEOUT_MILLIS:10000}
     read-timeout-millis: ${MINGLEI_BANKING_READ_TIMEOUT_MILLIS:30000}
+  port:
     supplier-price-approval-key: ${MINGLEI_SUPPLIER_PRICE_APPROVAL_KEY:f5458f5c0f9022db743a7c0710145903}
   reply-erp:
     key: ${MINGLEI_REPLY_ERP_KEY:f5458f5c0f9022db743a7c0710145903}

+ 16 - 0
src/test/java/com/malk/minglei/service/impl/port/MingleiPortServiceImplTest.java

@@ -10,6 +10,8 @@ import org.springframework.http.MediaType;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
 
+import java.util.Collections;
+import java.util.LinkedHashMap;
 import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -50,6 +52,20 @@ class MingleiPortServiceImplTest {
         server.verify();
     }
 
+    @Test
+    void submitT100DocumentUsesDingTalkServiceName() {
+        server.expect(requestTo("http://external.example/wtoptst/ws/r/awsp920"))
+                .andExpect(method(org.springframework.http.HttpMethod.POST))
+                .andExpect(content().json("{\"service\":{\"name\":\"DingTalk To T100\"},\"datakey\":{\"type\":\"priceSheets\"}}", false))
+                .andRespond(withSuccess("{}", MediaType.APPLICATION_JSON));
+
+        Map<String, Object> parameter = new LinkedHashMap<String, Object>();
+        parameter.put("head", Collections.singletonMap("pmaaucent", "86"));
+        mingleiPortService.submitT100Document(parameter, "priceSheets", "DingTalk To T100");
+
+        server.verify();
+    }
+
     private MingleiPortRequest readRequest() throws Exception {
         return objectMapper.readValue(localRequestJson(), MingleiPortRequest.class);
     }

+ 44 - 4
src/test/java/com/malk/minglei/service/impl/port/SupplierPriceApprovalProcessServiceImplTest.java

@@ -57,12 +57,14 @@ class SupplierPriceApprovalProcessServiceImplTest {
         given(yidaFormInstanceClient.getFormInstance(PACKAGING_MATERIAL_ITEM_LIST_FORM_ID, "process-instance-1"))
                 .willReturn(processInstance());
         given(mingleiPortService.submitT100Document(org.mockito.ArgumentMatchers.<Map<String, Object>>any(),
-                eq("partNumberListAudit"))).willReturn(Collections.<String, Object>singletonMap("srvcode", "100"));
+                eq("partNumberListAudit"), eq("DingTalk To T100")))
+                .willReturn(Collections.<String, Object>singletonMap("srvcode", "100"));
 
         service.submitByProcessInstanceId(PACKAGING_MATERIAL_ITEM_LIST_FORM_ID, "process-instance-1");
 
         ArgumentCaptor<Map<String, Object>> parameterCaptor = ArgumentCaptor.forClass(Map.class);
-        verify(mingleiPortService).submitT100Document(parameterCaptor.capture(), eq("partNumberListAudit"));
+        verify(mingleiPortService).submitT100Document(parameterCaptor.capture(), eq("partNumberListAudit"),
+                eq("DingTalk To T100"));
         Map<?, ?> head = (Map<?, ?>) parameterCaptor.getValue().get("head");
         List<?> details = (List<?>) head.get("detail");
         Map<?, ?> detail = (Map<?, ?>) details.get(0);
@@ -192,17 +194,55 @@ class SupplierPriceApprovalProcessServiceImplTest {
         instance.put("formData", formData);
         given(yidaFormInstanceClient.getFormInstance(formId, "form-instance-001")).willReturn(instance);
         given(mingleiPortService.submitT100Document(org.mockito.ArgumentMatchers.<Map<String, Object>>any(),
-                eq("suspensionExit"))).willReturn(Collections.<String, Object>singletonMap("srvcode", "000"));
+                eq("suspensionExit"), eq("DingTalk To T100")))
+                .willReturn(Collections.<String, Object>singletonMap("srvcode", "000"));
 
         service.submitByInstanceIds(formId, "form-instance-001", null);
 
         ArgumentCaptor<Map<String, Object>> parameterCaptor = ArgumentCaptor.forClass(Map.class);
-        verify(mingleiPortService).submitT100Document(parameterCaptor.capture(), eq("suspensionExit"));
+        verify(mingleiPortService).submitT100Document(parameterCaptor.capture(), eq("suspensionExit"),
+                eq("DingTalk To T100"));
         Map<?, ?> head = (Map<?, ?>) parameterCaptor.getValue().get("head");
+        Map<?, ?> detail = (Map<?, ?>) parameterCaptor.getValue().get("detail");
         assertEquals("{supplier-code", head.get("pmaa001"));
+        assertEquals("1", head.get("pmaa083"));
+        assertEquals("1", detail.get("pmab074"));
         verifyNoInteractions(yidaProcessOpenApiClient);
     }
 
+    @Test
+    void mapsSuspendedSupplierStatusToTwo() {
+        String formId = "FORM-0A05D30C6E0745EC9F4B74D0E038EE73O7B6";
+        YidaFormInstanceClient yidaFormInstanceClient = mock(YidaFormInstanceClient.class);
+        MingleiPortService mingleiPortService = mock(MingleiPortService.class);
+        SupplierPriceApprovalProcessServiceImpl service = new SupplierPriceApprovalProcessServiceImpl(
+                yidaFormInstanceClient, mock(YidaProcessOpenApiClient.class), applications(), mingleiPortService,
+                mock(EmployeeRosterService.class), new ObjectMapper());
+
+        Map<String, Object> formData = new LinkedHashMap<String, Object>();
+        formData.put("selectField_mt82p09c", "停用");
+        formData.put("textField_mvgepmw0", "SUP-001");
+        formData.put("textField_mvewj97z", "明磊");
+        formData.put("textField_mvewj980", "ML");
+        Map<String, Object> instance = new LinkedHashMap<String, Object>();
+        instance.put("formUuid", formId);
+        instance.put("formData", formData);
+        given(yidaFormInstanceClient.getFormInstance(formId, "form-instance-002")).willReturn(instance);
+        given(mingleiPortService.submitT100Document(org.mockito.ArgumentMatchers.<Map<String, Object>>any(),
+                eq("suspensionExit"), eq("DingTalk To T100")))
+                .willReturn(Collections.<String, Object>singletonMap("srvcode", "000"));
+
+        service.submitByInstanceIds(formId, "form-instance-002", null);
+
+        ArgumentCaptor<Map<String, Object>> parameterCaptor = ArgumentCaptor.forClass(Map.class);
+        verify(mingleiPortService).submitT100Document(parameterCaptor.capture(), eq("suspensionExit"),
+                eq("DingTalk To T100"));
+        Map<?, ?> head = (Map<?, ?>) parameterCaptor.getValue().get("head");
+        Map<?, ?> detail = (Map<?, ?>) parameterCaptor.getValue().get("detail");
+        assertEquals("2", head.get("pmaa083"));
+        assertEquals("2", detail.get("pmab074"));
+    }
+
     /**
      * T100 实际直返 payload 时,执行状态码为 0 也必须触发宜搭单号回写。
      */