3 Коміти 127513d951 ... 202c6a45f1

Автор SHA1 Опис Дата
  lfx 202c6a45f1 Merge remote-tracking branch 'origin/master' 1 місяць тому
  lfx e66008fc46 feat: 优化客户查询体验 1 місяць тому
  lfx 919f17a74a feat: 完善客户信息查询 1 місяць тому

+ 16 - 4
mjava-ts/src/main/java/com/malk/taisen/controller/CustomerInfoController.java

@@ -1,6 +1,7 @@
 package com.malk.taisen.controller;
 
 import com.malk.taisen.service.sap.SapCustomerService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -15,6 +16,7 @@ import java.util.Map;
  * Customer information query API for the Yida customer query page.
  */
 @RestController
+@Slf4j
 @RequestMapping("/customer-info")
 public class CustomerInfoController {
 
@@ -24,23 +26,33 @@ public class CustomerInfoController {
     /**
      * Query customer balance.
      *
-     * @param body CUSTOMER_NUMBER and optional CUSTOMER_NAME
+     * @param body requestID, CUSTOMER_NUMBER and optional CUSTOMER_NAME
      * @return SAP balance response or mock response while SAP URL is unconfigured
      */
     @PostMapping("/balance")
     public Map queryBalance(@RequestBody Map body) {
-        return sapCustomerService.queryBalance(customerNumber(body), stringValue(body.get("CUSTOMER_NAME")));
+        log.info("客户余额查询请求: {}", body);
+        return sapCustomerService.queryBalance(requestId(body), customerNumber(body), stringValue(body.get("CUSTOMER_NAME")));
     }
 
     /**
      * Query payment-unlocked sales orders.
      *
-     * @param body CUSTOMER_NUMBER and optional CUSTOMER_NAME
+     * @param body requestID, CUSTOMER_NUMBER and optional CUSTOMER_NAME
      * @return SAP unlocked order response or mock response while SAP URL is unconfigured
      */
     @PostMapping("/unlock-orders")
     public Map queryUnlockOrders(@RequestBody Map body) {
-        return sapCustomerService.queryUnlockOrders(customerNumber(body), stringValue(body.get("CUSTOMER_NAME")));
+        log.info("收款解锁订单查询请求: {}", body);
+        return sapCustomerService.queryUnlockOrders(requestId(body), customerNumber(body), stringValue(body.get("CUSTOMER_NAME")));
+    }
+
+    private String requestId(Map body) {
+        String requestId = stringValue(body == null ? null : body.get("requestID"));
+        if (StringUtils.isBlank(requestId)) {
+            throw new IllegalArgumentException("requestID不能为空");
+        }
+        return requestId;
     }
 
     private String customerNumber(Map body) {

+ 4 - 2
mjava-ts/src/main/java/com/malk/taisen/service/sap/SapCustomerClient.java

@@ -10,18 +10,20 @@ public interface SapCustomerClient {
     /**
      * Query customer balance by customer number.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @return raw SAP response
      * @apiNote SAP interface URL pending confirmation
      */
-    Map queryBalance(String customerNumber);
+    Map queryBalance(String requestId, String customerNumber);
 
     /**
      * Query customer payment-unlocked sales orders by customer number.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @return raw SAP response
      * @apiNote SAP interface URL pending confirmation
      */
-    Map queryUnlockOrders(String customerNumber);
+    Map queryUnlockOrders(String requestId, String customerNumber);
 }

+ 4 - 2
mjava-ts/src/main/java/com/malk/taisen/service/sap/SapCustomerService.java

@@ -10,18 +10,20 @@ public interface SapCustomerService {
     /**
      * Query balance, or return mock data until the SAP URL is configured.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @param customerName selected customer name
      * @return customer balance response
      */
-    Map queryBalance(String customerNumber, String customerName);
+    Map queryBalance(String requestId, String customerNumber, String customerName);
 
     /**
      * Query payment-unlocked orders, or return mock data until the SAP URL is configured.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @param customerName selected customer name
      * @return unlocked sales order response
      */
-    Map queryUnlockOrders(String customerNumber, String customerName);
+    Map queryUnlockOrders(String requestId, String customerNumber, String customerName);
 }

+ 66 - 12
mjava-ts/src/main/java/com/malk/taisen/service/sap/impl/SapCustomerClientImpl.java

@@ -1,8 +1,10 @@
 package com.malk.taisen.service.sap.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.malk.taisen.service.sap.SapCustomerClient;
 import com.malk.utils.UtilHttp;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
@@ -14,48 +16,100 @@ import java.util.Map;
  * SAP customer information atomic HTTP client.
  */
 @Component
+@Slf4j
 public class SapCustomerClientImpl implements SapCustomerClient {
 
-    @Value("${sap.customer-balance-url:}")
-    private String customerBalanceUrl;
-    @Value("${sap.customer-unlock-order-url:}")
-    private String customerUnlockOrderUrl;
+    @Value("${sap.customer-inquiry-url:}")
+    private String customerInquiryUrl;
+    @Value("${sap.customer-inquiry-token:}")
+    private String customerInquiryToken;
 
     /**
      * Query customer balance.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @return raw SAP response
      * @apiNote SAP interface URL pending confirmation
      */
     @Override
-    public Map queryBalance(String customerNumber) {
-        return query(customerBalanceUrl, customerNumber);
+    public Map queryBalance(String requestId, String customerNumber) {
+        return query("OTC002", requestId, customerNumber);
     }
 
     /**
      * Query customer payment-unlocked sales orders.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @return raw SAP response
      * @apiNote SAP interface URL pending confirmation
      */
     @Override
-    public Map queryUnlockOrders(String customerNumber) {
-        return query(customerUnlockOrderUrl, customerNumber);
+    public Map queryUnlockOrders(String requestId, String customerNumber) {
+        return query("OTC004", requestId, customerNumber);
     }
 
-    private Map query(String url, String customerNumber) {
-        if (StringUtils.isBlank(url)) {
+    private Map query(String interfaceNo, String requestId, String customerNumber) {
+        if (StringUtils.isBlank(customerInquiryUrl)) {
             return null;
         }
+        Map<String, Object> param = new HashMap<>();
+        param.put("bearer_token", customerInquiryToken);
+        param.put("interface_no", interfaceNo);
+        param.put("requestID", requestId);
         Map<String, Object> body = new HashMap<>();
         body.put("CUSTOMER_NUMBER", customerNumber);
-        String response = UtilHttp.doPost_S(url, null, null, body);
-        Map result = JSON.parseObject(response, Map.class);
+        log.info("SAP客户查询请求: endpoint={}, query={}, body={}", endpoint(customerInquiryUrl), safeParam(param), body);
+        String response = UtilHttp.doPost_S(customerInquiryUrl, null, param, body);
+        log.info("SAP客户查询响应: endpoint={}, response={}", endpoint(customerInquiryUrl), response);
+        assertJsonResponse(response);
+        Object parsed = JSON.parse(response);
+        Map result;
+        if (parsed instanceof JSONArray) {
+            JSONArray items = (JSONArray) parsed;
+            result = items.isEmpty() ? null : items.getObject(0, Map.class);
+        } else {
+            result = JSON.parseObject(response, Map.class);
+        }
         if (result == null) {
             throw new IllegalStateException("SAP客户查询接口返回为空");
         }
+        result.remove("original");
+        assertSuccess(result);
         return result;
     }
+
+    private void assertJsonResponse(String response) {
+        if (StringUtils.isBlank(response)) {
+            throw new IllegalStateException("SAP查询服务未返回数据");
+        }
+        String content = response.trim().toLowerCase();
+        if (content.startsWith("<") || content.contains("502 bad gateway") || content.contains("503 service unavailable")) {
+            throw new IllegalStateException("SAP查询服务暂时不可用,请稍后重试");
+        }
+        if (!content.startsWith("{") && !content.startsWith("[")) {
+            throw new IllegalStateException("SAP查询服务返回格式异常");
+        }
+    }
+
+    private void assertSuccess(Map result) {
+        String status = result.get("STATUS") == null ? "" : String.valueOf(result.get("STATUS"));
+        if (!"S".equalsIgnoreCase(status) && StringUtils.isNotBlank(status)) {
+            String message = result.get("MESSAGE") == null ? "" : String.valueOf(result.get("MESSAGE"));
+            throw new IllegalStateException(StringUtils.isBlank(message)
+                    ? "SAP客户查询失败,状态=" + status : message);
+        }
+    }
+
+    private Map<String, Object> safeParam(Map<String, Object> param) {
+        Map<String, Object> safe = new HashMap<>(param);
+        safe.put("bearer_token", "***");
+        return safe;
+    }
+
+    private String endpoint(String url) {
+        int queryStart = url.indexOf('?');
+        return queryStart >= 0 ? url.substring(0, queryStart) : url;
+    }
 }

+ 6 - 4
mjava-ts/src/main/java/com/malk/taisen/service/sap/impl/SapCustomerServiceImpl.java

@@ -23,26 +23,28 @@ public class SapCustomerServiceImpl implements SapCustomerService {
     /**
      * Query customer balance.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @param customerName selected customer name
      * @return customer balance response
      */
     @Override
-    public Map queryBalance(String customerNumber, String customerName) {
-        Map result = sapCustomerClient.queryBalance(customerNumber);
+    public Map queryBalance(String requestId, String customerNumber, String customerName) {
+        Map result = sapCustomerClient.queryBalance(requestId, customerNumber);
         return result == null ? mockBalance(customerNumber, customerName) : result;
     }
 
     /**
      * Query customer payment-unlocked orders.
      *
+     * @param requestId unique request identifier
      * @param customerNumber SAP customer number
      * @param customerName selected customer name
      * @return unlocked sales order response
      */
     @Override
-    public Map queryUnlockOrders(String customerNumber, String customerName) {
-        Map result = sapCustomerClient.queryUnlockOrders(customerNumber);
+    public Map queryUnlockOrders(String requestId, String customerNumber, String customerName) {
+        Map result = sapCustomerClient.queryUnlockOrders(requestId, customerNumber);
         return result == null ? mockUnlockOrders(customerNumber, customerName) : result;
     }
 

+ 2 - 2
mjava-ts/src/main/resources/application-prod.yml

@@ -56,8 +56,8 @@ aliwork:
   systemToken: "UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW"
 
 sap:
-  customer-balance-url: ${SAP_CUSTOMER_BALANCE_URL:}
-  customer-unlock-order-url: ${SAP_CUSTOMER_UNLOCK_ORDER_URL:}
+  customer-inquiry-url: ${SAP_CUSTOMER_INQUIRY_URL:}
+  customer-inquiry-token: ${SAP_CUSTOMER_INQUIRY_TOKEN:}
   QA_sapUrl_Poc: "https://etl-prod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonProd/Ultraprojects/team-fssc/tk_oa_to_sap_p2p?bearer_token=bBiGTA7PS0JJ6wKhQU8Vm0vLsIDNjLaN&interface_id="
   JT_sapUrl_Poc: "https://etl-prod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonProd/Ultraprojects/team-fssc/tk_oa_to_sap_r2r_generate_fi_document_with_copa?bearer_token=TVof6BjMdOvJreUmI9DzEepesFVwbfEc&interface_id=SAP020"
 #  JT_sapUrl_Poc: "https://etl-nonprod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonNonProd/Ultra_PoC/00-STG-team-fssc/tk_oa_to_sap_r2r_generate_fi_document_with_copa?bearer_token=TVof6BjMdOvJreUmI9DzEepesFVwbfEc&interface_id=SAP020"

+ 3 - 3
mjava-ts/src/main/resources/application-test.yml

@@ -55,8 +55,8 @@ aliwork:
   systemToken: "UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW"
 
 sap:
-  customer-balance-url: ${SAP_CUSTOMER_BALANCE_URL:}
-  customer-unlock-order-url: ${SAP_CUSTOMER_UNLOCK_ORDER_URL:}
+  customer-inquiry-url: ${SAP_CUSTOMER_INQUIRY_URL:}
+  customer-inquiry-token: ${SAP_CUSTOMER_INQUIRY_TOKEN:}
   QA_sapUrl_Poc: "https://etl-nonprod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonNonProd/Ultra_PoC/00-STG-team-fssc/tk_oa_to_sap_p2p?bearer_token=bBiGTA7PS0JJ6wKhQU8Vm0vLsIDNjLaN&interface_id=" #测试环境的测试平台地址,等飞翔项目结束 改为下面的地址
  # QA_sapUrl_Poc: "https://etl-nonprod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonNonProd/Ultra_PoC/00-STG-team-fssc/tk_oa_to_sap_p2p?bearer_token=bBiGTA7PS0JJ6wKhQU8Vm0vLsIDNjLaN&interface_id="
   JT_sapUrl_Poc: "https://etl-nonprod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonNonProd/Ultra_PoC/10-QA-team-fssc/tk_oa_to_sap_r2r_generate_fi_document_with_copa?bearer_token=TVof6BjMdOvJreUmI9DzEepesFVwbfEc&interface_id=SAP020"
@@ -69,4 +69,4 @@ hangxing:
 
 ar:
   notify:
-    user-ids: ${AR_NOTIFY_USER_IDS:15362032421245878}
+    user-ids: ${AR_NOTIFY_USER_IDS:15362032421245878,2051455621692234,09212200432044720}

Різницю між файлами не показано, бо вона завелика
+ 910 - 0
pages/build/customer-info-query.yida.jsx


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
pages/dist/customer-info-query.yida.js


Різницю між файлами не показано, бо вона завелика
+ 393 - 0
pages/src/customer-info-query.oyd.jsx