Commit bb02446d authored by Allen Chen's avatar Allen Chen

commit

parent affc9502
......@@ -73,12 +73,17 @@
<artifactId>thumbnailator</artifactId>
<version>0.4.19</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version> <!-- 使用最新版本 -->
</dependency>
<!-- rabbitmq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
......
......@@ -2,8 +2,10 @@ package org.ta.pddserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class PddServerApplication {
public static void main(String[] args) {
......
package org.ta.pddserver.config;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import java.io.IOException;
@WebFilter(
urlPatterns = {"/apis/*"}, filterName = "apiFilter"
)
@Order(1)
@Slf4j
public class APIFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
log.info("API 过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("API 开始处理请求,过滤数据");
}
}
package org.ta.pddserver.config;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import java.io.IOException;
@WebFilter(
urlPatterns = {"/open/*"}, filterName = "openFilter"
)
@Order(1)
@Slf4j
public class OpenFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
log.info("OPEN 过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("OPEN 开始处理请求,过滤数据");
}
}
......@@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.ta.pddserver.config.PddAPIConfig;
import org.ta.pddserver.entity.LogOrderMailDetailIoEntity;
import org.ta.pddserver.entity.TraceObjectEntity;
import org.ta.pddserver.model.api.request.CollectOrderListRequest;
import org.ta.pddserver.model.api.request.CollectOrderRequest;
......@@ -21,10 +22,7 @@ import org.ta.pddserver.model.enums.StatusEnum;
import org.ta.pddserver.model.pddlg.common.TraceObject;
import org.ta.pddserver.model.pddlg.request.PddLogisticsCoTrackNotifyRequest;
import org.ta.pddserver.model.pddlg.response.PddLogisticsCoTrackNotifyResponse;
import org.ta.pddserver.service.impl.CollectOrderDetailImpl;
import org.ta.pddserver.service.impl.CollectOrderImpl;
import org.ta.pddserver.service.impl.CollectReceiverDetailImpl;
import org.ta.pddserver.service.impl.TraceObjectImpl;
import org.ta.pddserver.service.impl.*;
import org.ta.pddserver.utils.JsonResponse;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
......@@ -48,6 +46,7 @@ public class DataGetController {
private TraceObjectImpl traceObjectImpl;
@Resource
private CollectReceiverDetailImpl collectReceiverDetailImpl;
private LogOrderMailDetailIoImpl logOrderMailDetailIoImpl;
/*待拆包列表*/
@PostMapping("/notifyTrace")
......@@ -108,10 +107,11 @@ public class DataGetController {
CollectOrderInfoResponse collectOrderInfoResponse = collectOrderImpl.getInfoByOrderCode(collectOrderRequest.getOrderCode());
List<CollectOrderDetailResponse> list = collectOrderDetailImpl.getListByOrderCode(collectOrderRequest.getOrderCode());
CollectReceiverDetailResponse collectOrderReceiverDetailResponse = collectReceiverDetailImpl.getByOrderCode(collectOrderRequest.getOrderCode());
List<LogOrderMailDetailIoEntity> logistics = logOrderMailDetailIoImpl.getOutByOrderCode(collectOrderRequest.getOrderCode());
map.put("info", collectOrderInfoResponse);
map.put("detail", list);
map.put("receiver", collectOrderReceiverDetailResponse);
map.put("logistics", logistics);
return JsonResponse.generateLocalCommonSuccessResponse(map);
}
......
......@@ -14,15 +14,11 @@ import org.ta.pddserver.entity.GDAttachmentEntity;
import org.ta.pddserver.entity.GDReplyAttachmentEntity;
import org.ta.pddserver.entity.GDReplyEntity;
import org.ta.pddserver.entity.GDTicketEntity;
import org.ta.pddserver.model.api.request.LogOrderListRequest;
import org.ta.pddserver.model.api.request.ReplyRequest;
import org.ta.pddserver.model.api.request.TicketListRequest;
import org.ta.pddserver.model.api.response.GDReplyListResponse;
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.pddgd.response.GDTicketRepsonse;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
import org.ta.pddserver.service.impl.GDAttachmentImpl;
import org.ta.pddserver.service.impl.GDReplyAttachmentImpl;
import org.ta.pddserver.service.impl.GDReplyImpl;
......@@ -31,7 +27,7 @@ import org.ta.pddserver.utils.ImageUtils;
import org.ta.pddserver.utils.JsonResponse;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
import org.ta.pddserver.xxl.GDOperator;
import org.ta.pddserver.serviceutil.GDOperator;
import java.io.IOException;
import java.util.*;
......
......@@ -21,6 +21,7 @@ import org.ta.pddserver.model.enums.StatusEnum;
import org.ta.pddserver.model.pddjy.request.*;
import org.ta.pddserver.model.pddjy.response.PddServiceConsoDerelictionResponse;
import org.ta.pddserver.service.impl.*;
import org.ta.pddserver.serviceutil.WaybillOperator;
import org.ta.pddserver.utils.*;
import java.util.*;
......@@ -66,6 +67,9 @@ public class PddLocalController {
@Resource
UnpackNoticeImpl unpackNoticeImpl;
@Resource
WaybillOperator waybillOperator;
/*集运单列表*/
@Operation(
summary = "分页查询收到的集运单列表",
......@@ -930,8 +934,16 @@ public class PddLocalController {
for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) {
PddServiceConsoOutboundRequest.PackageInfo packageInfo = new PddServiceConsoOutboundRequest.PackageInfo();
notifyRequest.getPackageInfos().add(packageInfo);
packageInfo.setOutboundMailNo(outPackage.getMailNo());
packageInfo.setExpressCode(outPackage.getExpressCode());
// ---- 开始 修改为不认同前端输入,改为系统自动生成
// packageInfo.setOutboundMailNo(outPackage.getMailNo());
// packageInfo.setExpressCode(outPackage.getExpressCode());
WaybillOperator.WaybillInfo waybillInfo = waybillOperator.generateWaybillInfo();
packageInfo.setOutboundMailNo(waybillInfo.getMailNo());
packageInfo.setExpressCode(waybillInfo.getExpressCode());
outPackage.setExpressCode(waybillInfo.getExpressCode());
outPackage.setMailNo(waybillInfo.getMailNo());
// 结束 ----
packageInfo.setPackageType(outPackage.getPackageType());
packageInfo.setLength(outPackage.getLength());
packageInfo.setWidth(outPackage.getWidth());
......@@ -989,7 +1001,12 @@ public class PddLocalController {
requestModel.setTimestamp(time);
requestModel.setSign(PddSignTool.generateSign(requestModel, PddAPIConfig.CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPost(requestModel);
JSONObject jsonObject = JSON.parseObject(resp);
JSONObject respObject = (JSONObject) jsonObject.get("response");
if (!respObject.getBoolean("success")) {
return JsonResponse.generateOpenCommonFailedResponse(-1, "拼多多订单出库失败");
}
WorldexUtil.noticePddOrderOut(notifyRequest.getOrderCode());
if (outBoundRequest.getOutPackageList() != null && outBoundRequest.getOutPackageList().size() > 0) {
for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) {
LogOrderMailDetailIoEntity logOrderMailDetailIoEntity = new LogOrderMailDetailIoEntity();
......@@ -998,6 +1015,7 @@ public class PddLocalController {
logOrderMailDetailIoEntity.setLogisticsOrderCode(outBoundRequest.getOrderCode());
logOrderMailDetailIoEntity.setExpressCode(outPackage.getExpressCode());
logOrderMailDetailIoEntity.setStatus(StatusEnum.FINISHOUTBOUND.getCode());
logOrderMailDetailIoEntity.setAction("FINISHOUTBOUND");
logOrderMailDetailIoEntity.setReq(JSON.toJSONString(requestModel));
logOrderMailDetailIoEntity.setResp(resp);
if (outPackage.getOutBound() != null && outPackage.getOutBound().size() > 0) {
......@@ -1070,8 +1088,15 @@ public class PddLocalController {
for (OutBoundRequest.OutPackage outPackage : outBoundRequest.getOutPackageList()) {
PddServiceConsoOutboundRequest.PackageInfo packageInfo = new PddServiceConsoOutboundRequest.PackageInfo();
notifyRequest.getPackageInfos().add(packageInfo);
packageInfo.setOutboundMailNo(outPackage.getMailNo());
packageInfo.setExpressCode(outPackage.getExpressCode());
// ---- 开始 修改为不认同前端输入,改为系统自动生成
// packageInfo.setOutboundMailNo(outPackage.getMailNo());
// packageInfo.setExpressCode(outPackage.getExpressCode());
WaybillOperator.WaybillInfo waybillInfo = waybillOperator.generateWaybillInfo();
packageInfo.setOutboundMailNo(waybillInfo.getMailNo());
packageInfo.setExpressCode(waybillInfo.getExpressCode());
outPackage.setExpressCode(waybillInfo.getExpressCode());
outPackage.setMailNo(waybillInfo.getMailNo());
// 结束 ----
packageInfo.setPackageType(outPackage.getPackageType());
packageInfo.setLength(outPackage.getLength());
packageInfo.setWidth(outPackage.getWidth());
......@@ -1197,6 +1222,12 @@ public class PddLocalController {
}
/* 问题件反馈 */
@Operation(
summary = "问题件反馈",
description = "",
deprecated = false // 是否废弃
)
@PostMapping("/problemOrderNotify")
public JSONObject problemOrderNotify(HttpServletRequest request, @RequestBody ProblemOrderNotifyRequest problemOrderNotifyRequest) {
OrderProblemType problemType = OrderProblemType.verify(problemOrderNotifyRequest.getReasonCode());
......
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 java.util.Date;
@Data
@TableName("waybill_sea")
public class WaybillSeaEntity {
@TableId(value = "uid")
private String uid;
@TableField(value = "expressCode")
private String expressCode;
@TableField(value = "startNo")
private Long startNo;
@TableField(value = "endNo")
private Long endNo;
@TableField(value = "verifyType")
private Integer verifyType;
@TableField(value = "verifyVal")
private Integer verifyVal;
@TableField(value = "currentNo")
private Long currentNo;
}
......@@ -18,4 +18,6 @@ public interface LogOrderMailDetailIoMapper extends BaseMapper<LogOrderMailDetai
@Select("SELECT `uid`, `created`,`status`, `logisticsOrderCode`, `expressCode`, `mailNo`, `action` FROM `log_order_mail_detail_io` WHERE `logisticsOrderCode` LIKE '%${logisticsOrderCode}%' AND `mailNo` LIKE '%${mailNo}%' AND `status` = #{status} ORDER BY uid DESC LIMIT #{offset}, #{size}; ")
List<LogOrderMailDetailIoListResponse> getListByRequest(LogOrderMailDetailIoRequest param);
@Select("SELECT `expressCode`, `mailNo` FROM `log_order_mail_detail_io` WHERE `logisticsOrderCode` = #{orderCode} AND `status` = 60 AND `action` = 'FINISHOUTBOUND';")
List<LogOrderMailDetailIoEntity> findOutByOrderCode(String orderCode);
}
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.ta.pddserver.entity.WaybillSeaEntity;
@Mapper
public interface WaybillSeaMapper extends BaseMapper<WaybillSeaEntity> {
@Select("SELECT * FROM `waybill_sea` ORDER BY `uid` ASC LIMIT 1;")
WaybillSeaEntity selectFirst();
}
package org.ta.pddserver.rabbit;
import com.alibaba.fastjson.JSON;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;
import org.ta.pddserver.config.PddAPIConfig;
import org.ta.pddserver.entity.TraceObjectEntity;
import org.ta.pddserver.model.pddlg.common.TraceObject;
import org.ta.pddserver.model.pddlg.request.PddLogisticsCoTrackNotifyRequest;
import org.ta.pddserver.model.pddlg.response.PddLogisticsCoTrackNotifyResponse;
import org.ta.pddserver.service.impl.TraceObjectImpl;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
import org.ta.pddserver.utils.WorldexUtil;
import java.util.ArrayList;
import java.util.List;
//@Component
@Slf4j
public class RabbitSender {
/**
* 1、出库成功异步通知Worldex
* 2、Worldex回传快递轨迹异步推送给拼多多
* 3、异步生成快递面单,同步下载打印
*/
private static final String TO_WORLDEX_OUTBOUND_NOTICE_QUEUE = "OUTBOUND_NOTICE_QUEUE";
private static final String TO_PDD_TRACE_NOTICE_QUEUE = "TRACE_NOTICE_QUEUE";
private static final String GENERATE_MAIL_LABEL = "GENERATE_MAIL_LABEL";
@Resource
AmqpAdmin amqpAdmin;
@Resource
RabbitTemplate rabbitTemplate;
@Resource
TraceObjectImpl traceObjectImpl;
@PostConstruct
public void init() {
// 声明QUEUE
amqpAdmin.declareQueue(new Queue(TO_WORLDEX_OUTBOUND_NOTICE_QUEUE));
amqpAdmin.declareQueue(new Queue(TO_PDD_TRACE_NOTICE_QUEUE));
amqpAdmin.declareQueue(new Queue(GENERATE_MAIL_LABEL));
}
/**
* 发送出库通知
*
* @param orderCode 订单编号
*/
public void mqSendOutboundNotice(String orderCode) {
rabbitTemplate.convertAndSend(TO_WORLDEX_OUTBOUND_NOTICE_QUEUE, orderCode);
}
/**
* 发送轨迹通知
*
* @param traceUid 轨迹UID
*/
public void mqSendTraceUpdate(String traceUid) {
rabbitTemplate.convertAndSend(TO_PDD_TRACE_NOTICE_QUEUE, traceUid);
}
/**
* 创建快递面单
*
* @param mailNo 快递单号
*/
public void mqGenerateMailLabel(String mailNo) {
rabbitTemplate.convertAndSend(GENERATE_MAIL_LABEL, mailNo);
}
/**
* 出库通知queue
* @param message 消息信息
*/
@RabbitListener(queues = TO_WORLDEX_OUTBOUND_NOTICE_QUEUE)
public void handleToWorldexOutboundNotice(Message message) {
String orderCode = new String(message.getBody());
log.info("向Worldex下发单号 {} 出库", orderCode);
for (int i = 0; i < 5; i ++) {
if (WorldexUtil.noticePddOrderOut(orderCode)){
return;
}
}
log.error("RABBITMQ 通知Worldex失败");
}
/**
* 轨迹推送
* @param message 消息信息
*/
@RabbitListener(queues = TO_PDD_TRACE_NOTICE_QUEUE)
public void handleToPddTraceNotice(Message message) {
String traceUid = new String(message.getBody());
log.info("向拼多多发送轨迹更新信息 {}", traceUid);
for (int i = 0; i < 5; i ++) {
if (this.sendTraceUpdate(traceUid)){
return;
}
}
log.error("RABBITMQ 轨迹发送失败");
}
public boolean sendTraceUpdate(String traceUid) {
TraceObjectEntity traceObjectEntity = traceObjectImpl.getById(traceUid);
//推送pdd
PddLogisticsCoTrackNotifyRequest requests = new PddLogisticsCoTrackNotifyRequest();
requests.setClient_id(PddAPIConfig.CLIENT_ID);
requests.setShip_id(PddAPIConfig.SHIP_ID);
requests.setTarget_client_id(PddAPIConfig.CLIENT_ID);
requests.setTimestamp(System.currentTimeMillis() / 1000);
PddLogisticsCoTrackNotifyRequest.DataObject dataObjects = new PddLogisticsCoTrackNotifyRequest.DataObject();
dataObjects.setTraces(new ArrayList<>());
dataObjects.getTraces().add(TraceObject.createFromTraceEntity(traceObjectEntity));
requests.setDataObject(dataObjects);
requests.encodeData();
requests.setSign(PddSignTool.generateSign(requests, PddAPIConfig.CLIENT_SECRET));
log.info("requestModel:{}", JSON.toJSONString(requests));
String resp = PddHttpTool.sendJsonPost(requests);
log.info("resp = {}", resp);
PddLogisticsCoTrackNotifyResponse response = JSON.parseObject(resp, PddLogisticsCoTrackNotifyResponse.class);
log.info("response = {}", JSON.toJSONString(response));
return true;
}
/**
* 制作面单
* @param message 消息信息
*/
@RabbitListener(queues = GENERATE_MAIL_LABEL)
public void handleGenerateMailLabel(Message message) {
String mailNo = new String(message.getBody());
log.info("制作面单 {}", mailNo);
for (int i = 0; i < 5; i ++) {
if (this.generateMailLabel(mailNo)){
return;
}
}
log.error("RABBITMQ 制作快递面单失败");
}
public boolean generateMailLabel(String mailNo) {
return true;
}
}
package org.ta.pddserver.service;
import com.baomidou.mybatisplus.extension.service.IService;
import org.ta.pddserver.entity.WaybillSeaEntity;
public interface WaybillSeaService extends IService<WaybillSeaEntity> {
}
......@@ -29,4 +29,7 @@ public class LogOrderMailDetailIoImpl extends ServiceImpl<LogOrderMailDetailIoMa
}
public List<LogOrderMailDetailIoEntity> getOutByOrderCode(String orderCode) {
return this.baseMapper.findOutByOrderCode(orderCode);
}
}
\ 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.WaybillSeaEntity;
import org.ta.pddserver.mapper.WaybillSeaMapper;
import org.ta.pddserver.service.WaybillSeaService;
@Service
public class WaybillSeaImpl extends ServiceImpl<WaybillSeaMapper, WaybillSeaEntity> implements WaybillSeaService {
public WaybillSeaEntity getFirstUsable() {
return this.baseMapper.selectFirst();
}
}
\ No newline at end of file
package org.ta.pddserver.xxl;
package org.ta.pddserver.serviceutil;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -24,7 +23,7 @@ public class GDOperator {
@Resource
GDTicketImpl gdTicketImpl;
@Autowired
@Resource
private GDAttachmentImpl gDAttachmentImpl;
// @Scheduled(fixedRate = 1000 * 60 * 5, initialDelay = 1000) // 每5分钟执行一次
......
package org.ta.pddserver.serviceutil;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.ta.pddserver.entity.WaybillSeaEntity;
import org.ta.pddserver.service.impl.WaybillSeaImpl;
@Slf4j
@Component
public class WaybillOperator {
@Resource
WaybillSeaImpl waybillSeaImpl;
WaybillSeaEntity currentWaybillSea;
@PostConstruct
public void init() {
log.info("初始化 WaybillOperator,获取当前面单池状态");
WaybillSeaEntity waybillSeaEntity = waybillSeaImpl.getFirstUsable();
if (waybillSeaImpl != null) {
currentWaybillSea = waybillSeaEntity;
log.info("面单池更新完成,快递公司编码{},当前单号{},剩余单号数量{}", waybillSeaEntity.getExpressCode(), waybillSeaEntity.getCurrentNo(), (waybillSeaEntity.getEndNo() - waybillSeaEntity.getCurrentNo()));
}
}
public WaybillInfo generateWaybillInfo() {
WaybillInfo waybillInfo = new WaybillInfo();
Long currentNo = currentWaybillSea.getCurrentNo() + 1;
long verifyByte = 0;
if (currentWaybillSea.getVerifyType() == 1) {
verifyByte = currentNo % currentWaybillSea.getVerifyVal();
}
waybillInfo.setExpressCode(currentWaybillSea.getExpressCode());
waybillInfo.setMailNo("" + currentNo + verifyByte);
currentWaybillSea.setCurrentNo(currentNo);
waybillSeaImpl.updateById(currentWaybillSea);
return waybillInfo;
}
@Data
public static class WaybillInfo {
private String expressCode;
private String mailNo;
}
}
package org.ta.pddserver.utils;
import jakarta.servlet.http.HttpServletRequest;
public class HttpRequestHandlerTool {
private static String getClientIP(HttpServletRequest request) {
String xForwardedFor = request.getHeader("X-Forwarded-For");
if (xForwardedFor != null && !xForwardedFor.isEmpty()) {
return xForwardedFor.split(",")[0].trim();
}
String xRealIP = request.getHeader("X-Real-IP");
if (xRealIP != null && !xRealIP.isEmpty()) {
return xRealIP;
}
return request.getRemoteAddr();
}
}
......@@ -28,7 +28,7 @@ public class PddGDUtil {
JSONObject respObject = getTicketsByPage(1, end);
JSONObject jsonObject = respObject.getJSONObject("logistics_ticket_get_response");
total_count = jsonObject.getInteger("total_count");
log.info("本次数量:{}", total_count);
// log.info("本次数量:{}", total_count);
List<GDTicketRepsonse> tempList = jsonObject.getJSONArray("logistics_ticket_list").toJavaList(GDTicketRepsonse.class);
if (tempList != null && !tempList.isEmpty()) {
list.addAll(tempList);
......@@ -52,7 +52,7 @@ public class PddGDUtil {
long time = new Date().getTime() / 1000;
request.setTimestamp(time);
request.setSign(PddSignTool.generateSign(request, CLIENT_SECRET));
String resp = PddHttpTool.sendJsonPostGD(request);
String resp = PddHttpTool.sendJsonPostGD2(request);
return JSON.parseObject(resp);
}
}
......@@ -10,6 +10,7 @@ import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.ta.pddserver.config.PddAPIConfig;
import org.ta.pddserver.entity.LogsPddIoEntity;
import org.ta.pddserver.model.pddgd.request.GDTicketListRequest;
import org.ta.pddserver.model.pddjy.request.JYBaseRequestModel;
import org.ta.pddserver.model.pddlg.request.LGBaseModel;
import org.ta.pddserver.service.LogsPddIoService;
......@@ -48,6 +49,10 @@ public class PddHttpTool {
public static String sendJsonPost(Object requestObj) {
log.info("REQ:{}", JSONObject.toJSONString(requestObj));
// if (requestObj != null) {
// throw new RuntimeException("强制截断");
// }
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
HttpHeaders headers = new HttpHeaders();
headers.set("X-Canary-Staging", "staging");
......@@ -89,4 +94,30 @@ public class PddHttpTool {
}
return resp.getBody();
}
public static String sendJsonPostGD2(Object requestObj) {
// log.info("REQ:{}", JSONObject.toJSONString(requestObj));
// 自动序列化 requestObj 为 JSON,并设置 Content-Type: application/json
HttpHeaders headers = new HttpHeaders();
headers.set("X-Canary-Staging", "staging");
headers.add("Content-Type", "application/json;charset=UTF-8");
HttpEntity<String> requestEntity = new HttpEntity<>(JSONObject.toJSONString(requestObj), headers);
// 2. 封装请求实体(参数 + 头信息)
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> resp = restTemplate.postForEntity(PddAPIConfig.URL_GD, requestEntity, String.class);
// log.info("RESP:{}", resp.getBody());
// 不保存该日志,方式数量过多
/*
if (logsPddIoImpl != null) {
LogsPddIoEntity logsPddIoEntity = new LogsPddIoEntity();
logsPddIoEntity.setAction("GD");
logsPddIoEntity.setReq(JSONObject.toJSONString(requestObj));
logsPddIoEntity.setResp(resp.getBody());
logsPddIoImpl.save(logsPddIoEntity);
}
*/
return resp.getBody();
}
}
......@@ -64,6 +64,19 @@ public class WorldexUtil {
return null;
}
public static Boolean noticePddOrderOut(String orderCode) {
Map<String, String> map = new HashMap<String, String>();
map.put("orderCode", orderCode);
String token = WorldexUtil.getToken();
String resp = WorldexUtil.sendJsonPost("/api/pdd/register", map, token);
log.info("resp = {}", resp);
JSONObject json = JSONObject.parseObject(resp);
if (json.getInteger("code") == 2000) {
return true;
}
return false;
}
private static String getToken() {
long now = System.currentTimeMillis() / 1000 - 100;
if (token.isEmpty() || timeout < now) {
......@@ -93,9 +106,10 @@ public class WorldexUtil {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Accept-Language", "zh-cn");
httpHeaders.set("token", token);
log.info("WORLDEX REQ:{}", JSONObject.toJSONString(requestObj));
HttpEntity<Object> httpEntity = new HttpEntity<Object>(requestObj, httpHeaders);
ResponseEntity<String> resp = restTemplate.exchange(URL + url, HttpMethod.POST, httpEntity, String.class);
log.info("WORLDEX RESP:{}", resp.getBody());
// ResponseEntity<String> resp = restTemplate.postForEntity(URL + url, requestObj, String.class, headers);
return resp.getBody();
}
......
......@@ -8,7 +8,7 @@ spring:
# username: pdd
# password: pdd123
url: jdbc:mysql://rm-j6cv8n7zx12x0sqreuo.mysql.rds.aliyuncs.com:3306/pdd_test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
url: jdbc:mysql://rm-j6cv8n7zx12x0sqreuo.mysql.rds.aliyuncs.com:3306/pdd_prod?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT
username: pdd
password: pdd123
hikari:
......@@ -21,8 +21,8 @@ spring:
application:
name: PddServer
server:
# port: 9000 # 正式端口号
port: 8600 # 测试端口号
port: 9000 # 正式端口号
# port: 8600 # 测试端口号
logging:
level:
org:
......
......@@ -4,11 +4,13 @@ import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.ta.pddserver.config.PddAPIConfig;
import org.ta.pddserver.model.enums.IdentityErrorType;
import org.ta.pddserver.model.enums.OrderProblemType;
import org.ta.pddserver.model.pddjy.request.*;
import org.ta.pddserver.model.pddjy.response.PddServiceConsoDerelictionResponse;
import org.ta.pddserver.utils.PddHttpTool;
import org.ta.pddserver.utils.PddSignTool;
import org.ta.pddserver.utils.WorldexUtil;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
......@@ -958,4 +960,26 @@ public class CommonTest {
log.info("resp = {}", resp);
}
/**
* 测试身份信息验证
*/
@Test
public void testVerifyPersonalInfo() {
String name = "REN SUPING";
String code = "P210015618116";
String phone = "01036196059";
IdentityErrorType errorType = WorldexUtil.verifyIdentity(name, phone, code);
log.info("errorType:{}", errorType);
}
/**
* 测试Worldex 通知出库
*/
@Test
public void testWorldexOrderOut() {
Boolean result = WorldexUtil.noticePddOrderOut("PP25111223915187411540070");
log.info("result:{}", result);
}
}
package org.ta.pddserver;
import org.junit.jupiter.api.Test;
public class Draw {
@Test
public void testDraw() {
int lines = 10;
for (int i = 0; i < lines; i++) {
int count = i * 2 - 1;
for (int j = 0; j < lines - count; j++) {
System.out.print(" ");
}
for (int j = 0; j < count; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
{
"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
"client_id": "8f5f3f9c92e847b2894fc9c0afce3d61",
"request": "{\"executeTime\":\"2025-11-13 11:26:56\",\"isSplitOut\":\"N\",\"orderCode\":\"PP25111223915187411540070\",\"packageInfos\":[{\"expressCode\":\"LOTTO\",\"height\":1,\"inboundMailDetails\":[{\"expressCode\":\"STO\",\"mailNo\":\"777356048647417\"}],\"length\":27,\"outboundMailNo\":\"317758904816\",\"packageType\":\"6\",\"weight\":300,\"width\":25}],\"providerCode\":\"HAIJI_KR\",\"receiverDetail\":{\"city\":\"부평구\",\"country\":\"KR\",\"detailAddress\":\"인천광역시 부평구 부평동 126-9 유진마젤란주상복합 오피스텔1205호\",\"district\":\"부평동\",\"name\":\"REN SUPING\",\"province\":\"인천광역시\",\"telePhone\":\"01036196059\"},\"result\":{\"code\":0},\"segmentCode\":\"SENDTORECEVER\",\"senderDetail\":{\"city\":\"临沂市\",\"country\":\"CN\",\"detailAddress\":\"山东省临沂市兰山区横九路与纵十路交汇兰山财金智慧云仓五期二层二号仓\",\"district\":\"兰山区\",\"name\":\"海际临沂集运仓\",\"province\":\"山东省\",\"telePhone\":\"13857338630\"},\"timeZone\":\"UTC+8\"}",
"request_id": "1763004416978",
"sign": "2CF1816C42C50BD1D7521713A900E57D",
"target_client_id": "8f5f3f9c92e847b2894fc9c0afce3d61",
"timestamp": 1763004416,
"type": "pdd.service.conso.outbound"
}
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