Commit daf19865 authored by Allen Chen's avatar Allen Chen

commit

parent 4b6442a9
......@@ -29,12 +29,12 @@
<java.version>17</java.version>
</properties>
<dependencies>
<!-- <dependency>-->
<!-- <groupId>org.ta</groupId>-->
<!-- <artifactId>CommonCore</artifactId>-->
<!-- <version>1.0.1</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<dependency>
<groupId>org.ta</groupId>
<artifactId>CommonCore</artifactId>
<version>1.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
......@@ -49,28 +49,13 @@
</dependency>
<!-- mysql -->
<!-- <dependency>-->
<!-- <groupId>mysql</groupId>-->
<!-- <artifactId>mysql-connector-java</artifactId>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>com.baomidou</groupId>-->
<!-- <artifactId>mybatis-plus-spring-boot3-starter</artifactId>-->
<!-- </dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
......@@ -78,26 +63,27 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<!-- 图片压缩工具 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.16</version>
<scope>compile</scope>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.19</version>
</dependency>
<!-- HTTP请求工具(用于下载网络图片,也可使用Spring自带RestTemplate) -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-core</artifactId>
<version>3.5.9</version>
<scope>compile</scope>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring</artifactId>
<version>3.5.9</version>
<scope>compile</scope>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
......@@ -109,15 +95,16 @@
<version>3.5.6</version>
<configuration>
<includeSystemScope>true</includeSystemScope>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.42</version>
</exclude>
</excludes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
......
......@@ -24,32 +24,49 @@ import org.ta.pddserver.utils.PddSignTool;
import java.io.BufferedReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Slf4j
@RestController
public class PddFZController {
private static final String PROVIDER_CODE = "HAIJI_KR";
private static final String WAREHOUSE_CODE = "HJJY001";
private static final String CLIENT_ID = "27dbbb055eef41e28124f03fdb26fba8";
private static final String CLIENT_SECRET = "4be28e29e58012b72b080431a8d47ec2ba7cab4d";
@Resource
LogOrderMailDetailImpl logOrderMailDetailImpl;
@Resource
private TraceObjectImpl traceObjectImpl;
private static String getNowString() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
}
@GetMapping("/notify/{code}")
public void subscribe(@PathVariable("code") String code) {
public void notify(@PathVariable("code") String code) {
// code 给拼多多要发的订单code
// 根据code 查询相应信息组装发给pdd
PddLogisticsCoTrackNotifyRequest request = new PddLogisticsCoTrackNotifyRequest();
request.setClient_id("8f5f3f9c92e847b2894fc9c0afce3d61");
request.setClient_id(CLIENT_ID);
request.setShip_id("567");
request.setTarget_client_id("8f5f3f9c92e847b2894fc9c0afce3d61");
request.setTarget_client_id(CLIENT_ID);
request.setTimestamp(System.currentTimeMillis() / 1000);
PddLogisticsCoTrackNotifyRequest.DataObject dataObject = getDataObject(code);
request.setDataObject(dataObject);
request.encodeData();
request.setSign(PddSignTool.generateSign(request, "281d79ad5117d20a51efb9e7b0d5f7ee336399b0"));
request.setSign(PddSignTool.generateSign(request, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(request));
String resp = PddHttpTool.sendJsonPost(request);
log.info("resp = {}", resp);
......@@ -70,4 +87,96 @@ public class PddFZController {
return dataObjects;
}
@GetMapping("/bizAction/{mailNo}/{action}")
public void bizAction(@PathVariable("mailNo") String mailNo, @PathVariable("action") String action) {
LogOrderMailDetailEntity logOrderMailDetailEntity = logOrderMailDetailImpl.getByMailNo(mailNo);
PddServiceConsoFirstBizActionNotifyRequest notifyRequest = new PddServiceConsoFirstBizActionNotifyRequest();
notifyRequest.setProviderCode(PROVIDER_CODE);
notifyRequest.setExecuteTime(getNowString());
notifyRequest.setTimeZone("UTC+8");
notifyRequest.setLogisticsOrderCode(logOrderMailDetailEntity.getLogisticsOrderCode());
notifyRequest.setBizAction(action);
notifyRequest.setMailNo(logOrderMailDetailEntity.getMailNo());
notifyRequest.setExpressCode(logOrderMailDetailEntity.getExpressCode());
PddServiceConsoFirstBizActionNotifyRequest.Result notifyResult = new PddServiceConsoFirstBizActionNotifyRequest.Result();
if (action == "warehouse_sign") {
notifyRequest.setBizActionDesc("仓库签收");
} else if (action == "warehouse_reject_sign") {
notifyRequest.setBizActionDesc("仓库拒签");
notifyResult.setCode(22);
notifyResult.setDesc("运输品类限制");
notifyResult.setRemark("运输品类限制");
notifyRequest.setResult(notifyResult);
} else if (action == "destroy") {
notifyRequest.setBizActionDesc("包裹销毁");
notifyResult.setCode(0);
}
log.info("derelictionRequest:{}", JSON.toJSONString(notifyRequest));
JYBaseRequestModel requestModel = new JYBaseRequestModel();
requestModel.setRequest(JSON.toJSONString(notifyRequest));
requestModel.setRequest_id("" + new Date().getTime());
requestModel.setType("pdd.service.conso.first.biz.action.notify");
requestModel.setTarget_client_id(CLIENT_ID);
requestModel.setClient_id(CLIENT_ID);
long time = new Date().getTime() / 1000;
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(requestModel));
// String resp = PddHttpTool.postRequest(requestModel);
String resp = PddHttpTool.sendJsonPost(requestModel);
log.info("resp = {}", resp);
}
@GetMapping("/inBound/{mailNo}/{action}")
public void inBound(@PathVariable("mailNo") String mailNo, @PathVariable("action") String action) {
LogOrderMailDetailEntity logOrderMailDetailEntity = logOrderMailDetailImpl.getByMailNo(mailNo);
PddServiceConsoInboundRequest notifyRequest = new PddServiceConsoInboundRequest();
// PddServiceConsoFirstBizActionNotifyRequest notifyRequest = new PddServiceConsoFirstBizActionNotifyRequest();
notifyRequest.setProviderCode(PROVIDER_CODE);
notifyRequest.setLogisticsOrderCode(logOrderMailDetailEntity.getLogisticsOrderCode());
notifyRequest.setExecuteTime(getNowString());
notifyRequest.setTimeZone("UTC+8");
notifyRequest.setStatus("PART_INBOUND");
notifyRequest.setPackageQuantity(1L);
notifyRequest.setPackageInfo(new PddServiceConsoInboundRequest.PackageInfo());
notifyRequest.getPackageInfo().setMailNo(mailNo);
notifyRequest.getPackageInfo().setExpressCode(logOrderMailDetailEntity.getExpressCode());
notifyRequest.getPackageInfo().setLength(30L);
notifyRequest.getPackageInfo().setWidth(30L);
notifyRequest.getPackageInfo().setHeight(30L);
notifyRequest.getPackageInfo().setWeight(300L);
notifyRequest.getPackageInfo().setActualWeight(300L);
notifyRequest.getPackageInfo().setGoodsType("NORMAL");
notifyRequest.setResult(new PddServiceConsoInboundRequest.Result());
notifyRequest.getResult().setCode(0);
log.info("derelictionRequest:{}", JSON.toJSONString(notifyRequest));
JYBaseRequestModel requestModel = new JYBaseRequestModel();
requestModel.setRequest(JSON.toJSONString(notifyRequest));
requestModel.setRequest_id("" + new Date().getTime());
requestModel.setType("pdd.service.conso.inbound");
requestModel.setTarget_client_id(CLIENT_ID);
requestModel.setClient_id(CLIENT_ID);
long time = new Date().getTime() / 1000;
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(requestModel));
// String resp = PddHttpTool.postRequest(requestModel);
String resp = PddHttpTool.sendJsonPost(requestModel);
log.info("resp = {}", resp);
}
}
package org.ta.pddserver.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import org.ta.pddserver.model.pddgd.request.GDTicketReplyRequest;
import org.ta.pddserver.model.pddgd.response.GDTicketReplyRepsonse;
import org.ta.pddserver.model.pddgd.response.GDTicketRepsonse;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
import org.ta.pddserver.utils.ImageUtils;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@Slf4j
@RestController
public class PddGDController {
private static final String CLIENT_ID = "8f5f3f9c92e847b2894fc9c0afce3d61";
private static final String CLIENT_SECRET = "281d79ad5117d20a51efb9e7b0d5f7ee336399b0";
public JSONObject getTicketList() {
JSONObject jsonObject = new JSONObject();
long end = new Date().getTime() / 1000;
jsonObject.put("end_updated_at", end);
jsonObject.put("start_updated_at", end - 1800);
jsonObject.put("page", 1);
jsonObject.put("page_size", 100);
jsonObject.put("client_id", CLIENT_ID);
JYBaseRequestModel requestModel = new JYBaseRequestModel();
requestModel.setRequest(JSON.toJSONString(jsonObject));
requestModel.setRequest_id("" + new Date().getTime());
requestModel.setType("pdd.logistics.ticket.get");
requestModel.setTarget_client_id(CLIENT_ID);
requestModel.setClient_id(CLIENT_ID);
long time = new Date().getTime() / 1000;
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(requestModel));
// String resp = PddHttpTool.postRequest(requestModel);
String resp = PddHttpTool.sendJsonPostGD(requestModel);
log.info("resp = {}", resp);
JSONObject respObj = JSON.parseObject(resp);
int count = respObj.getInteger("total_count");
JSONArray list = respObj.getJSONArray("logistics_ticket_list");
if (!list.isEmpty()) {
for (int i = 0; i < list.size(); i++) {
JSONObject ticket = list.getJSONObject(i);
GDTicketRepsonse gdTicketRepsonse = ticket.toJavaObject(GDTicketRepsonse.class);
// todo 保存数据
}
}
return respObj;
}
public JSONObject replyTicket() {
Long ticketId = 1L;
String waybill_no = "waybill_no";
GDTicketReplyRequest replyRequest = new GDTicketReplyRequest();
replyRequest.setTicket_id(ticketId);
replyRequest.setWaybill_no(waybill_no);
replyRequest.setHandle_result("无");
replyRequest.setSign_state(1);
replyRequest.setCompensate_state(1);
replyRequest.setDuty(0);
replyRequest.setExpress_dealer("XXX");
replyRequest.setExpress_dealer_contact("18599877823");
replyRequest.setReply_type(1);
JYBaseRequestModel requestModel = new JYBaseRequestModel();
requestModel.setRequest(JSON.toJSONString(replyRequest));
requestModel.setRequest_id("" + new Date().getTime());
requestModel.setType("pdd.logistics.ticket.get");
requestModel.setTarget_client_id(CLIENT_ID);
requestModel.setClient_id(CLIENT_ID);
long time = new Date().getTime() / 1000;
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(requestModel));
// String resp = PddHttpTool.postRequest(requestModel);
String resp = PddHttpTool.sendJsonPostGD(requestModel);
log.info("resp = {}", resp);
JSONObject respObj = JSON.parseObject(resp);
JSONObject respObject = respObj.getJSONObject("logistics_ticket_notify_response");
GDTicketReplyRepsonse replyRepsonse = respObject.toJavaObject(GDTicketReplyRepsonse.class);
log.info("replyRepsonse is_success:{}", replyRepsonse.getIs_success());
return respObj;
}
}
......@@ -19,6 +19,12 @@ public class CollectMailDetailEntity {
@TableField(value = "updated")
private String updated;
/**
* 状态 默认为0,11通知拆包,19完成拆包
*/
@TableField(value = "status")
private Integer status;
/**
* 合包单号(必填)
......
......@@ -31,25 +31,25 @@ public class CollectOrderEntity {
/**
* 服务商code(必填)
*/
@TableField(value = "status")
@TableField(value = "providerCode")
private String providerCode;
/**
* 集运仓code(必填)
*/
@TableField(value = "status")
@TableField(value = "consoWarehouseCode")
private String consoWarehouseCode;
/**
* 合包单号(必填)
*/
@TableField(value = "status")
@TableField(value = "orderCode")
private String orderCode;
/**
* 用户识别码(必填)
*/
@TableField(value = "status")
@TableField(value = "buyerCode")
private String buyerCode;
......
package org.ta.pddserver.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("collect_out_mail_detail")
public class CollectOutMailDetailEntity {
@TableId(value = "uid")
private String uid;
@TableField(value = "created")
private String created;
@TableField(value = "updated")
private String updated;
/**
* 状态 默认为0,11通知拆包,19完成拆包
*/
@TableField(value = "status")
private Integer status;
/**
* 合包单号(必填)
*/
@TableField(value = "orderCode")
private String orderCode;
/**
* 快递公司编号(必填)
*/
@TableField(value = "expressCode")
private String expressCode;
/**
* 运单号(必填)
*/
@TableField(value = "mailNo")
private String mailNo;
/**
* 包裹对应的仓库编码(非必填)
*/
@TableField(value = "consoWarehouseCode")
private String consoWarehouseCode;
}
package org.ta.pddserver.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("gd_attachment")
public class GDAttachmentEntity {
@TableId(value = "uid")
private String uid;
@TableField(value = "created")
private String created;
@TableField(value = "updated")
private String updated;
@TableField(value = "state")
private Integer state;
@TableField(value = "remarks")
private String remarks;
@TableField(value = "status")
private Integer status;
/**
* 工单id
*/
@TableField(value = "tickId")
private Long tickId;
/**
* url
*/
@TableField(value = "url")
private String url;
/**
* 附件类型
*/
@TableField(value = "type")
private String type;
}
package org.ta.pddserver.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.ta.pddserver.model.pddgd.response.GDTicketRepsonse;
import java.io.Serializable;
import java.util.List;
@Data
@TableName("gd_ticket")
public class GDTicketEntity {
private static final long serialVersionUID = 1L;
@TableId(value = "uid")
private String uid;
@TableField(value = "created")
private String created;
@TableField(value = "updated")
private String updated;
@TableField(value = "state")
private Integer state;
@TableField(value = "remarks")
private String remarks;
/**
* 工单ID(唯一标识,自增或业务生成)
* 数据库字段:ticket_id
*/
@TableField(value = "status")
private Long ticket_id;
/**
* 工单创建来源
* 0:平台,1:消费者,2:商家
* 数据库字段:create_type
*/
@TableField(value = "status")
private Integer create_type;
/**
* 收件地址(64位)
* 工单来源为消费者时必填,其他来源为空
* 数据库字段:receive_address
*/
@TableField(value = "status")
private String receive_address;
/**
* 揽件地址(64位)
* 工单来源为商家时必填,其他来源为空
* 数据库字段:send_address
*/
@TableField(value = "status")
private String send_address;
/**
* 订单号生成的物流单号(预生成物流单号)
* 数据库字段:pre_delivery_id
*/
@TableField(value = "status")
private String pre_delivery_id;
/**
* 物流商处理结果
* 数据库字段:handle_result
*/
@TableField(value = "status")
private String handle_result;
/**
* 物流商快递编码(关联物流商信息)
* 数据库字段:express_company_id
*/
@TableField(value = "status")
private Integer express_company_id;
/**
* 赔付状态
* 0:默认(未涉及赔付),1:未赔付,2:已赔付
* 数据库字段:compensate_state
*/
@TableField(value = "status")
private Integer compensate_state;
/**
* 赔付金额(单位:分)
* 数据库字段:compensate_amount
*/
@TableField(value = "status")
private Long compensate_amount;
/**
* 物流商回传凭证(List格式,存储附件信息)
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:express_attachment
*/
@TableField(value = "status")
private List<GDTicketRepsonse.ExpressAttachment> express_attachment;
/**
* 签收状态
* 0:默认(未涉及签收),1:未签收,2:已签收
* 数据库字段:sign_state
*/
@TableField(value = "status")
private Integer sign_state;
/**
* 处理人(物流商侧处理工单的人员姓名)
* 数据库字段:express_dealer
*/
@TableField(value = "status")
private String express_dealer;
/**
* 处理人联系方式(手机号或座机号)
* 数据库字段:express_dealer_contact
*/
@TableField(value = "status")
private String express_dealer_contact;
/**
* 工单退回次数
* 0:首次下发,1:二次下发,2:三次下发...
* 数据库字段:retreat_count
*/
@TableField(value = "status")
private Integer retreat_count;
/**
* 联系人姓名(消费者姓名,工单来源为消费者时必填)
* 数据库字段:receive_name
*/
@TableField(value = "status")
private String receive_name;
/**
* 联系人电话(消费者手机号,工单来源为消费者时必填)
* 数据库字段:receive_contact
*/
@TableField(value = "status")
private String receive_contact;
/**
* 工单创建时间戳(毫秒级)
* 数据库字段:created_at
*/
@TableField(value = "status")
private Long created_at;
/**
* 工单最后更新时间戳(含申诉、处理结果更新时间,毫秒级)
* 数据库字段:updated_at
*/
@TableField(value = "status")
private Long updated_at;
/**
* 问题描述(工单核心问题标题,如"包裹丢失"、"派送延迟")
* 数据库字段:title
*/
@TableField(value = "status")
private String title;
/**
* 备注(申诉内容、补充说明,最大长度2048字符)
* 数据库字段:description
*/
@TableField(value = "status")
private String description;
/**
* 问题来源
* 0:买家,1:卖家
* 数据库字段:source
*/
@TableField(value = "status")
private Integer source;
/**
* 运单号(可能为空,如未生成物流单的预咨询工单)
* 数据库字段:waybill_no
*/
@TableField(value = "status")
private String waybill_no;
/**
* 紧急度
* 0:中,1:紧急
* 数据库字段:urgent_type
*/
@TableField(value = "status")
private Integer urgent_type;
/**
* 问题类型ID(关联问题类型表,如1-丢件,2-损件)
* 数据库字段:type_id
*/
@TableField(value = "status")
private Integer type_id;
/**
* 客服创建工单时上传的附件列表(List格式,存储附件URL)
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:attach_url
*/
@TableField(value = "status")
private List<String> attach_url;
/**
* 物流商回复状态
* 0:待回复,1:已回复
* 数据库字段:status
*/
@TableField(value = "status")
private Integer status;
/**
* 末端品牌代码(如自提柜品牌编码,非末端工单为空)
* 数据库字段:cabinet_code
*/
@TableField(value = "status")
private String cabinet_code;
/**
* 物流投诉标签(数组格式,存储标签ID,如[1,3,5])
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:sub_type_ids
*/
@TableField(value = "status")
private List<Integer> subTypeIds;
/**
* 寄件单号(退货场景下的寄件订单号,非退货工单为空)
* 数据库字段:mail_order_sn
*/
@TableField(value = "status")
private String mail_order_sn;
/**
* 订单金额(单位:分,关联工单对应的订单金额)
* 数据库字段:pay_amount
*/
@TableField(value = "status")
private Long pay_amount;
/**
* 国家/区域名称(集运工单特有,如"美国"、"中国香港")
* 数据库字段:area_name
*/
@TableField(value = "status")
private String area_name;
/**
* 用户投诉时上传的附件URL(数组格式,存储URL)
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:attachment_urls_by_customer
*/
@TableField(value = "status")
private List<String> attachment_urls_by_customer;
/**
* 物流商回传凭证DTO(内部静态类,封装附件详情)
* 对应 express_attachment 字段的List元素结构
*/
@Data
public static class ExpressAttachment implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 附件URL(如图片、文档链接)
*/
private String url;
}
}
......@@ -105,4 +105,7 @@ public class TraceObjectEntity {
@TableField(value = "remark")
private String remark;
@TableField(value = "statusCode")
private String statusCode;
}
......@@ -2,8 +2,15 @@ package org.ta.pddserver.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.ta.pddserver.entity.CollectMailDetailEntity;
@Mapper
public interface CollectMailDetailMapper extends BaseMapper<CollectMailDetailEntity> {
@Select("SELECT * FROM `collect_mail_detail` WHERE `orderCode` = #{orderCode} AND `expressCode` = #{expressCode} AND `mailNo` = #{mailNo};")
CollectMailDetailEntity selectByOrderCodeAndExpressCodeAndMailNo(String orderCode, String expressCode, String mailNo);
@Update("UPDATE `collect_mail_detail` SET `status` = #{status} WHERE `uid` = #{uid};")
int updateStatusByUid(int status, String uid);
}
......@@ -2,8 +2,16 @@ package org.ta.pddserver.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.ta.pddserver.entity.CollectOrderEntity;
@Mapper
public interface CollectOrderMapper extends BaseMapper<CollectOrderEntity> {
@Select("SELECT * FROM `collect_order` WHERE `orderCode` = #{orderCode};")
CollectOrderEntity findByOrderCode(String orderCode);
@Update("UPDATE `collect_order` SET `status` = #{status} WHERE `uid` = #{uid};")
int updateOrderStatusById(int status, String uid);
}
......@@ -12,4 +12,7 @@ public interface LogOrderMailDetailMapper extends BaseMapper<LogOrderMailDetailE
@Select("SELECT * FROM `log_order_mail_detail` WHERE `logisticsOrderCode` = #{logisticsOrderCode} AND `state` > 0;")
List<LogOrderMailDetailEntity> getListByCode(String logisticsOrderCode);
@Select("SELECT * FROM `log_order_mail_detail` WHERE `mailNo` = #{mailNo} AND `state` > 0;")
LogOrderMailDetailEntity findByMailNo(String mailNo);
}
......@@ -2,11 +2,19 @@ package org.ta.pddserver.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.ta.pddserver.entity.LogOrderEntity;
@Mapper
public interface LogOrderMapper extends BaseMapper<LogOrderEntity> {
@Update("UPDATE `log_order` SET `packageQuantity` = ${packageQuantity} WHERE `logisticsOrderCode` = #{logisticsOrderCode};")
Boolean savePackageQuantity(String logisticsOrderCode, long packageQuantity);
Boolean savePackageQuantity(@Param("logisticsOrderCode") String logisticsOrderCode, @Param("packageQuantity") long packageQuantity);
@Select("SELECT * FROM `log_order` WHERE `logisticsOrderCode` = #{logisticsOrderCode};")
LogOrderEntity selectByOrderCode(String logisticsOrderCode);
@Update("UPDATE `log_order` SET `status` = #{status} WHERE `uid` = #{uid};")
int updateOrderStatusById(int status, String uid);
}
package org.ta.pddserver.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.ta.pddserver.entity.ManufacturerEntity;
@Mapper
public interface ManufacturerMapper extends BaseMapper<ManufacturerEntity> {
}
package org.ta.pddserver.model.enums;
import lombok.Getter;
public enum IdentityErrorType {
TelephoneWrong(302, "用户用的是护照号,校验失败(手机号格式有问题)"),
NameWrong(303, "用户用的是护照号,校验失败(姓名格式有问题)"),
UnknownWrong(306, "其它网络类可以重试的未知错误(如依赖下游不可用或超时)"),
InformationInconsistency(307, "用户用的是通关号,校验失败(无法知道哪个信息错误)"),
CodeUnused(308, "用户用的是通关号,通关号不存在"),
CodeTelephoneInconsistency(309, "用户用的是通关号,手机号和通关号不符"),
CodeNameInconsistency(310, "用户用的是通关号,姓名和通关号不符");
@Getter
private int value;
@Getter
private String desc;
IdentityErrorType(int val, String desc) {
this.value = val;
this.desc = desc;
}
}
package org.ta.pddserver.model.enums;
import lombok.Getter;
public enum OrderProblemType {
JinYun(1, "禁运"),
ChaoDa (2, "超大"),
ChaoZhong (3, "超重"),
PinLeiXianZhi (4, "运输品类限制(特货)"),
DiuShi (5, "丢失"),
PoSun (6, "破损"),
ShenQingTuiHuo (7, "申请退货"),
BaoGuoWuXiao (8, "包裹无效(无实物)"),
DaoFuJian (9, "到付件"),
Other (10, "非原面单/外包装")
;
@Getter
private int value;
@Getter
private String desc;
OrderProblemType(int val, String desc) {
this.value = val;
this.desc = desc;
}
}
package org.ta.pddserver.model.enums;
import lombok.Getter;
public enum OrderRejectCode {
ChaoDa (20, "超大", "很抱歉,您的包裹因超大原因被{}集运仓拒签,请联系卖家并申请退款", "超大"),
ChaoZhong (21, "超重", "很抱歉,您的包裹超重原因被{}集运仓拒签,请联系卖家并申请退款", "超重"),
JinYun(22, "运输品类限制", "很抱歉,您的包裹因运输品类限制原因被{}集运仓拒签,请联系卖家并申请退款", "海关违禁品(目的地海关政策禁止入境商品)"),
TeHuo (23, "运输品类限制", "很抱歉,您的包裹因运输品类限制原因被{}集运仓拒签,请联系卖家并申请退款", "运输品类限制(液体、粉末、带电、带磁性、易碎品)"),
YeWuYiChang (24, "货到付款", "很抱歉,您的包裹因货到付款原因被{}集运仓拒签,请联系卖家并申请退款", "到付件,”到付“,是指卖家拍下商品时为货到付款,仓库不承担这部分一段费用而拒收。"),
YeWuYiChang2 (25, "非原面单/外包装", "很抱歉,您的包裹因非原面单/外包装原因被{}集运仓拒签,请联系卖家并申请退款", "非原面单/外包装"),
ShouHou (26, "申请退货", "很抱歉,您的包裹因申请退货原因被{}集运仓拒签,请联系卖家并申请退款", "申请退货"),
ShenQingTuiHuo (27, "破损", "很抱歉,您的包裹因破损原因被{}集运仓拒签,请联系卖家并申请退款", "破损"),
BaoGuoWuXiao (33, "包裹无效", "很抱歉,您的包裹因包裹无效原因无法正常入库,请速与{}集运商联系。", "包裹无效(无实物)")
;
@Getter
private int value;
@Getter
private String desc;
@Getter
private String remark;
@Getter
private String info;
OrderRejectCode(int val, String desc, String remark, String info) {
this.value = val;
this.desc = desc;
this.remark = remark;
this.info = info;
}
}
package org.ta.pddserver.model.enums;
import lombok.Getter;
public enum OrderUnpackedCode {
Code1(1, "您的货物来货少件/破损,如沟通已按您的意见处理。"),
Code2 (2, "您的包裹超重/超尺寸,如沟通已为您分箱"),
Code3 (3, "您的包裹超重/超尺寸,如沟通已为您更换渠道"),
Code4 (4, "您的包裹超重/超尺寸,如沟通已为您分箱/更换渠道"),
Code5 (5, "您的包裹内物单一商品数量过多,已为您分箱"),
Code6 (6, "易碎品国际转运不包损,如沟通已按您的意见处理。"),
Code7 (7, "您的合包金额已超150美金,海关将征收关税,如沟通已为您更换渠道"),
Code8 (8, "农副产品可能产生检疫费或者分离废弃费,如沟通已按您的意见处理。"),
Code9 (9, "农副/肉类/酒类等产品,如被查验产生费用需个人承担"),
Code10 (10, "您的包裹部分商品原渠道不可运输,如沟通为您转其他方式运输")
;
@Getter
private int value;
@Getter
private String desc;
OrderUnpackedCode(int val, String desc) {
this.value = val;
this.desc = desc;
}
}
package org.ta.pddserver.model.pddgd.request;
import lombok.Data;
import java.util.List;
@Data
public class GDTicketListRequest {
private String client_id;
private Long end_updated_at;
private Long start_updated_at;
private Integer page;
private Integer page_size;
private String data_type;
private String type;
private Long timestamp;
private String sign;
}
package org.ta.pddserver.model.pddgd.request;
import lombok.Data;
import java.util.List;
@Data
public class GDTicketReplyRequest {
/**
* 当物流服务商在处理工单时,需要上传一些图片附件时,可以设置该字段值,格式为字符串URL的数组转换成的JSON字符串
*/
private List<String> attach_paths;
/**
* 当物流服务商在处理工单时,需要上传一些图片附件时,可以设置该字段值,格式为字符串URL的数组转换成的JSON字符串
*/
private String attach_path_list;
/**
* 工单id
*/
private Long ticket_id;
/**
* 运单号
*/
private String waybill_no;
/**
* 处理结果
* reply_type=2时,可以给个值:“无”
*/
private String handle_result;
/**
* 签收状态,0:默认,1:未签收,2:已签收
* reply_type=2时,可以给个值:0
*/
private Integer sign_state;
/**
* 是否赔付,0:默认,1:未赔付,2:已赔付
* reply_type=2时,可以给个值:0
*/
private Integer compensate_state;
/**
* 赔付金额(单位:分)
* reply_type=2时,可以给个值:0
*/
private Integer compensate_amount;
/**
* 责任方,0:默认, 1:消费者,2:商家,3:快递公司,4:其他
*/
private Integer duty;
/**
* 处理人
*/
private String express_dealer;
/**
* 处理人联系方式
* 联系方式支持以下类型(联系方式格式错误,数据会推送失败)
* 1、手机号:需符合正则,参考正则0?(13|14|15|17|18|19)[0-9]{9}
* 2、座机:含区号、不带“-”需符合正则,参考正则
* \\d{3}\\d{8}|\\d{4}\\d{7,8}
* 3、官方号码:需提前沟通加白
*/
private String express_dealer_contact;
/**
* 回复类型 1:回复工单处理结果,2: 回复电联结果
* 当为空时,默认值为1
*/
private Integer reply_type;
/**
* 电联结果 当reply_type=2时,为必填项,同时该字段的值为一个json格式的字符串
*/
private String reply_call_result;
/**
* 电联结果 当reply_type=2时,为必填项,同时该字段的值为一个json格式的字符串
*/
private ReplyCallResult replyCallResult;
@Data
public static final class ReplyCallResult {
/**
* 电联结果
*/
private Integer call_result;
/**
* 电联时间戳
*/
private String call_timestamp;
/**
* 回拨人姓名
*/
private String caller_name;
/**
* 回拨联系方式
*/
private String caller_contract;
}
private String client_id;
private String data_type;
private String type;
private Long timestamp;
private String sign;
}
package org.ta.pddserver.model.pddgd.request;
import lombok.Data;
@Data
public class GDUploadRequest {
private String client_id;
private String data_type;
private String type;
private Long timestamp;
private String sign;
private String image;
}
package org.ta.pddserver.model.pddgd.response;
import lombok.Data;
@Data
public class GDTicketReplyRepsonse {
private static final long serialVersionUID = 1L;
private Boolean is_success;
private String request_id;
}
package org.ta.pddserver.model.pddgd.response;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
public class GDTicketRepsonse {
private static final long serialVersionUID = 1L;
/**
* 工单ID(唯一标识,自增或业务生成)
* 数据库字段:ticket_id
*/
private Long ticket_id;
/**
* 工单创建来源
* 0:平台,1:消费者,2:商家
* 数据库字段:create_type
*/
private Integer create_type;
/**
* 收件地址(64位)
* 工单来源为消费者时必填,其他来源为空
* 数据库字段:receive_address
*/
private String receive_address;
/**
* 揽件地址(64位)
* 工单来源为商家时必填,其他来源为空
* 数据库字段:send_address
*/
private String send_address;
/**
* 订单号生成的物流单号(预生成物流单号)
* 数据库字段:pre_delivery_id
*/
private String pre_delivery_id;
/**
* 物流商处理结果
* 数据库字段:handle_result
*/
private String handle_result;
/**
* 物流商快递编码(关联物流商信息)
* 数据库字段:express_company_id
*/
private Integer express_company_id;
/**
* 赔付状态
* 0:默认(未涉及赔付),1:未赔付,2:已赔付
* 数据库字段:compensate_state
*/
private Integer compensate_state;
/**
* 赔付金额(单位:分)
* 数据库字段:compensate_amount
*/
private Long compensate_amount;
/**
* 物流商回传凭证(List格式,存储附件信息)
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:express_attachment
*/
private List<ExpressAttachment> express_attachment;
/**
* 签收状态
* 0:默认(未涉及签收),1:未签收,2:已签收
* 数据库字段:sign_state
*/
private Integer sign_state;
/**
* 处理人(物流商侧处理工单的人员姓名)
* 数据库字段:express_dealer
*/
private String express_dealer;
/**
* 处理人联系方式(手机号或座机号)
* 数据库字段:express_dealer_contact
*/
private String express_dealer_contact;
/**
* 工单退回次数
* 0:首次下发,1:二次下发,2:三次下发...
* 数据库字段:retreat_count
*/
private Integer retreat_count;
/**
* 联系人姓名(消费者姓名,工单来源为消费者时必填)
* 数据库字段:receive_name
*/
private String receive_name;
/**
* 联系人电话(消费者手机号,工单来源为消费者时必填)
* 数据库字段:receive_contact
*/
private String receive_contact;
/**
* 工单创建时间戳(毫秒级)
* 数据库字段:created_at
*/
private Long created_at;
/**
* 工单最后更新时间戳(含申诉、处理结果更新时间,毫秒级)
* 数据库字段:updated_at
*/
private Long updated_at;
/**
* 问题描述(工单核心问题标题,如"包裹丢失"、"派送延迟")
* 数据库字段:title
*/
private String title;
/**
* 备注(申诉内容、补充说明,最大长度2048字符)
* 数据库字段:description
*/
private String description;
/**
* 问题来源
* 0:买家,1:卖家
* 数据库字段:source
*/
private Integer source;
/**
* 运单号(可能为空,如未生成物流单的预咨询工单)
* 数据库字段:waybill_no
*/
private String waybill_no;
/**
* 紧急度
* 0:中,1:紧急
* 数据库字段:urgent_type
*/
private Integer urgent_type;
/**
* 问题类型ID(关联问题类型表,如1-丢件,2-损件)
* 数据库字段:type_id
*/
private Integer type_id;
/**
* 客服创建工单时上传的附件列表(List格式,存储附件URL)
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:attach_url
*/
private List<String> attach_url;
/**
* 物流商回复状态
* 0:待回复,1:已回复
* 数据库字段:status
*/
private Integer status;
/**
* 末端品牌代码(如自提柜品牌编码,非末端工单为空)
* 数据库字段:cabinet_code
*/
private String cabinet_code;
/**
* 物流投诉标签(数组格式,存储标签ID,如[1,3,5])
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:sub_type_ids
*/
private List<Integer> subTypeIds;
/**
* 寄件单号(退货场景下的寄件订单号,非退货工单为空)
* 数据库字段:mail_order_sn
*/
private String mail_order_sn;
/**
* 订单金额(单位:分,关联工单对应的订单金额)
* 数据库字段:pay_amount
*/
private Long pay_amount;
/**
* 国家/区域名称(集运工单特有,如"美国"、"中国香港")
* 数据库字段:area_name
*/
private String area_name;
/**
* 用户投诉时上传的附件URL(数组格式,存储URL)
* 数据库存储:JSON字符串,查询时自动反序列化为List
* 数据库字段:attachment_urls_by_customer
*/
private List<String> attachment_urls_by_customer;
/**
* 物流商回传凭证DTO(内部静态类,封装附件详情)
* 对应 express_attachment 字段的List元素结构
*/
@Data
public static class ExpressAttachment implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 附件URL(如图片、文档链接)
*/
private String url;
}
}
......@@ -30,7 +30,7 @@ public class PddServiceConsoFeeQueryRequest extends JYBaseRequestModel implement
/**
* 集运单号列表(必填)
*/
private List<LogisticsOrderCode> logisticsOrderCodes;
private List<String> logisticsOrderCodes;
/**
* 业务类型(必填,固定为CONSO-集运)
......@@ -73,18 +73,6 @@ public class PddServiceConsoFeeQueryRequest extends JYBaseRequestModel implement
private ReceiverDetail receiverDetail;
/**
* 集运单号列表项
*/
@Data
public static class LogisticsOrderCode {
/**
* 集运单号(必填)
*/
private String logisticsOrderCode;
}
/**
* 运单详情
*/
......
......@@ -6,9 +6,8 @@ import lombok.EqualsAndHashCode;
import java.io.Serial;
import java.io.Serializable;
@EqualsAndHashCode(callSuper = true)
@Data
public class PddServiceConsoInboundRequest extends JYBaseRequestModel implements Serializable {
public class PddServiceConsoInboundRequest implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
......
......@@ -36,12 +36,12 @@ public class PddServiceConsoOutboundNoticeRequest extends JYBaseRequestModel imp
/**
* 集运单号列表(合包中包含的集运单,非必填)
*/
private List<LogisticsOrderCode> logisticsOrderCodes;
private List<String> logisticsOrderCodes;
/**
* 一段订单号列表(合包中包含的订单,非必填)
*/
private List<OrderSn> orderSns;
private List<String> orderSns;
/**
* 一段订单详情列表(非必填)
......@@ -94,30 +94,6 @@ public class PddServiceConsoOutboundNoticeRequest extends JYBaseRequestModel imp
private FreightFeeDetail freightFeeDetail;
/**
* 集运单号列表项
*/
@Data
public static class LogisticsOrderCode {
/**
* 集运单号(必填)
*/
private String logisticsOrderCode;
}
/**
* 一段订单号列表项
*/
@Data
public static class OrderSn {
/**
* 一段订单号(必填)
*/
private String orderSn;
}
/**
* 一段订单详情
*/
......
......@@ -167,10 +167,16 @@ public class TraceObject {
traceObject.setSiteName(traceObjectEntity.getSiteName());
traceObject.setSiteNo(traceObjectEntity.getSiteNo());
traceObject.setSiteType(traceObjectEntity.getSiteType());
traceObject.setStatus(String.valueOf(traceObjectEntity.getStatus()));
traceObject.setStatus(traceObjectEntity.getStatusCode());
traceObject.setTimeZone(traceObjectEntity.getTimeZone());
traceObject.setTrackingNumber(traceObjectEntity.getTrackingNumber());
traceObject.setTransferFlag(traceObjectEntity.getTransferFlag());
traceObject.setNextSiteName(traceObjectEntity.getNextSiteName());
traceObject.setNextSiteType(traceObjectEntity.getNextSiteType());
traceObject.setNextSiteNo(traceObjectEntity.getNextSiteNo());
traceObject.setFailReason(traceObjectEntity.getFailReason());
traceObject.setSignerName(traceObjectEntity.getSignerName());
traceObject.setAddress(traceObjectEntity.getAddress());
return traceObject;
}
......
package org.ta.pddserver.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.ta.pddserver.entity.ManufacturerEntity;
public interface ManufacturerService extends IService<ManufacturerEntity> {
}
......@@ -11,4 +11,11 @@ import org.ta.pddserver.service.CollectMailDetailService;
public class CollectMailDetailImpl extends ServiceImpl<CollectMailDetailMapper, CollectMailDetailEntity> implements CollectMailDetailService {
public CollectMailDetailEntity getByOrderCodeAndMailNo(String orderCode, String expressCode, String mailNo) {
return baseMapper.selectByOrderCodeAndExpressCodeAndMailNo(orderCode, expressCode, mailNo);
}
public int updateStatusByUid(int status, String uid) {
return baseMapper.updateStatusByUid(status, uid);
}
}
\ No newline at end of file
......@@ -11,4 +11,11 @@ import org.ta.pddserver.service.CollectOrderService;
public class CollectOrderImpl extends ServiceImpl<CollectOrderMapper, CollectOrderEntity> implements CollectOrderService {
public CollectOrderEntity getByOrderCode(String orderCode) {
return this.baseMapper.findByOrderCode(orderCode);
}
public int updateOrderStatus(int status, String uid) {
return this.baseMapper.updateOrderStatusById(status, uid);
}
}
\ No newline at end of file
......@@ -16,4 +16,12 @@ public class LogOrderImpl extends ServiceImpl<LogOrderMapper, LogOrderEntity> im
return result;
}
public LogOrderEntity getByOrderCode(String orderCode) {
return baseMapper.selectByOrderCode(orderCode);
}
public int updateOrderStatus(int status, String uid) {
return baseMapper.updateOrderStatusById(status, uid);
}
}
\ No newline at end of file
......@@ -16,4 +16,8 @@ public class LogOrderMailDetailImpl extends ServiceImpl<LogOrderMailDetailMapper
List<LogOrderMailDetailEntity> list = baseMapper.getListByCode(logisticsOrderCode);
return list;
}
public LogOrderMailDetailEntity getByMailNo(String mailNo) {
return baseMapper.findByMailNo(mailNo);
}
}
\ No newline at end of file
package org.ta.pddserver.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.ta.pddserver.entity.ManufacturerEntity;
import org.ta.pddserver.mapper.ManufacturerMapper;
import org.ta.pddserver.service.ManufacturerService;
@Service
public class ManufacturerImpl extends ServiceImpl<ManufacturerMapper, ManufacturerEntity> implements ManufacturerService {
}
\ No newline at end of file
package org.ta.pddserver.utils;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.http.io.entity.EntityUtils;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
@Component
public class ImageUtils {
// 目标压缩大小:1MB = 1024 * 1024 字节
private static final long MAX_SIZE = 1024 * 1024;
// 初始压缩质量(0.9=90%质量,可根据需求调整)
private static final float INIT_QUALITY = 0.9f;
// 每次质量递减步长(质量过低时停止,避免图片模糊)
private static final float QUALITY_STEP = 0.1f;
// 最小压缩质量(低于此值时,即使超1M也停止,避免无法识别的图片)
private static final float MIN_QUALITY = 0.3f;
/**
* 下载网络图片并处理(压缩→Base64)
*
* @param imageUrl 网络图片URL(如https://xxx.com/xxx.jpg)
* @return 处理后的Base64字符串(带格式前缀,如data:image/jpeg;base64,...)
* @throws IOException 网络异常/图片处理异常
*/
public String downloadCompressToBase64(String imageUrl) throws IOException {
// 1. 下载网络图片为字节数组
byte[] imageBytes = downloadImage(imageUrl);
// 2. 压缩图片至1M内
byte[] compressedBytes = compressImage(imageBytes);
// 3. 字节数组转Base64(带格式前缀)
String imageFormat = getImageFormat(imageUrl); // 提取图片格式(jpg/png等)
return "data:image/" + imageFormat + ";base64," + Base64.getEncoder().encodeToString(compressedBytes);
}
/**
* 下载网络图片为字节数组
*/
private byte[] downloadImage(String imageUrl) throws IOException {
try {
HttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(imageUrl);
// 发送请求并获取响应(设置超时时间,避免阻塞)
return httpClient.execute(httpGet, response -> {
if (response.getCode() != 200) {
throw new IOException("图片下载失败,HTTP状态码:" + response.getCode());
}
// 响应体转字节数组
return EntityUtils.toByteArray(response.getEntity());
});
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 压缩图片字节数组(质量+尺寸双重控制)
*/
private byte[] compressImage(byte[] imageBytes) throws IOException {
// 若原始大小已≤1M,直接返回
if (imageBytes.length <= MAX_SIZE) {
return imageBytes;
}
float currentQuality = INIT_QUALITY;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 循环递减质量压缩,直到大小≤1M或达到最小质量
while (true) {
outputStream.reset();
// 压缩逻辑:按质量压缩,保留原尺寸(若仍超1M,后续可加尺寸缩放)
Thumbnails.of(new ByteArrayInputStream(imageBytes))
.outputQuality(currentQuality) // 质量压缩(0.0~1.0)
.toOutputStream(outputStream);
byte[] tempBytes = outputStream.toByteArray();
// 满足条件:大小≤1M 或 质量已达最小值,退出循环
if (tempBytes.length <= MAX_SIZE || currentQuality <= MIN_QUALITY) {
return tempBytes;
}
// 质量递减,继续压缩
currentQuality -= QUALITY_STEP;
}
}
/**
* 从URL提取图片格式(如jpg/png/webp)
*/
private String getImageFormat(String imageUrl) {
// 从URL后缀提取(如https://xxx.com/xxx.jpg → jpg)
String format = imageUrl.substring(imageUrl.lastIndexOf(".") + 1).toLowerCase();
// 过滤常见格式,默认返回jpg(避免不支持的格式)
return (format.matches("jpg|jpeg|png|webp")) ? format : "jpg";
}
}
\ No newline at end of file
......@@ -14,8 +14,9 @@ import java.util.Map;
public class PddHttpTool {
private static final String url = "https://opengw-api.hutaojie.com/ark/router";
// private static final String url = "https://ark-api.pinduoduo.com/ark/router";
private static final String URL = "https://opengw-api.hutaojie.com/ark/router";
private static final String URL_GD = "https://opengw-api.hutaojie.com/api/router";
// private static final String URL = "https://ark-api.pinduoduo.com/ark/router";
public static String postRequest(JYBaseRequestModel request) {
......@@ -29,7 +30,7 @@ public class PddHttpTool {
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
// 3. 发送 POST 请求,获取响应
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
ResponseEntity<String> response = restTemplate.postForEntity(URL, requestEntity, String.class);
// 4. 返回响应体(根据实际需求处理响应状态码、响应头)
return response.getBody();
......@@ -38,7 +39,14 @@ public class PddHttpTool {
public static String sendJsonPost(Object requestObj) {
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resp = restTemplate.postForEntity(url, requestObj, String.class);
ResponseEntity<String> resp = restTemplate.postForEntity(URL, requestObj, String.class);
return resp.getBody();
}
public static String sendJsonPostGD(Object requestObj) {
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resp = restTemplate.postForEntity(URL_GD, requestObj, String.class);
return resp.getBody();
}
}
package org.ta.pddserver.utils;
public class PddJYPriceTool {
public static int getTotalFee(String type, int length, int width, int height, int weight, boolean international) {
if (international) {
// 国际件
return 0;
// return PddOverseaPriceTool.FreightCostCalculation(type, length, width, height, weight);
} else {
// 国内件 属于退件
return PddNationalPriceTool.FreightCostCalculation(length, width, height, weight);
}
}
}
package org.ta.pddserver.utils;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class PddNationalPriceTool {
//首重重量
private static int initialWeight = 1000;
//上限重量
private static int maxWeight = 200000;
// 首重价格
private static int initalPrice = 450;
//超重计费标准
private static int excessWeight = 1000;
//超重价格
private static int excessPrice = 100;
//标椎三边长度
private static int standard = 100;
//标准三边之和
private static int maxStandard = 160;
/*
* 根据类型、重量(g) 计算运费
* */
public static int FreightCostCalculation(int length, int width, int height, int weight) {
int price = initalPrice;
if (weight < initialWeight) {
return price;
}
int pw = weight - initialWeight;
int pc = pw / excessWeight;
if (pw % excessWeight != 0) {
pc += 1;
}
price = price + pc * excessPrice;
log.info("续重数量:{}", pc);
return price;
}
}
package org.ta.pddserver.utils;
import java.util.HashMap;
import java.util.Map;
public class PddOverseaPriceTool {
//首重重量
private static int initialWeight = 1000;
//上限重量
private static int maxWeight = 20000;
// 普货首重价格
private static int gInitalPrice = 1850;
//特货首重价格
private static int sInitalPrice = 2800;
//超重计费标准
private static int excessWeight = 500;
//超重价格
private static int excessPrice = 175;
//标椎三边长度
private static int standard = 100;
//标准三边之和
private static int maxStandard = 160;
/*
* 根据类型、重量(g) 计算运费
* */
public static Map FreightCostCalculation(String type, int length, int width, int height, int weight, int exchange) {
Map map = new HashMap();
int price = 0;
boolean key = true;
int excess = 0;
int max = length + width + height;
//判断边长是否符合标准
if (length > standard || width > standard || height > standard || max > maxStandard) {
//三边各超100或者和超160
key = false;
} else {
// 判断重量是否超重
if (weight > maxWeight) {
//超重无法计算
key = false;
} else {
//分析重量
if (weight > initialWeight) {
//计算超出重量
weight = weight - initialWeight;
excess = excessPrice * ((int) Math.ceil(weight / excessWeight));
}
}
if (key) {
//计算价格
if (type.equals("NORMAL")) {
//普货
price = gInitalPrice + excess;
} else {
price = sInitalPrice + excess;
}
}
}
map.put("price", price);
map.put("key", key);
return map;
}
}
package org.ta.pddserver;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.ta.pddserver.model.enums.OrderProblemType;
import org.ta.pddserver.model.pddgd.request.GDTicketListRequest;
import org.ta.pddserver.model.pddgd.request.GDTicketReplyRequest;
import org.ta.pddserver.model.pddgd.request.GDUploadRequest;
import org.ta.pddserver.model.pddgd.response.GDTicketReplyRepsonse;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
import org.ta.pddserver.model.pddjy.request.PddServiceConsoProblemOrderNotifyRequest;
import org.ta.pddserver.model.pddlg.request.LGBaseModel;
import org.ta.pddserver.utils.ImageUtils;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
@Slf4j
public class GDTest3 {
private static final String CLIENT_ID = "7c75c365a1a64036a598ab6b09ce0c06";
private static final String CLIENT_SECRET = "f0752b6d5d6c214b7e255586fc4dfde382e9a6df";
@Test
public void test1() {
GDTicketListRequest request = new GDTicketListRequest();
request.setClient_id(CLIENT_ID);
long end = new Date().getTime() / 1000;
request.setEnd_updated_at(end);
request.setStart_updated_at(end - 1800);
request.setPage(1);
request.setPage_size(100);
request.setType("pdd.logistics.ticket.get");
long time = new Date().getTime() / 1000;
request.setTimestamp(time);
request.setSign(PddSignTool.generateSign(request, CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPostGD(request);
log.info("resp = {}", resp);
}
@Test
public void Test2(){
Long ticketId = 176179297549537L;
String waybill_no = "773484253589148";
GDTicketReplyRequest replyRequest = new GDTicketReplyRequest();
replyRequest.setTicket_id(ticketId);
replyRequest.setWaybill_no(waybill_no);
replyRequest.setHandle_result("757类型工单测试三次回复内容,赔付100,无附件");
replyRequest.setSign_state(1);
replyRequest.setCompensate_state(2);
replyRequest.setCompensate_amount(100);
replyRequest.setDuty(1);
replyRequest.setExpress_dealer("处理人四号");
replyRequest.setExpress_dealer_contact("15067011004");
replyRequest.setReply_type(1);
// replyRequest.setAttach_path_list("[\"https://img-test.pddpic.com/open-gw/2066d9194a/c2c976cc793423a1d413c6395ad225c4.jpg\",\"https://img-test.pddpic.com/open-gw/2066d9194a/ceadf7d50fa2cd9850b10a3c769421e7.jpg\"]");
replyRequest.setClient_id(CLIENT_ID);
replyRequest.setType("pdd.logistics.ticket.notify");
long time = new Date().getTime() / 1000;
replyRequest.setTimestamp(time);
replyRequest.setSign(PddSignTool.generateSign(replyRequest, CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPostGD(replyRequest);
log.info("resp = {}", resp);
JSONObject respObj = JSON.parseObject(resp);
JSONObject respObject = respObj.getJSONObject("logistics_ticket_notify_response");
if (respObject == null) {
return;
}
GDTicketReplyRepsonse replyRepsonse = respObject.toJavaObject(GDTicketReplyRepsonse.class);
log.info("replyRepsonse is_success:{}", replyRepsonse.getIs_success());
}
@Test
public void uploadImage() throws IOException {
GDUploadRequest request = new GDUploadRequest();
request.setClient_id(CLIENT_ID);
request.setType("pdd.logistics.ticket.image.upload");
long time = new Date().getTime() / 1000;
request.setTimestamp(time);
request.setImage(new ImageUtils().downloadCompressToBase64("https://images.v2.tradeany.com/files/20251030/5eaac48c24c5427fa9e055d0976d5e89.jpg"));
request.setSign(PddSignTool.generateSign(request, CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPostGD(request);
log.info("resp = {}", resp);
}
}
......@@ -14,17 +14,21 @@ import java.util.ArrayList;
@Slf4j
public class LGTest2 {
private static final String CLIENT_ID = "d0217707e1194c46b57e696ac7619a06";
private static final String CLIENT_SECRET = "a5aba84483d8387030899f01276b06a194942470";
@Test
public void test1() {
PddLogisticsCoTrackNotifyRequest request = new PddLogisticsCoTrackNotifyRequest();
request.setClient_id("8f5f3f9c92e847b2894fc9c0afce3d61");
request.setClient_id(CLIENT_ID);
request.setShip_id("567");
request.setTarget_client_id("8f5f3f9c92e847b2894fc9c0afce3d61");
request.setTarget_client_id(CLIENT_ID);
request.setTimestamp(System.currentTimeMillis() / 1000);
PddLogisticsCoTrackNotifyRequest.DataObject dataObject = getDataObject();
request.setDataObject(dataObject);
request.encodeData();
request.setSign(PddSignTool.generateSign(request, "281d79ad5117d20a51efb9e7b0d5f7ee336399b0"));
request.setSign(PddSignTool.generateSign(request, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(request));
String resp = PddHttpTool.sendJsonPost(request);
log.info("resp = {}", resp);
......@@ -35,11 +39,11 @@ public class LGTest2 {
@Test
public void test2() {
PddLogisticsSecondaryCityGetRequest request = new PddLogisticsSecondaryCityGetRequest();
request.setClient_id("8f5f3f9c92e847b2894fc9c0afce3d61");
request.setClient_id(CLIENT_ID);
request.setShip_id("567");
request.setTarget_client_id("8f5f3f9c92e847b2894fc9c0afce3d61");
request.setTarget_client_id(CLIENT_ID);
request.setTimestamp(System.currentTimeMillis() / 1000);
request.setSign(PddSignTool.generateSign(request, "281d79ad5117d20a51efb9e7b0d5f7ee336399b0"));
request.setSign(PddSignTool.generateSign(request, CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(request));
String resp = PddHttpTool.sendJsonPost(request);
log.info("resp = {}", resp);
......
{
"logistics_ticket_get_response": {
"logistics_ticket_list": [
{
"area_name": "韩国",
"created_at": 1761791335,
"create_type": 1,
"pre_delivery_id": "0",
"source": 0,
"title": "包裹丢失/破损;包裹错发/漏发;mock消费者首次投诉",
"cabinet_code": "",
"compensate_state": 0,
"urgent_type": 0,
"updated_at": 1761791335,
"receive_name": "김명상",
"sub_type_ids": [
1303
],
"waybill_no": "773484253589148",
"compensate_amount": 0,
"receive_address": "제주특별자치도 제주시 추자면 韩国偏远地址",
"receive_contact": "01012345678",
"express_dealer": "",
"express_dealer_contact": "",
"handle_result": "",
"type_id": 747,
"ticket_id": 176179133571489,
"sign_state": 0,
"duty": 0,
"express_company_id": 567,
"retreat_count": 0,
"status": 0
}
],
"total_count": 1,
"request_id": "17617914287422136"
}
}
{
"logistics_ticket_get_response": {
"logistics_ticket_list": [
{
"area_name": "韩国",
"created_at": 1761791335,
"create_type": 1,
"description": "其他,mock消费者二次投诉",
"pre_delivery_id": "0",
"source": 0,
"title": "包裹丢失/破损;包裹错发/漏发;mock消费者首次投诉",
"cabinet_code": "",
"compensate_state": 2,
"urgent_type": 0,
"updated_at": 1761792633,
"receive_name": "김명상",
"sub_type_ids": [
1303
],
"waybill_no": "773484253589148",
"compensate_amount": 0,
"receive_address": "제주특별자치도 제주시 추자면 韩国偏远地址",
"receive_contact": "15012345678",
"express_dealer": "处理人甲",
"express_dealer_contact": "18599877823",
"express_attachment": [
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/de1e9e6a5adaee930456e4e521a6dcb2.jpg"
}
],
"handle_result": "无",
"type_id": 747,
"ticket_id": 176179133571489,
"sign_state": 1,
"duty": 1,
"express_company_id": 567,
"retreat_count": 1,
"status": 0
}
],
"total_count": 1,
"request_id": "17617926778783270"
}
}
{
"logistics_ticket_get_response": {
"logistics_ticket_list": [
{
"area_name": "韩国",
"attach_url": [
"http://testimg.yangkeduo.com/pdd_ticket_image/2066d9194a/e709b28d7515fe67c24ef5e9da15e742.jpeg",
"http://testimg.yangkeduo.com/pdd_ticket_image/2066d9194a/0c2ac6e5432aa961bfefa3d7faf888e5.png"
],
"created_at": 1761792975,
"create_type": 0,
"description": "备注:这是一段mock的备注内容",
"pre_delivery_id": "0",
"source": 0,
"title": "集运测试-恶意引导修改取消订单问题描述 签收地址:mock一个签收地址",
"cabinet_code": "",
"compensate_state": 0,
"urgent_type": 0,
"updated_at": 1761792975,
"receive_name": "김명상",
"waybill_no": "773484253589148",
"compensate_amount": 0,
"receive_address": "mock一个签收地址",
"receive_contact": "15012345678",
"express_dealer": "",
"express_dealer_contact": "",
"handle_result": "",
"type_id": 757,
"ticket_id": 176179297549537,
"sign_state": 0,
"duty": 0,
"express_company_id": 567,
"retreat_count": 0,
"status": 0
},
{
"area_name": "韩国",
"created_at": 1761791335,
"create_type": 1,
"description": "其他,mock消费者二次投诉",
"pre_delivery_id": "0",
"source": 0,
"title": "包裹丢失/破损;包裹错发/漏发;mock消费者首次投诉",
"cabinet_code": "",
"compensate_state": 2,
"urgent_type": 0,
"updated_at": 1761792820,
"receive_name": "김명상",
"sub_type_ids": [
1303
],
"waybill_no": "773484253589148",
"compensate_amount": 888,
"receive_address": "제주특별자치도 제주시 추자면 韩国偏远地址",
"receive_contact": "15012345678",
"express_dealer": "处理人乙",
"express_dealer_contact": "15067991234",
"express_attachment": [
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/b0ffff8583115046a5e0e70a86f4b156.jpg"
},
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/de1e9e6a5adaee930456e4e521a6dcb2.jpg"
}
],
"handle_result": "mock工单联调二次处理回复",
"type_id": 747,
"ticket_id": 176179133571489,
"sign_state": 1,
"duty": 1,
"express_company_id": 567,
"retreat_count": 1,
"status": 1
}
],
"total_count": 2,
"request_id": "17617931024455036"
}
}
{
"logistics_ticket_get_response": {
"logistics_ticket_list": [
{
"area_name": "韩国",
"attach_url": [
"http://testimg.yangkeduo.com/pdd_ticket_image/2066d9194a/e709b28d7515fe67c24ef5e9da15e742.jpeg",
"http://testimg.yangkeduo.com/pdd_ticket_image/2066d9194a/0c2ac6e5432aa961bfefa3d7faf888e5.png"
],
"created_at": 1761792975,
"create_type": 0,
"description": "恶意引导修改取消订单二次下发模板",
"pre_delivery_id": "0",
"source": 0,
"title": "集运测试-恶意引导修改取消订单问题描述 签收地址:mock一个签收地址",
"cabinet_code": "",
"compensate_state": 2,
"urgent_type": 0,
"updated_at": 1761793354,
"receive_name": "김명상",
"waybill_no": "773484253589148",
"compensate_amount": 999,
"receive_address": "mock一个签收地址",
"receive_contact": "15012345678",
"express_dealer": "处理人甲",
"express_dealer_contact": "15067999999",
"express_attachment": [
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/c2c976cc793423a1d413c6395ad225c4.jpg"
}
],
"handle_result": "mock工单联调首次处理回复",
"type_id": 757,
"ticket_id": 176179297549537,
"sign_state": 1,
"duty": 1,
"express_company_id": 567,
"retreat_count": 1,
"status": 0
},
{
"area_name": "韩国",
"created_at": 1761791335,
"create_type": 1,
"description": "其他,mock消费者二次投诉",
"pre_delivery_id": "0",
"source": 0,
"title": "包裹丢失/破损;包裹错发/漏发;mock消费者首次投诉",
"cabinet_code": "",
"compensate_state": 2,
"urgent_type": 0,
"updated_at": 1761792820,
"receive_name": "김명상",
"sub_type_ids": [
1303
],
"waybill_no": "773484253589148",
"compensate_amount": 888,
"receive_address": "제주특별자치도 제주시 추자면 韩国偏远地址",
"receive_contact": "15012345678",
"express_dealer": "处理人乙",
"express_dealer_contact": "15067991234",
"express_attachment": [
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/b0ffff8583115046a5e0e70a86f4b156.jpg"
},
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/de1e9e6a5adaee930456e4e521a6dcb2.jpg"
}
],
"handle_result": "mock工单联调二次处理回复",
"type_id": 747,
"ticket_id": 176179133571489,
"sign_state": 1,
"duty": 1,
"express_company_id": 567,
"retreat_count": 1,
"status": 1
}
],
"total_count": 2,
"request_id": "17617933875877167"
}
}
{
"logistics_ticket_get_response": {
"logistics_ticket_list": [
{
"area_name": "韩国",
"attach_url": [
"http://testimg.yangkeduo.com/pdd_ticket_image/2066d9194a/e709b28d7515fe67c24ef5e9da15e742.jpeg",
"http://testimg.yangkeduo.com/pdd_ticket_image/2066d9194a/0c2ac6e5432aa961bfefa3d7faf888e5.png"
],
"created_at": 1761792975,
"create_type": 0,
"description": "恶意引导修改取消订单三次下发模板",
"pre_delivery_id": "0",
"source": 0,
"title": "集运测试-恶意引导修改取消订单问题描述 签收地址:mock一个签收地址",
"cabinet_code": "",
"compensate_state": 1,
"urgent_type": 0,
"updated_at": 1761793639,
"receive_name": "김명상",
"waybill_no": "773484253589148",
"compensate_amount": 0,
"receive_address": "mock一个签收地址",
"receive_contact": "15012345678",
"express_dealer": "处理人三",
"express_dealer_contact": "15067011001",
"express_attachment": [
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/c2c976cc793423a1d413c6395ad225c4.jpg"
},
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/ceadf7d50fa2cd9850b10a3c769421e7.jpg"
},
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/c2c976cc793423a1d413c6395ad225c4.jpg"
}
],
"handle_result": "757类型工单测试二次回复内容,此次没有赔付,两个附件",
"type_id": 757,
"ticket_id": 176179297549537,
"sign_state": 1,
"duty": 1,
"express_company_id": 567,
"retreat_count": 2,
"status": 0
},
{
"area_name": "韩国",
"created_at": 1761791335,
"create_type": 1,
"description": "其他,mock消费者二次投诉",
"pre_delivery_id": "0",
"source": 0,
"title": "包裹丢失/破损;包裹错发/漏发;mock消费者首次投诉",
"cabinet_code": "",
"compensate_state": 2,
"urgent_type": 0,
"updated_at": 1761792820,
"receive_name": "김명상",
"sub_type_ids": [
1303
],
"waybill_no": "773484253589148",
"compensate_amount": 888,
"receive_address": "제주특별자치도 제주시 추자면 韩国偏远地址",
"receive_contact": "15012345678",
"express_dealer": "处理人乙",
"express_dealer_contact": "15067991234",
"express_attachment": [
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/b0ffff8583115046a5e0e70a86f4b156.jpg"
},
{
"url": "https://img-test.pddpic.com/open-gw/2066d9194a/de1e9e6a5adaee930456e4e521a6dcb2.jpg"
}
],
"handle_result": "mock工单联调二次处理回复",
"type_id": 747,
"ticket_id": 176179133571489,
"sign_state": 1,
"duty": 1,
"express_company_id": 567,
"retreat_count": 1,
"status": 1
}
],
"total_count": 2,
"request_id": "17617936806386622"
}
}
{
"providerCode": "ABC",
"consoWarehouseCode": "wh001",
"logisticsOrderCode": "xx0000001",
"bizType": "CONSO",
"consoType": "FAST",
"buyerCode": "BC0001",
"dereRecogCode": "D0001",
"packageQuantity": 1,
"mailDetails": [
{
"expressCode": "快递公司编码",
"mailNo": "344789123"
}
"providerCode": "HAIJI_KR",
"consoWarehouseCode": "HJJY001",
"deliveryType": "homeDelivery",
"sign": "CEB15BAE0013931E165CCDA170034165",
"segmentCode": "SENDTORECEVER",
"type": "pdd.service.conso.fee.query",
"logisticsOrderCodes": [
"PC25102903435973837318059"
],
"items": [
"client_id": "d0217707e1194c46b57e696ac7619a06",
"goodsType": "NORMAL",
"consoType": "SEA",
"receiverDetail": {
"country": "KR",
"province": "서울특별시",
"city": "강북구",
"district": "우이동",
"postCode": "01000"
},
"from_client_id": "0f192a79622447c08ddcbce8c6f6152a",
"request_id": "706432872",
"mailDetails": [
{
"itemId": "1234467",
"itemName": "牛仔外套",
"categoryName": "衣服",
"totalActualPayment": 5300,
"currencyUnit": "CENT",
"currency": "CNY",
"itemQuantity": 2,
"itemPicUrl": "https://img.pddpic.com/xxx.jpeg",
"itemSkuProperty": "黑色15寸",
"chargedStatus": true,
"magneticStatus": true,
"categoryId": 101
"mailNo": "773833357957029",
"expressCode": "STO"
}
],
"buyerDetail": {
"name": "zhangsan",
"telePhone": "13134563214",
"country": "中国",
"province": "香港特别行政区",
"city": "九龙",
"district": "黄大仙区",
"detailAddress": "详细地址",
"postCode": "xxx"
},
"paymentDetail": {
"tradeOrderSn": "20220511-00001",
"tradeOrderValue": 5000,
"currencyUnit": "CENT",
"currency": "CNY"
},
"tags": [
"FREE_SHIPPING"
]
"timestamp": "1761706705"
}
\ No newline at end of file
{
"providerCode": "HAIJI_KR",
"tradeOrderActualAmountTotal": 2050,
"consoWarehouseCode": "HJJY001",
"deliveryType": "homeDelivery",
"sign": "87A69D3356F7038AFF75C184AB7DCFC9",
"segmentCode": "SENDTORECEVER",
"type": "pdd.service.conso.outbound.notice",
"client_id": "d0217707e1194c46b57e696ac7619a06",
"buyerCode": "e0443ec295ae80b2fb957889140eacaa",
"consoType": "SEA",
"orderDetails": [
{
"itemId": "400005926656",
"itemName": "集运普通商品",
"itemQuantity": 1,
"orderSn": "251029-343597422281675",
"actualAmount": 2050,
"logisticsOrderCode": "PC25102903435973837318059",
"categoryName": "扫描仪",
"weightTotal": 300,
"categoryId": 4730,
"productName": "苹果"
}
],
"freightFeeDetail": {
"payOrderId": "251029-171798730441675",
"discountFee": 0,
"payTime": "2025-10-29 11:13:50",
"feeDetails": [
{
"amount": 1850,
"currency": "CNY",
"type": "freight_fee",
"currencyUnit": "CENT",
"scene": "freight_fee"
}
],
"weight": 300,
"currency": "CNY",
"freightPrice": 1850,
"rentFee": 0,
"currencyUnit": "CENT",
"goodsType": "NORMAL"
},
"itemQuantityTotal": 1,
"receiverDetail": {
"country": "KR",
"province": "서울특별시",
"city": "강북구",
"district": "우이동",
"name": "nanjiexi",
"detailAddress": "서울특별시测试地址",
"postCode": "01000",
"idNumber": "P666666666666",
"telePhone": "01099999999"
},
"from_client_id": "0f192a79622447c08ddcbce8c6f6152a",
"orderCode": "PP25102913743895347818059",
"orderSns": [
"251029-343597422281675"
],
"request_id": "-1242014517",
"mailDetails": [
{
"mailNo": "773833357957029",
"expressCode": "STO"
}
],
"timestamp": "1761707668"
}
\ No newline at end of file
{
"logistics_ticket_image_upload_response": {
"image_url": "https://img-test.pddpic.com/open-gw/2066d9194a/de1e9e6a5adaee930456e4e521a6dcb2.jpg",
"request_id": "17617922025930615"
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment