src/main/java/com/gs/xiaomi/XiaomiApplication.java
@@ -1,9 +1,13 @@ package com.gs.xiaomi; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication @MapperScan(value = " com.gs.xiaomi.mapper") @EnableScheduling public class XiaomiApplication { public static void main(String[] args) { src/main/java/com/gs/xiaomi/dto/EtHeader.java
@@ -199,13 +199,13 @@ /* éä»¶ä¿¡æ¯å */ @XmlElementWrapper(name = "items") @XmlElement(name = "item") private List<Item> items;// è¡é¡¹ç®æç» private List<Item> items;// è¡é¡¹ç®æç» 对åºè¡¨DELIVERY_DETAIL @XmlElementWrapper(name = "box_items") @XmlElement(name = "boxItems") private List<BoxItem> boxItems; // ç®±åæç» private List<BoxItem> boxItems; // ç®±åæç» 对åºè¡¨PACKAGE_DETAIL @XmlElementWrapper(name = "box_sums") @XmlElement(name = "boxSum") private List<BoxSum> boxSums; // ç®±æ°æ±æ» private List<BoxSum> boxSums; // ç®±æ°æ±æ» 对åºè¡¨LOGISTICS_PACKAGE } src/main/java/com/gs/xiaomi/entity/DeliveryDetail.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,196 @@ package com.gs.xiaomi.entity; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @TableName DELIVERY_DETAIL */ @TableName(value = "DELIVERY_DETAIL") @Data @KeySequence(value = "SEQ_DELIVERY_DETAIL", dbType = DbType.ORACLE) public class DeliveryDetail { /** * SEQ_DELIVERY_DETAIL */ @TableId private Long id; /** * DELIVERY_MAINçid */ private Long pid; /** * éè´§åå·ï¼ä¸»ä¸å¡æ è¯ï¼ */ private String zzasn; /** * éè´§åè¡å· */ private String zzitemId; /** * éè´åè¯å·ï¼POåå·ï¼ */ private String zzpoNo; /** * éè´è®¢åè¡é¡¹ç® */ private String zzpoItemId; /** * å°ç±³éæ¢è´§åå· */ private String zzreqnr; /** * éæ¢è´§ç³è¯·åè¡å· */ private String zzreqln; /** * å°ç±³å é¨ç©æç¼ç */ private String zzproductId; /** * å·¥åå®é ä½¿ç¨æå· */ private String zzvproductId; /** * åºååä½ç¼ç */ private String zzsku; /** * ç©ææè¿°ï¼å¦ï¼ææºå±å¹ç»ä»¶ï¼ */ private String maktx; /** * 产ååå·ï¼ç¤ºä¾ï¼Xiaomi 14 Ultraï¼ */ private String modelnumber; /** * 订åéæ±æ°é */ private String zzquantity; /** * 计éåä½ï¼å¦ï¼ä¸ª/ç®±ï¼ */ private String zzunit; /** * æªå®ææ°éï¼å¾ 补货éï¼ */ private String zzopenQty; /** * å®é æ¶è´§æ°é */ private String actGrQty; /** * Shipmentæ¹æ¬¡æ°é */ private String shipmentidNum; /** * åçåç§°ï¼å¦ï¼Xiaomiï¼ */ private String brand; /** * ç产å°ï¼ç¤ºä¾ï¼ä¸å½æ·±å³ï¼ */ private String place; /** * åçç±»åï¼èªæ/ODM/OEMï¼ */ private String brandType; /** * ç©æµæ¹æ¬¡å¯ä¸æ è¯ */ private String zshipmentId; /** * 详ç»é éå°åï¼çå¸åºè¡éé¨çå·ï¼ */ private String addressDetail; /** * è°åºé¡¹ç®å·ï¼è°æ¨æ¥æºæ è¯ï¼ */ private String bednr; /** * è°åºä»ç±»åï¼æåä»/åæä»ï¼ */ private String wareTypeFrom; /** * è°å ¥ä»ç±»å */ private String wareTypeTo; /** * ç©æ§è°æ¨åå· */ private String xmstoNo; /** * è°æ¨åè¡é¡¹ */ private String xmstoItemNo; /** * æåä¿®æ¹æ¶é´ï¼æ ¼å¼ï¼yyyyMMddHHmmssï¼ */ private String changedAt; /** * æ°æ®å建æ¶é´ï¼æ ¼å¼ï¼yyyyMMddHHmmssï¼ */ private String createdAt; /** * å ³èé¡¹ç®æºåï¼å¤å¼éå·åéï¼ */ private String appModels; /** * å¤é¨ç³»ç»åè¯å·ï¼å¦ERPåå·ï¼ */ private String extDocNo; /** * å¤é¨åè¯è¡é¡¹ç® */ private String extDocItem; /** * æµ·å ³HSç¼ç ï¼è¿åºå£æ¥å ³ç¨ï¼ */ private String batchId; /** * ä¼å éè´æ è¯ï¼ç´§æ¥å¤ææ è®°ï¼ */ private String batchRow; /** * 串å·ç®¡çæ è¯ï¼Y/Nï¼æ§å¶åºåå·ééï¼ */ private String isIdentification; } src/main/java/com/gs/xiaomi/entity/DeliveryMain.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,308 @@ package com.gs.xiaomi.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @TableName DELIVERY_MAIN */ @TableName(value = "DELIVERY_MAIN") @Data public class DeliveryMain { /** * SEQ_DELIVERY_MAIN */ @TableId private Long id; /** * éè´§åå· */ private String zzasn; /** * åæ®ç±»å(æ®é/ç´§æ¥) */ private String zzasnType; /** * æ¶è´§ç±»å(æ å/éè´§) */ private String migoType; /** * 项ç®è°æ¨ç¼å· */ private String zrproject; /** * éè´ç»ç»ç¼ç */ private String ekorg; /** * éè´ç»ç»æè¿° */ private String ekotx; /** * è°åºåºåç»ç»ç¼ç */ private String stockOrgFrom; /** * è°åºåºåæè¿° */ private String stockOrgFromDesc; /** * è°å ¥åºåç»ç»ç¼ç */ private String stockOrgTo; /** * è°å ¥åºåæè¿° */ private String stockOrgToDesc; /** * ä¾åºåç¼ç (示ä¾å¼:130479) */ private String lifnr; /** * ä¾åºåå ¨ç§° */ private String vendorName; /** * ä¾åºåç®ç§° */ private String shortName; /** * HUBä¾åºåç¼ç */ private String hubLifnr; /** * æ¿è¿ååç§° */ private String zzcarrier; /** * æ¿è¿åå· */ private String zzcarrierNo; /** * è¿è¾åæ®å· */ private String roadTransportNo; /** * è¿è¾è½¦å */ private String zztransModel; /** * 车çå· */ private String zzlicenseNumb; /** * é å°å· */ private String zzsealNo; /** * ç©æµåå· */ private String logisticsNo; /** * ç©æµå ¬å¸ç¼ç */ private String logisticsCompany; /** * ç©æµå ¬å¸å ¨ç§° */ private String logisticsCompanyName; /** * å货人å§å */ private String zzshipName; /** * å货人çµè¯ */ private String zzshipPhon; /** * 叿ºå§å */ private String zzdriverName; /** * 叿ºçµè¯ */ private String zzdriverPhon; /** * ææºå°¾å· */ private String last4PhoneNumber; /** * æ¶è´§äºº */ private String receiver; /** * æ¶è´§çµè¯ */ private String receivePhone; /** * æç»æ¶è´§äºº */ private String finalContact; /** * æç»èç³»çµè¯ */ private String finalPhone; /** * åè´§å°å */ private String zzshipAddr; /** * æ åæ¶è´§å°å */ private String zzreceiveAddr; /** * å®é æ¶è´§å°å */ private String receiveAddr; /** * æç»é éå°å */ private String finalAddr; /** * æç»æ¶è´§åä½ */ private String finalCompany; /** * åè´§æ¥æ(yyyyMMdd) */ private String zzshipDate; /** * é¢è®¡å°è´§æ¥æ(yyyyMMdd) */ private String zzarriveTime; /** * é¢è®¡å°è´§æ¶é´(HHmm) */ private String zzarriveTime1; /** * é¢çº¦æ¥æ(yyyyMMdd) */ private String reserveDate; /** * é¢çº¦æ¶é´æ®µ */ private String reserveTime; /** * ä»åºå¯ä¸æ è¯ */ private String zzwarehouseId; /** * æ¶è´§ä»åºID */ private String receiveWarehouseId; /** * ä»åºç®ç§° */ private String receiveWarehouseShort; /** * å ¬å¸ä»£ç */ private String bukrs; /** * åæ®ç¶æ(æ°å»º/å·²åè´§/已宿) */ private String status; /** * æ¡ç ç¶æ(å·²ä¸ä¼ /æªä¸ä¼ ) */ private String statusSn; /** * ä½åºæ è¯(Y/N) */ private String zzcanceled; /** * ä»·æ ¼å®¡æ ¸ç¶æ */ private String priceStat; /** * ä»åºä½ä¸æå¯¼ç±»å */ private String purchaseMode; /** * éè´æ¨¡å¼(VMI/JIT) */ private String purchaseMode2; /** * äº¤ææ¨¡å¼(èªæ/é é) */ private String businessModel; /** * åæ®æè¿° */ private String asnDesc; /** * è¿å£æ¥å ³æ è¯(Y/N) */ private String imclr; /** * å¤é¨å·¥å代ç */ private String lifnrDg; /** * ç产类å(èªå¶/å¤è´) */ private String productType; /** * 驾驶è¯å· */ private String zzdriverLicense; } src/main/java/com/gs/xiaomi/entity/LogisticsPackage.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,171 @@ package com.gs.xiaomi.entity; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @TableName LOGISTICS_PACKAGE */ @TableName(value = "LOGISTICS_PACKAGE") @Data @KeySequence(value = "LOGISTICS_PACKAGE_SEQ", dbType = DbType.ORACLE) public class LogisticsPackage { /** * LOGISTICS_PACKAGE_SEQ */ @TableId private Long id; /** * DELIVERY_MAINçid */ private Long pid; /** * ç®±åæµæ°´å· */ private String boxSeq; /** * ç©çå è£ æ è¯ */ private String boxNo; /** * å°ç±³ä¸ç¨å å¯ç®±å·ï¼AES-256å å¯åå¨ï¼ */ private String cartonid; /** * å ¨çç»ä¸éè´§åå·ï¼å ³èç©æµç³»ç»ï¼ */ private String zzasn; /** * SAPæ åç©æç¼ç */ private String matnr; /** * å¤è¯è¨ç©ææè¿° */ private String maktx; /** * å®é åè´§ä»¶æ°ï¼æå°éå®åä½ç»è®¡ï¼ */ private String pcQty; /** * ç©æµæçç¼å· */ private String lotNo; /** * åä»¶åé */ private String ntgewP; /** * åç®±æ¯é */ private String brgewP; /** * æçè£ è½½è§æ ¼ */ private String lotSize; /** * æ åç®±ä½å°ºå¯¸ */ private String boxSize; /** * å«æçæ»ä½ç§¯ */ private String totalVlume; /** * æçé¿åº¦ */ private String lM; /** * æç宽度 */ private String wM; /** * æçå é«ï¼å®å ¨éé«ï¼é²å¾åæ§å¶ï¼ */ private String hM; /** * éè´è®¢åå·ï¼å ³èSAPéè´åè¯ï¼ */ private String ebeln; /** * éè´è®¢åè¡å·ï¼ç²¾ç¡®å°ç©æå±çº§ï¼ */ private String ebelp; /** * å箱容éè§æ ¼ï¼é²è¶ è£ æ ¡éªï¼ */ private String boxSpec; /** * æ»å è£ ç®±æ°ï¼ä¸éè´è®¢åå¹é æ ¡éªï¼ */ private String boxQty; /** * æ»åéï¼å ¬å¼ï¼ntgew_p à pc_qtyï¼ */ private String ntgew; /** * æ»æ¯éï¼å ¬å¼ï¼brgew_p à box_qtyï¼ */ private String brgew; /** * å½é 计éåä½ï¼UN/CEFACTæ åï¼ */ private String meins; /** * åçè®¤è¯æ è¯ï¼éæµ·å ³å¤æ¡ï¼ */ private String brand; /** * å产å°ç¼ç ï¼èåå½UN/LOCODEæ åï¼ */ private String place; /** * æ¥å ³æ è¯ï¼æ§å¶æ¥å ³æµç¨è§¦åï¼ */ private String imclr; /** * å½é åå·ç¼ç ï¼å ¨çå¸åºå¯ä¸æ è¯ï¼ */ private String modelnumber; /** * æµ·å ³ç管æ¡ä»¶ï¼å¦3C/è½ææ è¯ï¼ */ private String matnrJg; /** * æ£éªæ£ç«ä»£ç ï¼å¦FDA/CE认è¯ï¼ */ private String matnrJyjy; } src/main/java/com/gs/xiaomi/entity/PackageDetail.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,171 @@ package com.gs.xiaomi.entity; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; /** * @TableName PACKAGE_DETAIL */ @TableName(value = "PACKAGE_DETAIL") @Data @KeySequence(value = "PACKAGE_DETAIL_SEQ", dbType = DbType.ORACLE) public class PackageDetail { /** * PACKAGE_DETAIL_SEQ */ @TableId private Long id; /** * DELIVERY_MAINçid */ private Long pid; /** * ç®±åæµæ°´å·ï¼æå¹´ææ¥+åºåçæï¼ */ private String boxSeq; /** * å è£ ç®±å¯ä¸æ è¯ï¼è§åï¼é¡¹ç®+æ¥æ+æµæ°´ï¼ */ private String boxNo; /** * å°ç±³ä¸ç¨å å¯ç®±å·ï¼SHA-256ç®æ³å å¯ï¼ */ private String cartonid; /** * å ¨çç»ä¸éè´§åå·ï¼ä¸»ä¸å¡æ è¯ï¼ */ private String zzasn; /** * å½é ç©æç¼ç ï¼å ¨çå¯ä¸æ§ä¿éï¼ */ private String matnr; /** * å¤è¯è¨ç©ææè¿°ï¼æ¯æä¸/è±/西è¯ï¼ */ private String maktx; /** * å®é åè´§ä»¶æ°ï¼ææå°éå®åä½ç»è®¡ï¼ */ private String pcQty; /** * æçå¯ä¸ç¼å·ï¼ä¸ç©æµç³»ç»èå¨ï¼ */ private String lotNo; /** * åä»¶åéï¼ç²¾ç¡®å°å ï¼ç¨äºæ¥å ³ï¼ */ private String ntgewP; /** * åç®±æ¯éï¼å«å è£ ææééï¼ */ private String brgewP; /** * æçè£ è½½è§æ ¼ï¼æå¤§æ¿è½½ç®±æ°ï¼ */ private String lotSize; /** * æ ååç®±ä½å°ºå¯¸ï¼é¿x宽xé«ï¼ */ private String boxSize; /** * å«æçæ»ä½ç§¯ï¼ç¨äºè¿è¾ææ¬è®¡ç®ï¼ */ private String totalVlume; /** * æ»ç®±æ°ï¼ä¸éè´è®¢åæ ¡éªï¼ */ private String boxQty; /** * éè´è®¢åå·ï¼å ³èERPç³»ç»ï¼ */ private String ebeln; /** * éè´è®¢åè¡å·ï¼ç²¾ç¡®å°ç©æå±çº§ï¼ */ private String ebelp; /** * å箱容éï¼ä»¶/ç®±ï¼é²è¶ è£ æ§å¶ï¼ */ private String boxSpec; /** * æ»åéï¼èªå¨è®¡ç®ï¼åä»¶åéÃæ»ä»¶æ°ï¼ */ private String ntgew; /** * æ»æ¯éï¼å«æçåå è£ ææï¼ */ private String brgew; /** * å½é 计éåä½ï¼UN/CEFACTæ åï¼ */ private String meins; /** * æçé¿åº¦ï¼ç¬¦åISO 6780æ åï¼ */ private String lM; /** * æçå®½åº¦ï¼æ¬§æ´²æ åï¼1.0mï¼ */ private String wM; /** * æçå é«ï¼å®å ¨é髿 è¯ï¼ */ private String hM; /** * åçè®¤è¯æ è¯ï¼éæµ·å ³å¤æ¡ï¼ */ private String brand; /** * å产å°ç¼ç ï¼èåå½UN/LOCODEï¼ */ private String place; /** * æµ·å ³æ¥å ³æ è¯ï¼Y-éæ¥å ³/N-å æ¥å ³ï¼ */ private String imclr; /** * å½é åå·ç¼ç ï¼å ¨çå¸åºå¯ä¸ï¼ */ private String modelnumber; /** * æµ·å ³ç管æ¡ä»¶ï¼å¦3C/è½ææ è¯ï¼ */ private String matnrJg; /** * æ£éªæ£ç«ä»£ç ï¼å¦FDA/CE认è¯ï¼ */ private String matnrJyjy; } src/main/java/com/gs/xiaomi/mapper/DeliveryDetailMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.gs.xiaomi.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gs.xiaomi.entity.DeliveryDetail; /** * @author 28567 * @description é对表ãDELIVERY_DETAILãçæ°æ®åºæä½Mapper * @createDate 2025-04-10 14:16:44 * @Entity generator.domain.DeliveryDetail */ public interface DeliveryDetailMapper extends BaseMapper<DeliveryDetail> { } src/main/java/com/gs/xiaomi/mapper/DeliveryMainMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.gs.xiaomi.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gs.xiaomi.entity.DeliveryMain; /** * @author 28567 * @description é对表ãDELIVERY_MAINãçæ°æ®åºæä½Mapper * @createDate 2025-04-10 14:16:52 * @Entity generator.domain.DeliveryMain */ public interface DeliveryMainMapper extends BaseMapper<DeliveryMain> { long getNextVal(); } src/main/java/com/gs/xiaomi/mapper/LogisticsPackageMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.gs.xiaomi.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gs.xiaomi.entity.LogisticsPackage; /** * @author 28567 * @description é对表ãLOGISTICS_PACKAGEãçæ°æ®åºæä½Mapper * @createDate 2025-04-10 14:17:13 * @Entity generator.domain.LogisticsPackage */ public interface LogisticsPackageMapper extends BaseMapper<LogisticsPackage> { } src/main/java/com/gs/xiaomi/mapper/PackageDetailMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.gs.xiaomi.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.gs.xiaomi.entity.PackageDetail; /** * @author 28567 * @description é对表ãPACKAGE_DETAILãçæ°æ®åºæä½Mapper * @createDate 2025-04-10 14:17:48 * @Entity generator.domain.PackageDetail */ public interface PackageDetailMapper extends BaseMapper<PackageDetail> { } src/main/java/com/gs/xiaomi/service/DeliveryDetailService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.gs.xiaomi.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gs.xiaomi.entity.DeliveryDetail; /** * @author 28567 * @description é对表ãDELIVERY_DETAILãçæ°æ®åºæä½Service * @createDate 2025-04-10 14:16:44 */ public interface DeliveryDetailService extends IService<DeliveryDetail> { } src/main/java/com/gs/xiaomi/service/DeliveryMainService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.gs.xiaomi.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gs.xiaomi.entity.DeliveryMain; /** * @author 28567 * @description é对表ãDELIVERY_MAINãçæ°æ®åºæä½Service * @createDate 2025-04-10 14:16:52 */ public interface DeliveryMainService extends IService<DeliveryMain> { long getId(); } src/main/java/com/gs/xiaomi/service/LogisticsPackageService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.gs.xiaomi.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gs.xiaomi.entity.LogisticsPackage; /** * @author 28567 * @description é对表ãLOGISTICS_PACKAGEãçæ°æ®åºæä½Service * @createDate 2025-04-10 14:17:13 */ public interface LogisticsPackageService extends IService<LogisticsPackage> { } src/main/java/com/gs/xiaomi/service/PackageDetailService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ package com.gs.xiaomi.service; import com.baomidou.mybatisplus.extension.service.IService; import com.gs.xiaomi.entity.PackageDetail; /** * @author 28567 * @description é对表ãPACKAGE_DETAILãçæ°æ®åºæä½Service * @createDate 2025-04-10 14:17:48 */ public interface PackageDetailService extends IService<PackageDetail> { } src/main/java/com/gs/xiaomi/service/SoapApiService.java
@@ -12,11 +12,19 @@ import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.StringReader; import java.util.concurrent.TimeUnit; @Service public class SoapApiService { private static final OkHttpClient client = new OkHttpClient.Builder().build(); private final OkHttpClient client; public SoapApiService() { this.client = new OkHttpClient.Builder().connectTimeout(3000, TimeUnit.SECONDS) // Set connection timeout .readTimeout(90, TimeUnit.SECONDS) // Set read timeout .build(); } public BizDocumentResult callAndParse(String url, ZfmWsApiRequest request) throws Exception { String soapXml = SoapXmlBuilder.build(request); @@ -53,13 +61,10 @@ Request request = new Request.Builder() .url(url) .method("POST", body) // .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)") .addHeader("Content-Type", "application/xml") .addHeader("Authorization", "Basic " + auth) .addHeader("Accept", "*/*") // .addHeader("Host", "mipoq.p.mi.com") .addHeader("Connection", "keep-alive") // .addHeader("Cookie", "saplb_*=(J2EE4281420)4281450; MYSAPSSO2=AjExMDAgABJwb3J0YWw6UkZDWkpYSUFPQlWIAAdkZWZhdWx0AQALUkZDWkpYSUFPQlUCAAMwMDADAANQT1EEAAwyMDI1MDQwOTAwMTcFAAQAAAAICgALUkZDWkpYSUFPQlX%2FAQUwggEBBgkqhkiG9w0BBwKggfMwgfACAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGB0DCBzQIBATAiMB0xDDAKBgNVBAMTA1BPUTENMAsGA1UECxMESjJFRQIBADAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjUwNDA5MDAxNzU2WjAjBgkqhkiG9w0BCQQxFgQUvvJ1HSnOLckboGYaMR9Wiaem6z4wCQYHKoZIzjgEAwQvMC0CFQDKLPrpUC19VM2gcslWaHAnh7dfxQIUNs2dTxwGcKdNU%2FdAQPs4f08yaw4%3D; JSESSIONID=_6bPldDq9mFJPXEd11bc-GvrWMAVlgFqVEEA_SAPF-GrpRbcuqxMK_gShBYGdmdp; JSESSIONMARKID=QPmRVwktCDxMazp0fUbEMC40LWvmuqOMUbIGpUQQA") .build(); return client.newCall(request).execute(); src/main/java/com/gs/xiaomi/service/XM104Service.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,167 @@ package com.gs.xiaomi.service; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.gs.xiaomi.config.DataAcquisitionConfiguration; import com.gs.xiaomi.dto.*; import com.gs.xiaomi.entity.DeliveryDetail; import com.gs.xiaomi.entity.DeliveryMain; import com.gs.xiaomi.entity.LogisticsPackage; import com.gs.xiaomi.entity.PackageDetail; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Date; import java.util.List; @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class XM104Service { private static final Logger log = LoggerFactory.getLogger(XM104Service.class); private final SoapApiService soapApiService; private final DeliveryMainService deliveryMainService; private final PackageDetailService packageDetailService; private final DeliveryDetailService deliveryDetailService; private final LogisticsPackageService logisticsPackageService; public void getDb() { String format = DateUtil.format(new Date(), "yyyy-MM-dd"); ZfmWsApiRequest req = new ZfmWsApiRequest(); req.setIvCode(DataAcquisitionConfiguration.IV_CODEXM104); req.setIvEvent(""); req.setIvFlag(""); BizDocument doc = new BizDocument(); doc.setBizDate(format); doc.setLifnr(DataAcquisitionConfiguration.LIFNR); req.setIvInfo(doc); req.setIvPass(DataAcquisitionConfiguration.getIvPass(DataAcquisitionConfiguration.IV_CODEXM104)); req.setIvUser(DataAcquisitionConfiguration.IV_USER); try { BizDocumentResult deliveryNo = getDeliveryNo(req); if (CollUtil.isNotEmpty(deliveryNo.getEtHeaders())) { log.info("ãBizDocumentResultãè¿åå表为空ï¼è·³è¿å¤ç"); log.info("è·åæ¥å£å表è¿å: {}", deliveryNo.getEvMessage()); return; } //è·åææçASNå· List<EtHeader> etHeaders = deliveryNo.getEtHeaders(); etHeaders.forEach(etHeader -> { log.info("1.è·åå°éè´§åå·: {}", etHeader.getZzasn()); //æ ¹æ®æ¯è¡ASNå·è·å详ç»çæç» doc.setZzasn(etHeader.getZzasn()); req.setIvInfo(doc); try { BizDocumentResult result = getDeliveryNo(req); if (result == null) { log.info("ãBizDocumentResultãè·åéè´§å详æ ä¿¡æ¯ä¸ºç©ºï¼è·³è¿å¤ç"); return; } log.info("2.åå ¥æ°æ®åº: {}", etHeader.getZzasn()); //åå ¥å°æ°æ®åºä¸ setDeliveryMain(result); } catch (Exception e) { log.error("ãåå ¥æ°æ®åºå¼å¸¸ãéè´§å: {}, å¼å¸¸: {}", etHeader.getZzasn(), e.getMessage(), e); throw new RuntimeException(e); } }); } catch (Exception e) { log.error("ã读åå表å¼å¸¸ãåæ°: {} å¼å¸¸: {}", JSON.toJSONString(req), e.getMessage(), e); throw new RuntimeException(e); } } private BizDocumentResult getDeliveryNo(ZfmWsApiRequest request) throws Exception { BizDocumentResult bizDocumentResult = soapApiService.callAndParse(DataAcquisitionConfiguration.XM104_URL, request); return bizDocumentResult; } private void setDeliveryMain(BizDocumentResult result) { List<EtHeader> etHeaders = result.getEtHeaders(); etHeaders.forEach(etHeader -> { DeliveryMain deliveryMain = new DeliveryMain(); BeanUtil.copyProperties(etHeader, deliveryMain); long id = deliveryMainService.getId(); deliveryMain.setId(id); deliveryMainService.save(deliveryMain); List<Item> items = etHeader.getItems(); if (CollUtil.isNotEmpty(items)) { List<DeliveryDetail> deliveryDetails = new ArrayList<>(); for (Item item : items) { DeliveryDetail deliveryDetail = new DeliveryDetail(); BeanUtil.copyProperties(item, deliveryDetail); deliveryDetail.setPid(deliveryMain.getId()); deliveryDetails.add(deliveryDetail); } deliveryDetailService.saveBatch(deliveryDetails); } List<BoxItem> boxItems = etHeader.getBoxItems(); if (CollUtil.isNotEmpty(boxItems)) { List<PackageDetail> list = new ArrayList<>(); for (BoxItem boxItem : boxItems) { PackageDetail packageDetail = new PackageDetail(); BeanUtil.copyProperties(boxItem, packageDetail); packageDetail.setPid(deliveryMain.getId()); list.add(packageDetail); } packageDetailService.saveBatch(list); } List<BoxSum> boxSums = etHeader.getBoxSums(); if (CollUtil.isNotEmpty(boxSums)) { List<LogisticsPackage> list = new ArrayList<>(); for (BoxSum boxSum : boxSums) { LogisticsPackage logisticsPackage = new LogisticsPackage(); BeanUtil.copyProperties(boxSum, logisticsPackage); logisticsPackage.setPid(deliveryMain.getId()); list.add(logisticsPackage); } logisticsPackageService.saveBatch(list); } }); } } src/main/java/com/gs/xiaomi/service/impl/DeliveryDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.gs.xiaomi.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gs.xiaomi.entity.DeliveryDetail; import com.gs.xiaomi.mapper.DeliveryDetailMapper; import com.gs.xiaomi.service.DeliveryDetailService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * @author 28567 * @description é对表ãDELIVERY_DETAILãçæ°æ®åºæä½Serviceå®ç° * @createDate 2025-04-10 14:16:44 */ @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class DeliveryDetailServiceImpl extends ServiceImpl<DeliveryDetailMapper, DeliveryDetail> implements DeliveryDetailService { } src/main/java/com/gs/xiaomi/service/impl/DeliveryMainServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.gs.xiaomi.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gs.xiaomi.entity.DeliveryMain; import com.gs.xiaomi.mapper.DeliveryMainMapper; import com.gs.xiaomi.service.DeliveryMainService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * @author 28567 * @description é对表ãDELIVERY_MAINãçæ°æ®åºæä½Serviceå®ç° * @createDate 2025-04-10 14:16:52 */ @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class DeliveryMainServiceImpl extends ServiceImpl<DeliveryMainMapper, DeliveryMain> implements DeliveryMainService { @Override public long getId() { return baseMapper.getNextVal(); } } src/main/java/com/gs/xiaomi/service/impl/LogisticsPackageServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.gs.xiaomi.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gs.xiaomi.entity.LogisticsPackage; import com.gs.xiaomi.mapper.LogisticsPackageMapper; import com.gs.xiaomi.service.LogisticsPackageService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * @author 28567 * @description é对表ãLOGISTICS_PACKAGEãçæ°æ®åºæä½Serviceå®ç° * @createDate 2025-04-10 14:17:13 */ @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class LogisticsPackageServiceImpl extends ServiceImpl<LogisticsPackageMapper, LogisticsPackage> implements LogisticsPackageService { } src/main/java/com/gs/xiaomi/service/impl/PackageDetailServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.gs.xiaomi.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.gs.xiaomi.entity.PackageDetail; import com.gs.xiaomi.mapper.PackageDetailMapper; import com.gs.xiaomi.service.PackageDetailService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * @author 28567 * @description é对表ãPACKAGE_DETAILãçæ°æ®åºæä½Serviceå®ç° * @createDate 2025-04-10 14:17:48 */ @Service @Transactional(rollbackFor = Exception.class) @RequiredArgsConstructor public class PackageDetailServiceImpl extends ServiceImpl<PackageDetailMapper, PackageDetail> implements PackageDetailService { } src/main/resources/application.yml
@@ -6,8 +6,8 @@ type: com.alibaba.druid.pool.DruidDataSource driver-class-name: oracle.jdbc.OracleDriver url: jdbc:oracle:thin:@122.226.249.238:5936/ORCL username: zmz_prd password: zmzprd username: xb_prd password: xbprd druid: initialSize: 5 minIdle: 5 @@ -37,15 +37,15 @@ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true jdbc-type-for-null: 'null' type-aliases-package: com.gs.xky.entity.* type-aliases-package: com.gs.xiaomi.entity.* mapper-locations: classpath:mapper/*.xml logging: level: root: info com.gs.xky.service.XkyService: debug # æå® XkyService è®°å½ debug 级å«çæ¥å¿ com.gs.xiaomi.service.XM104Service: debug # æå® XkyService è®°å½ debug 级å«çæ¥å¿ file: name: logs/xky_service.log # æå®æ¥å¿æä»¶è·¯å¾ name: logs/xm104_service.log # æå®æ¥å¿æä»¶è·¯å¾ pattern: file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" src/main/resources/mapper/DeliveryDetailMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.gs.xiaomi.mapper.DeliveryDetailMapper"> </mapper> src/main/resources/mapper/DeliveryMainMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.gs.xiaomi.mapper.DeliveryMainMapper"> <select id="getNextVal" resultType="java.lang.Long"> SELECT SEQ_DELIVERY_MAIN.NEXTVAL FROM DUAL </select> </mapper> src/main/resources/mapper/LogisticsPackageMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.gs.xiaomi.mapper.LogisticsPackageMapper"> </mapper> src/main/resources/mapper/PackageDetailMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.gs.xiaomi.mapper.PackageDetailMapper"> </mapper> src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
@@ -1,156 +1,18 @@ package com.gs.xiaomi; import com.alibaba.fastjson.JSON; import com.gs.xiaomi.config.DataAcquisitionConfiguration; import com.gs.xiaomi.dto.BizDocument; import com.gs.xiaomi.dto.BizDocumentResult; import com.gs.xiaomi.dto.ZfmWsApiRequest; import com.gs.xiaomi.service.SoapApiService; import com.gs.xiaomi.util.SoapXmlBuilder; import okhttp3.*; 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; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.IOException; import java.io.StringReader; @SpringBootTest class XiaomiApplicationTests { @Autowired private SoapApiService service; private XM104Service xm104Service; @Test void contextLoads() throws Exception { ZfmWsApiRequest req = new ZfmWsApiRequest(); req.setIvCode(DataAcquisitionConfiguration.IV_CODEXM104); req.setIvEvent(""); req.setIvFlag(""); BizDocument doc = new BizDocument(); doc.setBizDate("2025-04-01"); doc.setLifnr(DataAcquisitionConfiguration.LIFNR); req.setIvInfo(doc); req.setIvPass(DataAcquisitionConfiguration.getIvPass(DataAcquisitionConfiguration.IV_CODEXM104)); req.setIvUser(DataAcquisitionConfiguration.IV_USER); String soapXml = SoapXmlBuilder.build(req); System.out.println(soapXml); xm104Service.getDb(); } @Test void testService() throws Exception { ZfmWsApiRequest req = new ZfmWsApiRequest(); req.setIvCode(DataAcquisitionConfiguration.IV_CODEXM104); req.setIvEvent(""); req.setIvFlag(""); BizDocument doc = new BizDocument(); doc.setBizDate("2025-04-01"); doc.setLifnr(DataAcquisitionConfiguration.LIFNR); req.setIvInfo(doc); req.setIvPass(DataAcquisitionConfiguration.getIvPass(DataAcquisitionConfiguration.IV_CODEXM104)); req.setIvUser(DataAcquisitionConfiguration.IV_USER); BizDocumentResult bizDocumentResult = service.callAndParse(DataAcquisitionConfiguration.XM104_URL, req); System.out.println(JSON.toJSONString(bizDocumentResult)); } @Test void sta() throws IOException, JAXBException { OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("application/xml"); RequestBody body = RequestBody.create(mediaType, "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:sap-com:document:sap:rfc:functions\">\r\n <soapenv:Header/>\r\n <soapenv:Body>\r\n <urn:ZFM_WS_API>\r\n <IV_CODE>VDATA.XM104</IV_CODE>\r\n <IV_EVENT></IV_EVENT>\r\n <IV_FLAG></IV_FLAG>\r\n <IV_INFO><![CDATA[<?xml version=\"1.0\" encoding=\"utf-16\"?>\r\n<document>\r\n <BIZ_DATE>2025-04-01</BIZ_DATE>\r\n <I_LIFNR>177301</I_LIFNR>\r\n</document>]]></IV_INFO>\r\n <IV_PASS>D25932DF5772D0A2DF9620A2A0AB121A</IV_PASS>\r\n <IV_USER>V177301</IV_USER>\r\n </urn:ZFM_WS_API>\r\n </soapenv:Body>\r\n</soapenv:Envelope>"); Request request = new Request.Builder() .url("https://mipoq.p.mi.com/XISOAPAdapter/MessageServlet?p=ic/9e8a118fb0b7379aa11c2a5c2860982a&senderParty=&senderService=ZJ_XIAOBU_QAS&receiverParty=&receiverService=&interface=SI_ZFM_WS_API_OUT&interfaceNamespace=http://xiaomi.com/srm/b2b") .method("POST", body) // .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)") .addHeader("Content-Type", "application/xml") .addHeader("Authorization", "Basic UkZDWkpYSUFPQlU6cHBCOVIhSGU=") .addHeader("Accept", "*/*") // .addHeader("Host", "mipoq.p.mi.com") .addHeader("Connection", "keep-alive") // .addHeader("Cookie", "saplb_*=(J2EE4281420)4281450; MYSAPSSO2=AjExMDAgABJwb3J0YWw6UkZDWkpYSUFPQlWIAAdkZWZhdWx0AQALUkZDWkpYSUFPQlUCAAMwMDADAANQT1EEAAwyMDI1MDQwOTAwMTcFAAQAAAAICgALUkZDWkpYSUFPQlX%2FAQUwggEBBgkqhkiG9w0BBwKggfMwgfACAQExCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHATGB0DCBzQIBATAiMB0xDDAKBgNVBAMTA1BPUTENMAsGA1UECxMESjJFRQIBADAJBgUrDgMCGgUAoF0wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjUwNDA5MDAxNzU2WjAjBgkqhkiG9w0BCQQxFgQUvvJ1HSnOLckboGYaMR9Wiaem6z4wCQYHKoZIzjgEAwQvMC0CFQDKLPrpUC19VM2gcslWaHAnh7dfxQIUNs2dTxwGcKdNU%2FdAQPs4f08yaw4%3D; JSESSIONID=_6bPldDq9mFJPXEd11bc-GvrWMAVlgFqVEEA_SAPF-GrpRbcuqxMK_gShBYGdmdp; JSESSIONMARKID=nUs7PQMlYui9UqFCm4Z-ZRqUiI8YQ_hLJPJWpUQQA") .build(); Response response = client.newCall(request).execute(); if (response.isSuccessful() && response.body() != null) { 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); String innerXml = extractCdata(decodedXml); if (innerXml == null) throw new RuntimeException("No CDATA <document> found in response"); // JAXBContext context = JAXBContext.newInstance(BizDocumentResult.class); // Unmarshaller unmarshaller = context.createUnmarshaller(); //BizDocumentResult unmarshal = (BizDocumentResult) unmarshaller.unmarshal(new StringReader(decodedXml)); System.out.println(JSON.toJSONString(innerXml)); } else { throw new RuntimeException("SOAP request failed: " + response.code() + " - " + response.message()); } } @Test void contextLoads2() throws Exception { String bodyStr = "<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'>" + " <SOAP:Header/>" + " <SOAP:Body xmlns:urn='urn:sap-com:document:sap:rfc:functions'>" + " <n0:ZFM_WS_APIResponse xmlns:n0='urn:sap-com:document:sap:rfc:functions' xmlns:prx='urn:sap.com:proxy:FRD:/1SAI/TAS82FD47019F21003C052D:752'>" + " <EV_CODE>Y</EV_CODE>" + " <EV_EVENT/>" + " <EV_FLAG/>" + " <EV_RESULT><?xml version=\"1.0\" encoding=\"utf-8\"?><document><et_headers type=\"h\"><et_header idx=\"1\"><zzasn>9311031471</zzasn><zzasn_type>BL</zzasn_type><imclr></imclr><lifnr>0000177301</lifnr><vendor_name>æµæ±å°æ¥åºè¡æéå ¬å¸</vendor_name><zzship_addr>æµè¯</zzship_addr><zzship_name>11</zzship_name><zzship_phon>1111</zzship_phon><zzship_date>2025-04-01</zzship_date><zzwarehouse_id>0000017560</zzwarehouse_id><zzwarehouse>ä¸å°ä»¶-å京ä¸å¿ä»</zzwarehouse><zzreceive_addr>å京å¸å¤§å ´åºç»æµå¼ååºç§ååè¡åäºå·(亦åºå°ç±³äº§ä¸å)T1楼1å±</zzreceive_addr><zzcarrier></zzcarrier><zzdriver_name></zzdriver_name><zzdriver_phon></zzdriver_phon><zzarrive_time>20250402</zzarrive_time><zzarrive_time1>00:00:00</zzarrive_time1><zzcarrier_no></zzcarrier_no><road_transport_no></road_transport_no><zztrans_model></zztrans_model><zzdriver_license></zzdriver_license><zzlicense_numb></zzlicense_numb><zzseal_no></zzseal_no><zzcanceled></zzcanceled><ship_email>11@163.com</ship_email><lifnr_dg></lifnr_dg><short_name></short_name><reserve_date></reserve_date><reserve_time></reserve_time><bukrs>1110</bukrs><asn_desc></asn_desc><price_stat></price_stat><final_contact></final_contact><final_phone></final_phone><final_addr></final_addr><final_company></final_company><status>S002</status><status_sn></status_sn><purchase_mode></purchase_mode><hub_lifnr></hub_lifnr><items type=\"h\"><item idx=\"1\"><zzasn>9311031471</zzasn><zzitem_id>0000000010</zzitem_id><zzpo_no>4500173648</zzpo_no><zzpo_item_id>0000000010</zzpo_item_id><zzreqnr></zzreqnr><zzreqln></zzreqln><zzproduct_id>950102000010</zzproduct_id><zzvproduct_id></zzvproduct_id><zzsku>BHR4008CN</zzsku><zzquantity>5.000</zzquantity><zzunit>ST</zzunit><brand></brand><place></place><brand_type></brand_type><is_identification></is_identification><zzopen_qty>5.000</zzopen_qty><changed_at>20250401071304</changed_at><created_at>20250401071304</created_at><app_models>11-AD</app_models><ext_doc_no>8897300</ext_doc_no><ext_doc_item>2884654</ext_doc_item><address_detail>å京å¸å¤§å ´åºç»æµå¼ååºç§ååè¡åäºå·(亦åºå°ç±³äº§ä¸å)T1楼1å±</address_detail><batch_id></batch_id><batch_row></batch_row><xmsto_no></xmsto_no><xmsto_item_no></xmsto_item_no><modelnumber></modelnumber><shipment_id></shipment_id><shipmentid_num>0</shipmentid_num><maktx>米家æºè½ä¾§å¸æ²¹çæº</maktx><bednr></bednr><ware_type_from></ware_type_from><ware_type_to></ware_type_to><act_gr_qty>0.000</act_gr_qty><pn_matnr_l></pn_matnr_l><pn_matnr_name></pn_matnr_name></item></items><box_items type=\"h\"></box_items><box_sums type=\"h\"></box_sums><purchase_mode2></purchase_mode2><receiver>æ¨ä¸¹ä¸¹,卿¨å </receiver><receive_phone>18811578183,13002157815</receive_phone><receive_addr>å京å¸å¤§å ´åºç»æµå¼ååºç§ååè¡åäºå·(亦åºå°ç±³äº§ä¸å)T1楼1å±</receive_addr><receive_warehouse_id>0000017560</receive_warehouse_id><receive_warehouse_short>ä¸å°ä»¶-å京ä¸å¿ä»</receive_warehouse_short><product_type>GM</product_type><ekorg>2120</ekorg><ekotx></ekotx><stock_org_from></stock_org_from><stock_org_from_desc></stock_org_from_desc><stock_org_to>MI_IOT</stock_org_to><stock_org_to_desc>çæé¾åºåç»ç»(IOT)</stock_org_to_desc><migo_type></migo_type><zrproject>A1</zrproject><logistics_no></logistics_no><logistics_company></logistics_company><last4_phone_number></last4_phone_number><logistics_company_name></logistics_company_name><business_model></business_model></et_header></et_headers><ev_message></ev_message><ev_msgty>S</ev_msgty></document></EV_RESULT>" + " </n0:ZFM_WS_APIResponse>" + " </SOAP:Body>" + "</SOAP:Envelope>"; String evCode = extractEvCode(bodyStr); if (!"Y".equalsIgnoreCase(evCode)) { throw new RuntimeException("SOAP business failed, EV_CODE: " + evCode); } String decodedXml = decodeXmlEntities(bodyStr); String innerXml = extractCdata(decodedXml); if (innerXml == null) throw new RuntimeException("No CDATA <document> found in response"); JAXBContext context = JAXBContext.newInstance(BizDocumentResult.class); Unmarshaller unmarshaller = context.createUnmarshaller(); BizDocumentResult unmarshal = (BizDocumentResult) unmarshaller.unmarshal(new StringReader(innerXml)); System.out.println(JSON.toJSONString(unmarshal)); } private String extractEvCode(String xml) { int start = xml.indexOf("<EV_CODE>"); int end = xml.indexOf("</EV_CODE>", start); if (start == -1 || end == -1) return null; return xml.substring(start + 9, end).trim(); } private String decodeXmlEntities(String xml) { return xml.replace("<", "<") .replace(">", ">") .replace("<", "<") .replace(">", ">") .replace("&", "&"); } private String extractCdata(String xml) { int cdataStart = xml.indexOf("<EV_RESULT>"); int cdataEnd = xml.indexOf("</EV_RESULT>", cdataStart); if (cdataStart == -1 || cdataEnd == -1) return null; return xml.substring(cdataStart + 11, cdataEnd).trim(); } }