111
tjx
2025-10-24 f1665083644aaccbaccf8a5352c2c4f161f28645
111
已修改6个文件
90 ■■■■ 文件已修改
src/main/java/com/gs/xiaomi/controller/KMController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xiaomi/service/BCS101Service.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xiaomi/service/SoapApiService.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xiaomi/service/XM104Service.java 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gs/xiaomi/task/ScheduledTasks.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java 4 ●●●● 补丁 | 查看 | 原始文档 | 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("&#60;", "<")
                .replace("&#62;", ">")
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;