src/main/java/com/gs/xiaomi/dto/BoxItem.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gs/xiaomi/dto/BoxSum.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gs/xiaomi/dto/EtHeader.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gs/xiaomi/dto/Item.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gs/xiaomi/service/SoapApiService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/gs/xiaomi/dto/BoxItem.java
@@ -11,96 +11,95 @@ @Data public class BoxItem { /* 物流包装信息 */ @XmlElement(name = "BOX_SEQ") private String boxSeq; // 箱单序号 @XmlElement(name = "box_seq") private String boxSeq; // 箱单流水号 @XmlElement(name = "BOX_NO") private String boxNo; // 箱号 @XmlElement(name = "box_no") private String boxNo; // 包装箱唯一标识 @XmlElement(name = "CARTONID") private String cartonid; // 小米箱号 @XmlElement(name = "cartonid") private String cartonid; // 小米专用箱号(加密格式) /* 采购与单据信息 */ @XmlElement(name = "ZZASN") private String zzasn; // 送货单号 /* 采购与单据信息(6个核心字段) */ @XmlElement(name = "zzasn") private String zzasn; // 全球统一送货单号 @XmlElement(name = "matnr") private String matnr; // 国际物料编码 @XmlElement(name = "MATNR") private String matnr; // 物料编号 @XmlElement(name = "maktx") private String maktx; // 多语言物料描述 @XmlElement(name = "MAKTX") private String maktx; // 物料描述 /* 规格与数量体系(18个计量字段) */ @XmlElement(name = "pc_qty") private String pcQty; // 实际发货件数 /* 规格与数量 */ @XmlElement(name = "PC_QTY") private String pcQty; // 发货数量 @XmlElement(name = "lot_no") private String lotNo; // 托盘唯一编号 @XmlElement(name = "LOT_NO") private String lotNo; // 托盘号 @XmlElement(name = "ntgew_p") private String ntgewP; // 单件净重(克/件) @XmlElement(name = "NTGEW_P") private String ntgewP; // 单件净重(G/PCS) @XmlElement(name = "brgew_p") private String brgewP; // 单箱毛重(千克/箱) @XmlElement(name = "BRGEW_P") private String brgewP; // 单箱毛重(KG/箱) @XmlElement(name = "lot_size") private String lotSize; // 托盘装载规格 @XmlElement(name = "LOT_SIZE") private String lotSize; // 托盘尺寸(m) @XmlElement(name = "box_size") private String boxSize; // 标准化箱体尺寸 @XmlElement(name = "BOX_SIZE") private String boxSize; // 单箱尺寸(cm) @XmlElement(name = "total_vlume") private String totalVlume; // 含托盘总体积 @XmlElement(name = "TOTAL_VLUME") private String totalVlume; // 含托体积(m³) @XmlElement(name = "box_qty") private String boxQty; // 总箱数 @XmlElement(name = "BOX_QTY") private String boxQty; // 箱数 @XmlElement(name = "ebeln") private String ebeln; // 采购订单号 @XmlElement(name = "EBELN") private String ebeln; // 采购凭证号 @XmlElement(name = "ebelp") private String ebelp; // 采购订单行号 @XmlElement(name = "EBELP") private String ebelp; // 采购凭证项目编号 @XmlElement(name = "box_spec") private String boxSpec; // 单箱容量(件/箱) @XmlElement(name = "BOX_SPEC") private String boxSpec; // 单箱包规(pcs/箱) @XmlElement(name = "ntgew") private String ntgew; // 总净重(自动计算值) @XmlElement(name = "NTGEW") private String ntgew; // 总净重=PC_QTY*NTGEW_P @XmlElement(name = "brgew") private String brgew; // 总毛重(含包装) @XmlElement(name = "BRGEW") private String brgew; // 总毛重 @XmlElement(name = "meins") private String meins; // 国际计量单位 @XmlElement(name = "MEINS") private String meins; // 计量单位 @XmlElement(name = "l_m") private String lM; // 托盘长度(米) @XmlElement(name = "BRAND") private String brand; // 品牌 @XmlElement(name = "w_m") private String wM; // 托盘宽度(米) @XmlElement(name = "PLACE") private String place; // 产地 @XmlElement(name = "h_m") private String hM; // 托盘堆高(米) @XmlElement(name = "IMCLR") private String imclr; // 进口报关标识 /* 商品与监管信息(7个关键字段) */ @XmlElement(name = "brand") private String brand; // 品牌认证标识 @XmlElement(name = "MODELNUMBER") private String modelnumber; // 型号 @XmlElement(name = "place") private String place; // 原产地编码 @XmlElement(name = "MATNR_JG") private String matnrJg; // 监管条件 @XmlElement(name = "imclr") private String imclr; // 海关报关标识 @XmlElement(name = "MATNR_JYJY") private String matnrJyjy; // 检验检疫 @XmlElement(name = "modelnumber") private String modelnumber; // 国际型号编码 @XmlElement(name = "L_M") private String lM; // 托盘长(m) @XmlElement(name = "matnr_jg") private String matnrJg; // 海关监管条件 @XmlElement(name = "W_M") private String wM; // 托盘宽(m) @XmlElement(name = "H_M") private String hM; // 托盘高(m) @XmlElement(name = "matnr_jyjy") private String matnrJyjy; // 检验检疫代码 } src/main/java/com/gs/xiaomi/dto/BoxSum.java
@@ -11,89 +11,97 @@ @Data public class BoxSum { @XmlElement(name = "BOX_SEQ") private String boxSeq; // 箱单序列号 /* 物流包装核心标识(3项) */ @XmlElement(name = "box_seq") private String boxSeq; // 箱单流水号 @XmlElement(name = "BOX_NO") private String boxNo; // 物理箱号 @XmlElement(name = "box_no") private String boxNo; // 物理包装标识 @XmlElement(name = "ZZASN") private String zzasn; // 送货单号 @XmlElement(name = "cartonid") private String cartonid; // 小米箱号(保留原字段) @XmlElement(name = "MATNR") private String matnr; // SAP物料编号 /* 单据与物料体系(5项) */ @XmlElement(name = "zzasn") private String zzasn; // 全球统一送货单号 @XmlElement(name = "MAKTX") private String maktx; // 物料中文描述 @XmlElement(name = "matnr") private String matnr; // SAP标准物料编码 @XmlElement(name = "PC_QTY") private String pcQty; // 实际发货数量 @XmlElement(name = "maktx") private String maktx; // 多语言物料描述 @XmlElement(name = "LOT_NO") private String lotNo; // 托盘编号 /* 计量参数体系(12项) */ @XmlElement(name = "pc_qty") private String pcQty; // 实际发货件数 @XmlElement(name = "NTGEW_P") private String ntgewP; // 单件净重(公式:物料净重G/PCS) @XmlElement(name = "lot_no") private String lotNo; // 物流托盘编号 @XmlElement(name = "BRGEW_P") private String brgewP; // 单箱毛重(KG/箱) @XmlElement(name = "ntgew_p") private String ntgewP; // 单件净重(克/件) @XmlElement(name = "LOT_SIZE") private String lotSize; // 托盘尺寸(米制) @XmlElement(name = "brgew_p") private String brgewP; // 单箱毛重(千克/箱) @XmlElement(name = "BOX_SIZE") private String boxSize; // 单箱尺寸(厘米) /* 规格维度(6项) */ @XmlElement(name = "lot_size") private String lotSize; // 托盘装载规格 @XmlElement(name = "TOTAL_VLUME") @XmlElement(name = "box_size") private String boxSize; // 标准箱体尺寸 @XmlElement(name = "total_vlume") // 注意字段拼写建议修正为volume private String totalVlume; // 含托盘总体积 @XmlElement(name = "BOX_QTY") private String boxQty; // 总箱数 /* 采购凭证信息块 */ @XmlElement(name = "EBELN") private String ebeln; // 采购凭证号 @XmlElement(name = "EBELP") private String ebelp; // 采购凭证项目编号 @XmlElement(name = "BOX_SPEC") private String boxSpec; // 单箱容量规格 @XmlElement(name = "NTGEW") private String ntgew; // 总净重(公式:PC_QTY*NTGEW_P) @XmlElement(name = "BRGEW") private String brgew; // 总毛重(自动计算值) /* 基础计量信息块 */ @XmlElement(name = "MEINS") private String meins; // 基本计量单位 @XmlElement(name = "BRAND") private String brand; // 制造商品牌 @XmlElement(name = "PLACE") private String place; // 原产地信息 @XmlElement(name = "IMCLR") private String imclr; // 小米进口报关标识 @XmlElement(name = "MODELNUMBER") private String modelnumber; // 产品型号 @XmlElement(name = "MATNR_JG") private String matnrJg; // 海关监管条件 @XmlElement(name = "MATNR_JYJY") private String matnrJyjy; // 检验检疫要求 @XmlElement(name = "L_M") @XmlElement(name = "l_m") private String lM; // 托盘长度(米) @XmlElement(name = "W_M") @XmlElement(name = "w_m") private String wM; // 托盘宽度(米) @XmlElement(name = "H_M") private String hM; // 托盘高度(米) @XmlElement(name = "h_m") private String hM; // 托盘堆高(米) /* 采购凭证信息(4项) */ @XmlElement(name = "ebeln") private String ebeln; // 采购订单号 @XmlElement(name = "ebelp") private String ebelp; // 采购订单行号 @XmlElement(name = "box_spec") private String boxSpec; // 单箱容量规格 @XmlElement(name = "box_qty") private String boxQty; // 总包装箱数 /* 重量计算体系(3项) */ @XmlElement(name = "ntgew") private String ntgew; // 自动计算总净重 @XmlElement(name = "brgew") private String brgew; // 系统核算总毛重 @XmlElement(name = "meins") private String meins; // 国际计量单位 /* 贸易合规信息(7项) */ @XmlElement(name = "brand") private String brand; // 品牌认证标识 @XmlElement(name = "place") private String place; // 原产地编码 @XmlElement(name = "imclr") private String imclr; // 报关标识 @XmlElement(name = "modelnumber") private String modelnumber; // 国际型号编码 @XmlElement(name = "matnr_jg") private String matnrJg; // 海关监管条件 @XmlElement(name = "matnr_jyjy") private String matnrJyjy; // 检验检疫代码 } src/main/java/com/gs/xiaomi/dto/EtHeader.java
@@ -11,36 +11,201 @@ @XmlAccessorType(XmlAccessType.FIELD) @Data public class EtHeader { /* 核心单据信息块 */ @XmlElement(name = "zzasn") private String zzasn; private String zzasn; // 送货单号(主键) @XmlElement(name = "zzasn_type") private String zzasnType; private String zzasnType; // 单据类型(普通/紧急) @XmlElement(name = "migo_type") private String migoType; // 收货类型(标准/退货) /* 采购与库存管理块 */ @XmlElement(name = "zrproject") private String zrproject; // 项目调拨编号 @XmlElement(name = "ekorg") private String ekorg; // 采购组织编码 @XmlElement(name = "ekotx") private String ekotx; // 采购组织描述 @XmlElement(name = "stock_org_from") private String stockOrgFrom; // 调出库存组织编码 @XmlElement(name = "stock_org_from_desc") private String stockOrgFromDesc; // 调出库存描述 @XmlElement(name = "stock_org_to") private String stockOrgTo; // 调入库存组织编码 @XmlElement(name = "stock_org_to_desc") private String stockOrgToDesc; // 调入库存描述 /* 供应商与合作伙伴块 */ @XmlElement(name = "lifnr") private String lifnr; private String lifnr; // 供应商编码(示例值:130479) @XmlElement(name = "vendor_name") private String vendorName; private String vendorName; // 供应商全称 @XmlElement(name = "zzship_addr") private String zzshipAddr; @XmlElement(name = "short_name") private String shortName; // 供应商简称 @XmlElement(name = "hub_lifnr") private String hubLifnr; // HUB供应商编码 /* 物流运输信息块 */ @XmlElement(name = "zzcarrier") private String zzcarrier; // 承运商名称 @XmlElement(name = "zzcarrier_no") private String zzcarrierNo; // 承运单号 @XmlElement(name = "road_transport_no") private String roadTransportNo; // 运输单据号 @XmlElement(name = "zztrans_model") private String zztransModel; // 运输车型 @XmlElement(name = "zzlicense_numb") private String zzlicenseNumb; // 车牌号 @XmlElement(name = "zzseal_no") private String zzsealNo; // 铅封号 @XmlElement(name = "logistics_no") private String logisticsNo; // 物流单号 @XmlElement(name = "logistics_company") private String logisticsCompany; // 物流公司编码 @XmlElement(name = "logistics_company_name") private String logisticsCompanyName; // 物流公司全称 /* 联系人信息块 */ @XmlElement(name = "zzship_name") private String zzshipName; private String zzshipName; // 发货人姓名 @XmlElement(name = "zzship_phon") private String zzshipPhon; // 发货人电话 @XmlElement(name = "zzdriver_name") private String zzdriverName; // 司机姓名 @XmlElement(name = "zzdriver_phon") private String zzdriverPhon; // 司机电话 @XmlElement(name = "last4_phone_number") private String last4PhoneNumber; // 手机尾号 @XmlElement(name = "receiver") private String receiver; // 收货人 @XmlElement(name = "receive_phone") private String receivePhone; // 收货电话 @XmlElement(name = "final_contact") private String finalContact; // 最终收货人 @XmlElement(name = "final_phone") private String finalPhone; // 最终联系电话 /* 地址信息块 */ @XmlElement(name = "zzship_addr") private String zzshipAddr; // 发货地址 @XmlElement(name = "zzreceive_addr") private String zzreceiveAddr; // 标准收货地址 @XmlElement(name = "receive_addr") private String receiveAddr; // 实际收货地址 @XmlElement(name = "final_addr") private String finalAddr; // 最终配送地址 @XmlElement(name = "final_company") private String finalCompany; // 最终收货单位 /* 时间控制块 */ @XmlElement(name = "zzship_date") private String zzshipDate; private String zzshipDate; // 发货日期(yyyyMMdd) @XmlElement(name = "zzarrive_time") private String zzarriveTime; // 预计到货日期 @XmlElement(name = "zzarrive_time1") private String zzarriveTime1; // 预计到货时间(HHmm) @XmlElement(name = "reserve_date") private String reserveDate; // 预约日期 @XmlElement(name = "reserve_time") private String reserveTime; // 预约时间段 /* 仓库管理块 */ @XmlElement(name = "zzwarehouse_id") private String zzwarehouseId; // 仓库唯一标识 @XmlElement(name = "receive_warehouse_id") private String receiveWarehouseId; // 收货仓库ID @XmlElement(name = "receive_warehouse_short") private String receiveWarehouseShort; // 仓库简称 @XmlElement(name = "bukrs") private String bukrs; // 公司代码 /* 状态控制块 */ @XmlElement(name = "status") private String status; // 单据状态(新建/已发货/已完成) @XmlElement(name = "status_sn") private String statusSn; // 条码状态(已上传/未上传) @XmlElement(name = "zzcanceled") private String zzcanceled; // 作废标识 @XmlElement(name = "price_stat") private String priceStat; // 价格审核状态 /* 业务模式块 */ @XmlElement(name = "purchase_mode") private String purchaseMode; // 仓库作业指导类型 @XmlElement(name = "purchase_mode2") private String purchaseMode2; // 采购模式(VMI/JIT) @XmlElement(name = "business_model") private String businessModel; // 交料模式(自提/配送) /* 扩展信息块 */ @XmlElement(name = "asn_desc") private String asnDesc; // 单据描述 @XmlElement(name = "imclr") private String imclr; // 进口报关标识 @XmlElement(name = "lifnr_dg") private String lifnrDg; // 外部工厂代码 @XmlElement(name = "product_type") private String productType; // 生产类型(自制/外购) @XmlElement(name = "zzdriver_license") private String zzdriverLicense; // 驾驶证号 /* 附件信息块 */ @XmlElementWrapper(name = "items") @XmlElement(name = "item") private List<Item> items; private List<Item> items;// 行项目明细 @XmlElementWrapper(name = "BOX_ITEMS") @XmlElementWrapper(name = "box_items") @XmlElement(name = "boxItems") private List<BoxItem> boxItems; private List<BoxItem> boxItems; // 箱单明细 @XmlElementWrapper(name = "BOX_SUMS") @XmlElementWrapper(name = "box_sums") @XmlElement(name = "boxSum") private List<BoxSum> boxSums; private List<BoxSum> boxSums; // 箱数汇总 } src/main/java/com/gs/xiaomi/dto/Item.java
@@ -11,115 +11,114 @@ @Data public class Item { // 基础单据信息 /* 基础单据标识 */ @XmlElement(name = "ZZASN") @XmlElement(name = "zzasn") private String zzasn; // 送货单号 @XmlElement(name = "ZZITEM_ID") @XmlElement(name = "zzitem_id") private String zzitemId; // 送货单行号 @XmlElement(name = "ZZPO_NO") @XmlElement(name = "zzpo_no") private String zzpoNo; // 采购凭证号 @XmlElement(name = "ZZPO_ITEM_ID") @XmlElement(name = "zzpo_item_id") private String zzpoItemId; // PO行项目 /* 退换货关联信息 */ @XmlElement(name = "ZZREQNR") @XmlElement(name = "zzreqnr") private String zzreqnr; // 小米退换货单号 @XmlElement(name = "ZZREQLN") @XmlElement(name = "zzreqln") private String zzreqln; // 申请单行项目 /* 物料信息体系 */ @XmlElement(name = "ZZPRODUCT_ID") @XmlElement(name = "zzproduct_id") private String zzproductId; // 小米物料号 @XmlElement(name = "ZZVPRODUCT_ID") @XmlElement(name = "zzvproduct_id") private String zzvproductId; // 工厂料号 @XmlElement(name = "ZZSKU") @XmlElement(name = "zzsku") private String zzsku; // SKU @XmlElement(name = "MAKTX") @XmlElement(name = "maktx") private String maktx; // 物料描述 @XmlElement(name = "MODELNUMBER") @XmlElement(name = "modelnumber") private String modelnumber; // 型号 /* 计量与库存数据 */ @XmlElement(name = "ZZQUANTITY") @XmlElement(name = "zzquantity") private String zzquantity; // 订单数量 @XmlElement(name = "ZZUNIT") @XmlElement(name = "zzunit") private String zzunit; // 计量单位 @XmlElement(name = "ZZOPEN_QTY") @XmlElement(name = "zzopen_qty") private String zzopenQty; // 开放数量 @XmlElement(name = "ACT_GR_QTY") @XmlElement(name = "act_gr_qty") private String actGrQty; // 实收数量 @XmlElement(name = "SHIPMENTID_NUM") @XmlElement(name = "shipmentid_num") private String shipmentidNum; // Shipment数量 /* 品牌与产地信息 */ @XmlElement(name = "BRAND") @XmlElement(name = "brand") private String brand; // 品牌 @XmlElement(name = "PLACE") @XmlElement(name = "place") private String place; // 产地 @XmlElement(name = "BRAND_TYPE") @XmlElement(name = "brand_type") private String brandType; // 品牌类型 /* 物流追踪信息 */ @XmlElement(name = "ZSHIPMENT_ID") @XmlElement(name = "zshipment_id") private String zshipmentId; // Shipment ID @XmlElement(name = "ADDRESS_DETAIL") @XmlElement(name = "address_detail") private String addressDetail; // 地址详情 /* 调拨管理字段 */ @XmlElement(name = "BEDNR") @XmlElement(name = "bednr") private String bednr; // 调出项目号 @XmlElement(name = "WARE_TYPE_FROM") @XmlElement(name = "ware_type_from") private String wareTypeFrom; // 调出仓类型 @XmlElement(name = "WARE_TYPE_TO") @XmlElement(name = "ware_type_to") private String wareTypeTo; // 调入仓类型 @XmlElement(name = "XMSTO_NO") @XmlElement(name = "xmsto_no") private String xmstoNo; // 物控调拨单号 @XmlElement(name = "XMSTO_ITEM_NO") @XmlElement(name = "xmsto_item_no") private String xmstoItemNo; // 调拨单行项 /* 系统控制字段 */ @XmlElement(name = "CHANGED_AT") @XmlElement(name = "changed_at") private String changedAt; // 修改时间 @XmlElement(name = "CREATED_AT") @XmlElement(name = "created_at") private String createdAt; // 创建时间 /* 扩展业务字段 */ @XmlElement(name = "APP_MODELS") @XmlElement(name = "app_models") private String appModels; // 项目机型 @XmlElement(name = "EXT_DOC_NO") @XmlElement(name = "ext_doc_no") private String extDocNo; // 外部凭证号 @XmlElement(name = "EXT_DOC_ITEM") @XmlElement(name = "ext_doc_item") private String extDocItem; // 外部凭证行项 @XmlElement(name = "BATCH_ID") @XmlElement(name = "batch_id") private String batchId; // HS编码 @XmlElement(name = "BATCH_ROW") @XmlElement(name = "batch_row") private String batchRow; // 优先采购项 @XmlElement(name = "IS_IDENTIFICATION") @XmlElement(name = "is_identification") private String isIdentification; // 串号管理标识 } src/main/java/com/gs/xiaomi/service/SoapApiService.java
@@ -23,10 +23,15 @@ if (response.isSuccessful() && response.body() != null) { String bodyStr = response.body().string(); String innerXml = extractCdata(bodyStr); if (innerXml == null) throw new RuntimeException("No CDATA <document> found in response"); String evCode = extractEvCode(bodyStr); if (!"Y".equalsIgnoreCase(evCode)) { throw new RuntimeException("SOAP business failed, EV_CODE: " + evCode); } String decodedXml = decodeXmlEntities(innerXml); 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(); @@ -45,7 +50,7 @@ .method("POST", body) // .addHeader("User-Agent", "Apifox/1.0.0 (https://apifox.com)") .addHeader("Content-Type", "application/xml") .addHeader("Authorization", "Basic UkZDWkpYSUFPQlU6cHBCOVIhSGU=") .addHeader("Authorization", "Basic ") .addHeader("Accept", "*/*") .addHeader("Host", "mipoq.p.mi.com") .addHeader("Connection", "keep-alive") @@ -55,11 +60,11 @@ return client.newCall(request).execute(); } private String extractCdata(String xml) { int cdataStart = xml.indexOf("<![CDATA["); int cdataEnd = xml.indexOf("]]>", cdataStart); if (cdataStart == -1 || cdataEnd == -1) return null; return xml.substring(cdataStart + 9, cdataEnd).trim(); 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) { @@ -69,4 +74,11 @@ .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(); } }