Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
W
wangxiaolu-sfa-module-job
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
sfa
wangxiaolu-sfa-module-job
Commits
fefb55d8
提交
fefb55d8
authored
7月 11, 2025
作者:
000516
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2. 根据京东TC物流单据查询物流轨迹信息
上级
cfaef93e
显示空白字符变更
内嵌
并排
正在显示
11 个修改的文件
包含
575 行增加
和
0 行删除
+575
-0
SentQueryController.java
...ava/com/sfa/job/controller/order/SentQueryController.java
+52
-0
IOrdersSentDao.java
...ain/java/com/sfa/job/domain/order/dao/IOrdersSentDao.java
+16
-0
OrdersSentDaoImpl.java
.../com/sfa/job/domain/order/dao/impl/OrdersSentDaoImpl.java
+41
-0
OrdersSent.java
...main/java/com/sfa/job/domain/order/entity/OrdersSent.java
+88
-0
OrdersSentMapper.java
...ava/com/sfa/job/domain/order/mapper/OrdersSentMapper.java
+25
-0
OrdersSentDto.java
src/main/java/com/sfa/job/pojo/response/OrdersSentDto.java
+75
-0
IOrdersSentQueryService.java
...va/com/sfa/job/service/order/IOrdersSentQueryService.java
+15
-0
OrdersSentQueryServiceImpl.java
...fa/job/service/order/impl/OrdersSentQueryServiceImpl.java
+39
-0
JdtcUtil.java
src/main/java/com/sfa/job/util/JdtcUtil.java
+150
-0
OrdersSentToQince.java
...main/java/com/sfa/job/xxljob/order/OrdersSentToQince.java
+23
-0
OrdersSentMapper.xml
src/main/resources/mapper/OrdersSentMapper.xml
+51
-0
没有找到文件。
src/main/java/com/sfa/job/controller/order/SentQueryController.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
controller
.
order
;
import
com.alibaba.fastjson2.JSONArray
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.exception.ServiceException
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
import
com.sfa.job.service.order.IOrdersSentQueryService
;
import
com.sfa.job.util.JdtcUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.Objects
;
/**
* @author : liqiulin
* @date : 2025-07-08 13
* @describe : 订单物流查询
*/
@RestController
@RequestMapping
(
"/order/sent/query"
)
public
class
SentQueryController
{
@Autowired
private
JdtcUtil
jdtcUtil
;
@Autowired
private
IOrdersSentQueryService
orderSentQueryService
;
@GetMapping
public
Object
query
(
String
sentNo
){
OrdersSentDto
sent
=
orderSentQueryService
.
getSent
(
sentNo
);
Object
sentInfo
=
null
;
if
(
sent
.
getTransport
().
equals
(
"134"
)){
sent
.
setTransportName
(
"京东TC"
);
sentInfo
=
jdTC
(
sent
);
}
sent
.
setSentInfo
(
sentInfo
);
return
sent
;
}
public
Object
jdTC
(
OrdersSentDto
sent
){
JSONArray
traces
=
jdtcUtil
.
getOrderTrace
(
sent
.
getBjSentNo
()
+
"-"
+
sent
.
getBjSentVersion
());
if
(
CollectionUtils
.
isEmpty
(
traces
)){
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_ERROR
);
}
return
traces
.
get
(
0
);
}
}
src/main/java/com/sfa/job/domain/order/dao/IOrdersSentDao.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
domain
.
order
.
dao
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
import
java.util.List
;
/**
* @author : liqiulin
* @date : 2025-07-10 16
* @describe :
*/
public
interface
IOrdersSentDao
{
List
<
OrdersSentDto
>
findByPushqcStatus
();
OrdersSentDto
getSent
(
String
sentNo
);
}
src/main/java/com/sfa/job/domain/order/dao/impl/OrdersSentDaoImpl.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
domain
.
order
.
dao
.
impl
;
import
com.baomidou.dynamic.datasource.annotation.DS
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.exception.CheckedException
;
import
com.sfa.common.core.utils.bean.BeanUtils
;
import
com.sfa.job.domain.order.dao.IOrdersSentDao
;
import
com.sfa.job.domain.order.entity.OrdersSent
;
import
com.sfa.job.domain.order.mapper.OrdersSentMapper
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Objects
;
/**
* @author : liqiulin
* @date : 2025-07-10 16
* @describe :
*/
@DS
(
"bi"
)
@Service
public
class
OrdersSentDaoImpl
implements
IOrdersSentDao
{
@Autowired
private
OrdersSentMapper
ordersSentMapper
;
@Override
public
List
<
OrdersSentDto
>
findByPushqcStatus
()
{
List
<
OrdersSent
>
sents
=
ordersSentMapper
.
findUnsyncQc
();
return
BeanUtils
.
transitionDtos
(
sents
,
OrdersSentDto
.
class
);
}
@Override
public
OrdersSentDto
getSent
(
String
sentNo
)
{
OrdersSent
sentDo
=
ordersSentMapper
.
selectBySentNo
(
sentNo
);
if
(
Objects
.
isNull
(
sentDo
)){
throw
new
CheckedException
(
ECode
.
PARAM_CODE_ISNULL_ERROR
);
}
return
BeanUtils
.
transitionDto
(
sentDo
,
OrdersSentDto
.
class
);
}
}
src/main/java/com/sfa/job/domain/order/entity/OrdersSent.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
domain
.
order
.
entity
;
import
com.baomidou.mybatisplus.annotation.IdType
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
java.io.Serializable
;
import
java.util.Date
;
import
lombok.Data
;
/**
* T100出货单中的物流单据
* @TableName orders_sent
*/
@TableName
(
value
=
"orders_sent"
)
@Data
public
class
OrdersSent
implements
Serializable
{
/**
* 发货单自增ID
*/
@TableId
(
type
=
IdType
.
AUTO
)
private
Long
sendId
;
/**
* 单据编号
*/
private
String
ahSentNo
;
private
String
bjSentNo
;
/**
* 版本号
*/
private
Integer
bjSentVersion
;
/**
* X06:销售出库单;N02:杂发单
*/
private
String
type
;
/**
* 过账日期
*/
private
Date
postData
;
/**
* 状态
*/
private
String
status
;
/**
* 运输公司编码
*/
private
String
transport
;
/**
* 运输公司
*/
private
String
transportName
;
/**
* 快递单号
*/
private
String
expressNo
;
/**
* DD单号
*/
private
String
ddNo
;
/**
* 0:已推送;1:未推送(推送勤策)
*/
private
Integer
pushQc
;
/**
* 创建时间
*/
private
Date
createTime
;
/**
* 更新时间
*/
private
Date
updateTime
;
@TableField
(
exist
=
false
)
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/sfa/job/domain/order/mapper/OrdersSentMapper.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
domain
.
order
.
mapper
;
import
com.sfa.job.domain.order.entity.OrdersSent
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.springframework.stereotype.Repository
;
import
java.util.List
;
/**
* @author a02200059
* @description 针对表【orders_sent(T100出货单中的物流单据)】的数据库操作Mapper
* @createDate 2025-07-10 16:20:04
* @Entity com.sfa.job.domain.order.entity.OrdersSent
*/
@Repository
public
interface
OrdersSentMapper
extends
BaseMapper
<
OrdersSent
>
{
List
<
OrdersSent
>
findUnsyncQc
();
OrdersSent
selectBySentNo
(
String
sentNo
);
}
src/main/java/com/sfa/job/pojo/response/OrdersSentDto.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
pojo
.
response
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* T100出货单中的物流单据
*/
@Data
public
class
OrdersSentDto
implements
Serializable
{
/**
* 发货单自增ID
*/
private
Long
sendId
;
/**
* 单据编号
*/
/**
* 单据编号
*/
private
String
ahSentNo
;
private
String
bjSentNo
;
/**
* 版本号
*/
private
Integer
bjSentVersion
;
/**
* X06:销售出库单;N02:杂发单
*/
private
String
type
;
/**
* 过账日期
*/
private
Date
postData
;
/**
* 状态
*/
private
String
status
;
/**
* 运输公司编码
*/
private
String
transport
;
/**
* 运输公司
*/
private
String
transportName
;
/**
* 快递单号
*/
private
String
expressNo
;
/**
* DD单号
*/
private
String
ddNo
;
private
Object
sentInfo
;
@TableField
(
exist
=
false
)
private
static
final
long
serialVersionUID
=
1L
;
}
\ No newline at end of file
src/main/java/com/sfa/job/service/order/IOrdersSentQueryService.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
service
.
order
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
/**
* @author : liqiulin
* @date : 2025-07-10 16
* @describe :
*/
public
interface
IOrdersSentQueryService
{
void
ordersSentToQince
();
OrdersSentDto
getSent
(
String
sentNo
);
}
src/main/java/com/sfa/job/service/order/impl/OrdersSentQueryServiceImpl.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
service
.
order
.
impl
;
import
com.sfa.job.domain.order.dao.IOrdersSentDao
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
import
com.sfa.job.service.order.IOrdersSentQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
/**
* @author : liqiulin
* @date : 2025-07-10 16
* @describe :
*/
@Service
public
class
OrdersSentQueryServiceImpl
implements
IOrdersSentQueryService
{
@Autowired
private
IOrdersSentDao
ordersSentDao
;
@Override
public
void
ordersSentToQince
()
{
List
<
OrdersSentDto
>
sents
=
ordersSentDao
.
findByPushqcStatus
();
for
(
OrdersSentDto
sent
:
sents
)
{
}
}
@Override
public
OrdersSentDto
getSent
(
String
sentNo
)
{
return
ordersSentDao
.
getSent
(
sentNo
);
}
private
void
pushQc
(
OrdersSentDto
sent
)
throws
Exception
{
String
sentUrl
=
"https://sfa.wxl66.cn/link/order/sent?sendId="
+
sent
+
"&sentNo="
+
sent
.
getBjSentNo
();
}
}
src/main/java/com/sfa/job/util/JdtcUtil.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
util
;
import
cn.hutool.http.HttpUtil
;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.sfa.common.core.enums.ECode
;
import
com.sfa.common.core.exception.ServiceException
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
javax.crypto.Mac
;
import
javax.crypto.spec.SecretKeySpec
;
import
java.io.UnsupportedEncodingException
;
import
java.net.URLEncoder
;
import
java.nio.charset.StandardCharsets
;
import
java.security.GeneralSecurityException
;
import
java.security.MessageDigest
;
import
java.time.LocalDateTime
;
import
java.time.OffsetTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Base64
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Objects
;
/**
* @author : liqiulin
* @date : 2025-07-08 16
* @describe :
*/
@Slf4j
@Component
public
class
JdtcUtil
{
/**
* =================== JDTC API - config ===================
*/
@Value
(
"${jdtc.url}"
)
private
String
JDTC_URL
;
@Value
(
"${jdtc.accesstoken}"
)
private
String
TOKEN
;
@Value
(
"${jdtc.wl_appkey}"
)
private
String
WL_APPKEY
;
@Value
(
"${jdtc.wl_appsecret}"
)
private
String
WL_APPSECRET
;
@Value
(
"${jdtc.pin}"
)
private
String
PIN
;
/**
* =================== JDTC API - path ===================
*/
private
final
String
ORDER_TRACE_QUERY_PATH
=
"/TransferCenterService/order/trace/query/v1"
;
private
final
String
DOMAIN
=
"TransferCenterService"
;
private
final
String
HEX_CHARACTERS
=
"0123456789ABCDEF"
;
private
final
DateTimeFormatter
DATE_TIME_FORMATTER
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
);
public
JSONArray
getOrderTrace
(
String
orderNo
)
{
try
{
String
baseUri
=
JDTC_URL
;
String
appKey
=
WL_APPKEY
;
String
appSecret
=
WL_APPSECRET
;
String
accessToken
=
TOKEN
;
String
algorithm
=
"md5-salt"
;
String
body
=
"[{\"pin\":\""
+
PIN
+
"\",\"purchaseOrderNo\":\""
+
orderNo
+
"\"}]"
;
String
timestamp
=
DATE_TIME_FORMATTER
.
format
(
LocalDateTime
.
now
());
String
content
=
String
.
join
(
""
,
new
String
[]{
appSecret
,
"access_token"
,
accessToken
,
"app_key"
,
appKey
,
"method"
,
ORDER_TRACE_QUERY_PATH
,
"param_json"
,
body
,
"timestamp"
,
timestamp
,
"v"
,
"2.0"
,
appSecret
});
Map
<
String
,
String
>
urlParams
=
new
HashMap
<>();
urlParams
.
put
(
"LOP-DN"
,
DOMAIN
);
urlParams
.
put
(
"access_token"
,
accessToken
);
urlParams
.
put
(
"app_key"
,
appKey
);
urlParams
.
put
(
"timestamp"
,
timestamp
);
urlParams
.
put
(
"v"
,
"2.0"
);
urlParams
.
put
(
"sign"
,
sign
(
algorithm
,
content
.
getBytes
(
StandardCharsets
.
UTF_8
),
appSecret
.
getBytes
(
StandardCharsets
.
UTF_8
)));
urlParams
.
put
(
"algorithm"
,
algorithm
);
Map
<
String
,
String
>
headers
=
new
HashMap
<>();
// lop-tz代表时区,为接口调用当地的时区;删去后默认为东八区
headers
.
put
(
"lop-tz"
,
String
.
valueOf
(
OffsetTime
.
now
().
getOffset
().
getTotalSeconds
()
/
3600
));
// 用于开放平台识别客户调用API方式,客户无需修改
headers
.
put
(
"User-Agent"
,
"lop-http/java"
);
headers
.
put
(
"content-type"
,
"application/json;charset=utf-8"
);
String
req
=
HttpUtil
.
createPost
(
baseUri
+
ORDER_TRACE_QUERY_PATH
+
"?"
+
httpBuildQuery
(
urlParams
)).
addHeaders
(
headers
).
body
(
body
).
execute
().
body
();
JSONObject
reqJson
=
JSONObject
.
parseObject
(
req
);
if
(!
reqJson
.
getString
(
"code"
).
equals
(
"1000"
)){
log
.
error
(
"请求京东TC物流轨迹接口返回异常:{}"
,
reqJson
);
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_API_ERROR
);
}
return
reqJson
.
getJSONObject
(
"data"
).
getJSONArray
(
"purchaseTraceList"
);
}
catch
(
GeneralSecurityException
|
UnsupportedEncodingException
e
)
{
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_QUERY_ERROR
);
}
}
private
String
sign
(
String
algorithm
,
byte
[]
data
,
byte
[]
secret
)
throws
GeneralSecurityException
{
if
(
Objects
.
equals
(
algorithm
,
"md5-salt"
))
{
return
bytesToHex
(
MessageDigest
.
getInstance
(
"md5"
).
digest
(
data
));
}
else
if
(
Objects
.
equals
(
algorithm
,
"HMacMD5"
))
{
Mac
mac
=
Mac
.
getInstance
(
algorithm
);
mac
.
init
(
new
SecretKeySpec
(
secret
,
algorithm
));
return
Base64
.
getEncoder
().
encodeToString
(
mac
.
doFinal
(
data
));
}
else
if
(
Objects
.
equals
(
algorithm
,
"HMacSHA1"
))
{
Mac
mac
=
Mac
.
getInstance
(
algorithm
);
mac
.
init
(
new
SecretKeySpec
(
secret
,
algorithm
));
return
Base64
.
getEncoder
().
encodeToString
(
mac
.
doFinal
(
data
));
}
else
if
(
Objects
.
equals
(
algorithm
,
"HMacSHA256"
))
{
Mac
mac
=
Mac
.
getInstance
(
algorithm
);
mac
.
init
(
new
SecretKeySpec
(
secret
,
algorithm
));
return
Base64
.
getEncoder
().
encodeToString
(
mac
.
doFinal
(
data
));
}
else
if
(
Objects
.
equals
(
algorithm
,
"HMacSHA512"
))
{
Mac
mac
=
Mac
.
getInstance
(
algorithm
);
mac
.
init
(
new
SecretKeySpec
(
secret
,
algorithm
));
return
Base64
.
getEncoder
().
encodeToString
(
mac
.
doFinal
(
data
));
}
throw
new
GeneralSecurityException
(
"Algorithm "
+
algorithm
+
" not supported yet"
);
}
private
String
bytesToHex
(
byte
[]
bytes
)
{
StringBuilder
stringBuilder
=
new
StringBuilder
(
bytes
.
length
*
2
);
for
(
byte
b
:
bytes
)
{
stringBuilder
.
append
(
HEX_CHARACTERS
.
charAt
((
b
>>>
4
)
&
0x0F
));
stringBuilder
.
append
(
HEX_CHARACTERS
.
charAt
(
b
&
0x0F
));
}
return
stringBuilder
.
toString
();
}
private
String
httpBuildQuery
(
Map
<
String
,
String
>
query
)
throws
UnsupportedEncodingException
{
StringBuilder
stringBuilder
=
new
StringBuilder
();
boolean
first
=
true
;
for
(
Map
.
Entry
<
String
,
String
>
entry
:
query
.
entrySet
())
{
if
(!
first
)
{
stringBuilder
.
append
(
"&"
);
}
else
{
first
=
false
;
}
stringBuilder
.
append
(
entry
.
getKey
()).
append
(
"="
).
append
(
URLEncoder
.
encode
(
entry
.
getValue
(),
StandardCharsets
.
UTF_8
.
name
()));
}
return
stringBuilder
.
toString
();
}
}
src/main/java/com/sfa/job/xxljob/order/OrdersSentToQince.java
0 → 100644
浏览文件 @
fefb55d8
package
com
.
sfa
.
job
.
xxljob
.
order
;
import
com.sfa.job.service.order.IOrdersSentQueryService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
/**
* @author : liqiulin
* @date : 2025-07-10 16
* @describe : 勤策订单
*/
@Component
public
class
OrdersSentToQince
{
@Autowired
private
IOrdersSentQueryService
ordersSentService
;
}
src/main/resources/mapper/OrdersSentMapper.xml
0 → 100644
浏览文件 @
fefb55d8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.sfa.job.domain.order.mapper.OrdersSentMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"com.sfa.job.domain.order.entity.OrdersSent"
>
<id
property=
"sendId"
column=
"send_id"
jdbcType=
"BIGINT"
/>
<result
property=
"ahSentNo"
column=
"ah_sent_no"
jdbcType=
"VARCHAR"
/>
<result
property=
"bjSentNo"
column=
"bj_sent_no"
jdbcType=
"VARCHAR"
/>
<result
property=
"bjSentVersion"
column=
"bj_sent_version"
jdbcType=
"INTEGER"
/>
<result
property=
"type"
column=
"type"
jdbcType=
"CHAR"
/>
<result
property=
"postData"
column=
"post_data"
jdbcType=
"DATE"
/>
<result
property=
"status"
column=
"status"
jdbcType=
"CHAR"
/>
<result
property=
"transport"
column=
"transport"
jdbcType=
"VARCHAR"
/>
<result
property=
"transportName"
column=
"transport_name"
jdbcType=
"VARCHAR"
/>
<result
property=
"expressNo"
column=
"express_no"
jdbcType=
"VARCHAR"
/>
<result
property=
"ddNo"
column=
"dd_no"
jdbcType=
"VARCHAR"
/>
<result
property=
"pushQc"
column=
"push_qc"
jdbcType=
"INTEGER"
/>
<result
property=
"createTime"
column=
"create_time"
jdbcType=
"TIMESTAMP"
/>
<result
property=
"updateTime"
column=
"update_time"
jdbcType=
"TIMESTAMP"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
send_id
,sent_no,sent_version,
type,post_data,status,
transport,transport_name,express_no,
dd_no,push_qc,create_time,
update_time
</sql>
<select
id=
"findUnsyncQc"
resultMap=
"BaseResultMap"
>
select send_id, ah_sent_no, bj_sent_no, transport, express_no
from orders_sent
where push_qc = 1
</select>
<select
id=
"selectBySentNo"
resultMap=
"BaseResultMap"
>
select ah_sent_no,bj_sent_no,bj_sent_version,transport,express_no,dd_no
from orders_sent
<where>
<if
test=
"sentNo.startsWith('BJHQ')"
>
bj_sent_no = #{sentNo}
</if>
<if
test=
"sentNo.startsWith('AHSD')"
>
ah_sent_no = #{sentNo}
</if>
</where>
</select>
</mapper>
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论