| src/main/java/com/gs/xiaomi/controller/KMController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/xiaomi/service/BCS101Service.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/xiaomi/service/SoapApiService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/xiaomi/service/XM104Service.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/gs/xiaomi/task/ScheduledTasks.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/gs/xiaomi/controller/KMController.java
@@ -3,7 +3,7 @@ import com.gs.xiaomi.config.ResultMessage; import com.gs.xiaomi.dto.NumbericalDto; import com.gs.xiaomi.service.XM104Service; import com.gs.xiaomi.service.Xm104Service; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -14,7 +14,7 @@ public class KMController { private final XM104Service xm104Service; private final Xm104Service xm104Service; @PostMapping("/manualSynByASN") public ResultMessage manualSynByASN(@RequestBody NumbericalDto barcode) { @@ -24,12 +24,15 @@ } try { if (!xm104Service.manualSynchronization(barcode)) { return ResultMessage.error("同步失败"); String errorMessage = xm104Service.manualSynchronization(barcode); if (errorMessage != null) { // 有错误信息,返回具体的错误 return ResultMessage.error(errorMessage); } return ResultMessage.ok(); } catch (Exception e) { return ResultMessage.error(e); // 捕获其他未预期的异常 return ResultMessage.error(e.getMessage() != null ? e.getMessage() : "同步失败: 系统异常"); } } src/main/java/com/gs/xiaomi/service/BCS101Service.java
@@ -12,5 +12,5 @@ @RequiredArgsConstructor public class BCS101Service { private static final Logger log = LoggerFactory.getLogger(XM104Service.class); private static final Logger log = LoggerFactory.getLogger(Xm104Service.class); } src/main/java/com/gs/xiaomi/service/SoapApiService.java
@@ -3,6 +3,7 @@ import com.gs.xiaomi.config.DataAcquisitionConfiguration; import com.gs.xiaomi.dto.BizDocumentResult; import com.gs.xiaomi.dto.SoapApiResponse; import com.gs.xiaomi.dto.ZfmWsApiRequest; import com.gs.xiaomi.util.SoapXmlBuilder; import com.gs.xiaomi.util.X5StringUtils; @@ -26,7 +27,7 @@ .build(); } public BizDocumentResult callAndParse(String url, ZfmWsApiRequest request) throws Exception { public SoapApiResponse<BizDocumentResult> callAndParse(String url, ZfmWsApiRequest request) throws Exception { String soapXml = SoapXmlBuilder.build(request); Response response = sendRequest(url, soapXml); @@ -34,18 +35,24 @@ String bodyStr = response.body().string(); String evCode = extractEvCode(bodyStr); if (!"Y".equalsIgnoreCase(evCode)) { throw new RuntimeException("SOAP business failed, EV_CODE: " + evCode); } String decodedXml = decodeXmlEntities(bodyStr); if (!"Y".equalsIgnoreCase(evCode)) { // 从 decodedXml 中提取错误提示信息 String evMessage = extractEvMessage(decodedXml); return SoapApiResponse.fail(evCode, evMessage != null ? evMessage : "SOAP业务处理失败, EV_CODE: " + evCode); } String innerXml = extractCdata(decodedXml); if (innerXml == null) throw new RuntimeException("No CDATA <document> found in response"); if (innerXml == null) { throw new RuntimeException("No CDATA <document> found in response"); } JAXBContext context = JAXBContext.newInstance(BizDocumentResult.class); Unmarshaller unmarshaller = context.createUnmarshaller(); return (BizDocumentResult) unmarshaller.unmarshal(new StringReader(innerXml)); BizDocumentResult result = (BizDocumentResult) unmarshaller.unmarshal(new StringReader(innerXml)); return SoapApiResponse.success(evCode, result); } else { throw new RuntimeException("SOAP request failed: " + response.code() + " - " + response.message()); } @@ -77,6 +84,13 @@ return xml.substring(start + 9, end).trim(); } private String extractEvMessage(String xml) { int start = xml.indexOf("<EV_MESSAGE>"); int end = xml.indexOf("</EV_MESSAGE>", start); if (start == -1 || end == -1) return null; return xml.substring(start + 12, end).trim(); } private String decodeXmlEntities(String xml) { return xml.replace("<", "<") .replace(">", ">") src/main/java/com/gs/xiaomi/service/XM104Service.java
@@ -10,6 +10,7 @@ import com.gs.xiaomi.config.DataAcquisitionConfiguration; import com.gs.xiaomi.dto.*; import com.gs.xiaomi.entity.DeliveryDetail; import com.gs.xiaomi.dto.SoapApiResponse; import com.gs.xiaomi.entity.DeliveryMain; import com.gs.xiaomi.entity.LogisticsPackage; import com.gs.xiaomi.entity.PackageDetail; @@ -31,9 +32,9 @@ @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class XM104Service { public class Xm104Service { private static final Logger log = LoggerFactory.getLogger(XM104Service.class); private static final Logger log = LoggerFactory.getLogger(Xm104Service.class); private final SoapApiService soapApiService; private final DeliveryMainService deliveryMainService; @@ -69,7 +70,15 @@ req.setIvUser(DataAcquisitionConfiguration.IV_USER); try { BizDocumentResult deliveryNo = getDeliveryNo(req); SoapApiResponse<BizDocumentResult> response = getDeliveryNo(req); // 检查响应是否成功 if (!response.isSuccess()) { log.error("【获取送货单列表失败】EV_CODE: {}, 提示信息: {}", response.getEvCode(), response.getMessage()); throw new RuntimeException("获取送货单列表失败: " + response.getMessage()); } BizDocumentResult deliveryNo = response.getData(); if (CollUtil.isEmpty(deliveryNo.getEtHeaders())) { log.info("【BizDocumentResult】返回列表为空,跳过处理"); @@ -91,7 +100,16 @@ req.setIvInfo(doc); try { BizDocumentResult result = getDeliveryNo(req); SoapApiResponse<BizDocumentResult> detailResponse = getDeliveryNo(req); // 检查响应是否成功 if (!detailResponse.isSuccess()) { log.error("【获取送货单详情失败】送货单: {}, EV_CODE: {}, 提示信息: {}", etHeader.getZzasn(), detailResponse.getEvCode(), detailResponse.getMessage()); throw new RuntimeException("获取送货单详情失败: " + detailResponse.getMessage()); } BizDocumentResult result = detailResponse.getData(); if (result == null) { log.info("【BizDocumentResult】获取送货单详情信息为空,跳过处理"); @@ -116,11 +134,11 @@ } } private BizDocumentResult getDeliveryNo(ZfmWsApiRequest request) throws Exception { private SoapApiResponse<BizDocumentResult> getDeliveryNo(ZfmWsApiRequest request) throws Exception { BizDocumentResult bizDocumentResult = soapApiService.callAndParse(DataAcquisitionConfiguration.XM104_URL, request); SoapApiResponse<BizDocumentResult> response = soapApiService.callAndParse(DataAcquisitionConfiguration.XM104_URL, request); return bizDocumentResult; return response; } private <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { @@ -212,7 +230,7 @@ }); } public boolean manualSynchronization(NumbericalDto numbericalDto) { public String manualSynchronization(NumbericalDto numbericalDto) { try { String[] asns = numbericalDto.getAsn().split(","); for (String asn : asns) { @@ -221,10 +239,11 @@ doc.setZzasn(asn); getXM104(doc); } return true; return null; // 返回null表示成功 } catch (Exception e) { log.error("【手动读取ASN异常】 异常: {}", e.getMessage(), e); return false; // 返回具体的错误信息 return e.getMessage() != null ? e.getMessage() : "同步失败: 未知错误"; } } src/main/java/com/gs/xiaomi/task/ScheduledTasks.java
@@ -1,7 +1,7 @@ package com.gs.xiaomi.task; import com.gs.xiaomi.service.XM104Service; import com.gs.xiaomi.service.Xm104Service; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -13,7 +13,7 @@ public class ScheduledTasks { private final XM104Service xm104Service; private final Xm104Service xm104Service; /** * 每五分钟执行一次 src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
@@ -4,7 +4,7 @@ import com.gs.xiaomi.dto.BCS101Request; import com.gs.xiaomi.dto.NumbericalDto; import com.gs.xiaomi.service.BCS101ApiService; import com.gs.xiaomi.service.XM104Service; import com.gs.xiaomi.service.Xm104Service; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -13,7 +13,7 @@ class XiaomiApplicationTests { @Autowired private XM104Service xm104Service; private Xm104Service xm104Service; @Autowired private BCS101ApiService bcs101ApiService;