Forráskód Böngészése

接口开发10.10

ht 3 hete%!(EXTRA string=óta)
szülő
commit
a0cdffaca4

+ 5 - 3
src/main/java/com/malk/minglei/controller/ReplyErpController.java

@@ -2,6 +2,7 @@ package com.malk.minglei.controller;
 
 import com.malk.minglei.dto.ReplyErpRequest;
 import com.malk.minglei.service.port.ReplyErpService;
+import com.fasterxml.jackson.databind.JsonNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpStatus;
@@ -15,7 +16,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.client.RestClientException;
 
-import javax.validation.Valid;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -47,7 +47,8 @@ public class ReplyErpController {
      * @return ERP 接口原始响应内容
      */
     @PostMapping("/replyerp")
-    public ResponseEntity<Map<String, Object>> replyErp(@Valid @RequestBody ReplyErpRequest request) {
+    public ResponseEntity<Map<String, Object>> replyErp(@RequestBody JsonNode requestBody) {
+        ReplyErpRequest request = ReplyErpRequest.from(requestBody);
         return ResponseEntity.ok(replyErpService.replyErp(request));
     }
 
@@ -57,7 +58,8 @@ public class ReplyErpController {
      * @param exception 请求处理异常
      * @return 参数错误响应
      */
-    @ExceptionHandler({MethodArgumentNotValidException.class, HttpMessageNotReadableException.class})
+    @ExceptionHandler({MethodArgumentNotValidException.class, HttpMessageNotReadableException.class,
+            IllegalArgumentException.class})
     public ResponseEntity<Map<String, String>> handleInvalidRequest(Exception exception) {
         return ResponseEntity.badRequest().body(Collections.singletonMap("message", "Request validation failed"));
     }

+ 59 - 0
src/main/java/com/malk/minglei/dto/ReplyErpRequest.java

@@ -1,5 +1,6 @@
 package com.malk.minglei.dto;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
 
 import javax.validation.constraints.NotBlank;
@@ -30,6 +31,64 @@ public class ReplyErpRequest {
     private String ob1;
     private String ob2;
 
+    private ReplyErpRequest() {
+    }
+
+    /** Supports both the legacy flat body and the T100 standard envelope. */
+    public static ReplyErpRequest from(JsonNode root) {
+        if (root == null || !root.isObject()) {
+            throw new IllegalArgumentException("request body must be a JSON object");
+        }
+        JsonNode parameter = root.path("payload").path("std_data").path("parameter");
+        if (!parameter.isObject()) {
+            parameter = root;
+        }
+
+        ReplyErpRequest request = new ReplyErpRequest();
+        request.prog = text(parameter, "prog");
+        request.docno = text(parameter, "docno");
+        request.stus = text(parameter, "stus");
+        request.ref = text(parameter, "ref");
+        request.dept = text(parameter, "dept");
+        request.ob1 = text(parameter, "ob1");
+        request.ob2 = text(parameter, "ob2");
+
+        JsonNode userid = root.get("userid");
+        if (userid == null || userid.isNull()) {
+            userid = parameter.get("userid");
+        }
+        request.userid = userid == null || userid.isNull()
+                ? null
+                : userid.isArray() ? firstText(userid) : userid.asText(null);
+        request.validate();
+        return request;
+    }
+
+    private static String text(JsonNode node, String field) {
+        JsonNode value = node.get(field);
+        return value == null || value.isNull() ? null : value.asText(null);
+    }
+
+    private static String firstText(JsonNode values) {
+        for (JsonNode value : values) {
+            if (value != null && !value.isNull() && !value.asText().trim().isEmpty()) {
+                return value.asText();
+            }
+        }
+        return null;
+    }
+
+    private void validate() {
+        if (isBlank(prog) || isBlank(docno) || isBlank(userid) || isBlank(stus)
+                || !("Y".equals(stus) || "N".equals(stus))) {
+            throw new IllegalArgumentException("invalid reply ERP request");
+        }
+    }
+
+    private static boolean isBlank(String value) {
+        return value == null || value.trim().isEmpty();
+    }
+
     public String getProg() {
         return prog;
     }

+ 20 - 0
src/test/java/com/malk/minglei/controller/ReplyErpControllerTest.java

@@ -36,4 +36,24 @@ class ReplyErpControllerTest {
                         .content("{\"prog\":\"axmt500\",\"docno\":\"MLXSF260900167\",\"stus\":\"P\",\"userid\":\"210720006\"}"))
                 .andExpect(status().isBadRequest());
     }
+
+    @Test
+    void acceptsT100StandardEnvelopeAndUsesFirstUserid() throws Exception {
+        ReplyErpService service = request -> {
+            org.junit.jupiter.api.Assertions.assertEquals("asft800", request.getProg());
+            org.junit.jupiter.api.Assertions.assertEquals("DOC001", request.getDocno());
+            org.junit.jupiter.api.Assertions.assertEquals("Y", request.getStus());
+            org.junit.jupiter.api.Assertions.assertEquals("41603502201288023", request.getUserid());
+            return Collections.<String, Object>singletonMap("srvcode", "000");
+        };
+        MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new ReplyErpController(service)).build();
+
+        mockMvc.perform(post("/api/minglei/ports/replyerp")
+                        .contentType(MediaType.APPLICATION_JSON)
+                        .content("{\"type\":\"sync\",\"userid\":[\"41603502201288023\"],"
+                                + "\"payload\":{\"std_data\":{\"parameter\":{"
+                                + "\"prog\":\"asft800\",\"docno\":\"DOC001\",\"stus\":\"Y\"}}}}"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.srvcode").value("000"));
+    }
 }