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
48a0b4c5
提交
48a0b4c5
authored
8月 18, 2025
作者:
000516
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
物流回单添加京东TC单据,回写签收时间,回单状态统一重置为未回单(无回单图片)
上级
1f517c96
显示空白字符变更
内嵌
并排
正在显示
14 个修改的文件
包含
179 行增加
和
85 行删除
+179
-85
FinanceOrderDetailSyncController.java
.../controller/finance/FinanceOrderDetailSyncController.java
+2
-2
WdtQimenOrderController.java
...com/sfa/job/controller/order/WdtQimenOrderController.java
+2
-2
SentReceiptEnum.java
src/main/java/com/sfa/job/enums/SentReceiptEnum.java
+18
-1
OrdersSentDto.java
src/main/java/com/sfa/job/pojo/response/OrdersSentDto.java
+2
-0
IFinanceOrderSyncService.java
...a/com/sfa/job/service/order/IFinanceOrderSyncService.java
+1
-1
IWdtQimenOrderSyncService.java
.../com/sfa/job/service/order/IWdtQimenOrderSyncService.java
+1
-1
FinanceOrderSyncServiceImpl.java
...a/job/service/order/impl/FinanceOrderSyncServiceImpl.java
+2
-2
OrdersSentQueryServiceImpl.java
...fa/job/service/order/impl/OrdersSentQueryServiceImpl.java
+69
-17
WdtQimenOrderSyncServiceImpl.java
.../job/service/order/impl/WdtQimenOrderSyncServiceImpl.java
+2
-2
JdtcUtil.java
src/main/java/com/sfa/job/util/JdtcUtil.java
+70
-47
KyeUtil.java
src/main/java/com/sfa/job/util/KyeUtil.java
+2
-2
FinanceOrderTask.java
src/main/java/com/sfa/job/xxljob/order/FinanceOrderTask.java
+5
-5
WdtQimenOrderTask.java
...main/java/com/sfa/job/xxljob/order/WdtQimenOrderTask.java
+2
-2
OrdersSentMapper.xml
src/main/resources/mapper/order/OrdersSentMapper.xml
+1
-1
没有找到文件。
src/main/java/com/sfa/job/controller/finance/FinanceOrderDetailSyncController.java
浏览文件 @
48a0b4c5
...
@@ -4,7 +4,7 @@ import cn.hutool.core.date.DateUtil;
...
@@ -4,7 +4,7 @@ import cn.hutool.core.date.DateUtil;
import
com.sfa.common.core.web.controller.BaseController
;
import
com.sfa.common.core.web.controller.BaseController
;
import
com.sfa.job.pojo.response.FinanceOrderDetailUpdateDto
;
import
com.sfa.job.pojo.response.FinanceOrderDetailUpdateDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.service.order.FinanceOrderSyncService
;
import
com.sfa.job.service.order.
I
FinanceOrderSyncService
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.GetMapping
;
...
@@ -23,7 +23,7 @@ import java.util.Date;
...
@@ -23,7 +23,7 @@ import java.util.Date;
@RequestMapping
(
"/finance/order"
)
@RequestMapping
(
"/finance/order"
)
public
class
FinanceOrderDetailSyncController
extends
BaseController
{
public
class
FinanceOrderDetailSyncController
extends
BaseController
{
@Autowired
@Autowired
private
FinanceOrderSyncService
syncService
;
private
I
FinanceOrderSyncService
syncService
;
@GetMapping
(
"/syncWdtOrderDetail"
)
@GetMapping
(
"/syncWdtOrderDetail"
)
public
SyncOrderDetailDto
syncWangdiantongOrderDetail
(
Date
startTime
,
Date
endTime
)
{
public
SyncOrderDetailDto
syncWangdiantongOrderDetail
(
Date
startTime
,
Date
endTime
)
{
...
...
src/main/java/com/sfa/job/controller/order/WdtQimenOrderController.java
浏览文件 @
48a0b4c5
package
com
.
sfa
.
job
.
controller
.
order
;
package
com
.
sfa
.
job
.
controller
.
order
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.service.order.WdtQimenOrderSyncService
;
import
com.sfa.job.service.order.
I
WdtQimenOrderSyncService
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.format.annotation.DateTimeFormat
;
import
org.springframework.format.annotation.DateTimeFormat
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.GetMapping
;
...
@@ -22,7 +22,7 @@ import java.util.Date;
...
@@ -22,7 +22,7 @@ import java.util.Date;
public
class
WdtQimenOrderController
{
public
class
WdtQimenOrderController
{
@Autowired
@Autowired
private
WdtQimenOrderSyncService
orderQimenSyncService
;
private
I
WdtQimenOrderSyncService
orderQimenSyncService
;
@GetMapping
(
"/sync"
)
@GetMapping
(
"/sync"
)
...
...
src/main/java/com/sfa/job/enums/
Kye
Enum.java
→
src/main/java/com/sfa/job/enums/
SentReceipt
Enum.java
浏览文件 @
48a0b4c5
...
@@ -7,7 +7,7 @@ import lombok.Getter;
...
@@ -7,7 +7,7 @@ import lombok.Getter;
* @date : 2025-08-13 10
* @date : 2025-08-13 10
* @describe :
* @describe :
*/
*/
public
interface
Kye
Enum
{
public
interface
SentReceipt
Enum
{
/**
/**
* 回单状态类型
* 回单状态类型
...
@@ -56,4 +56,21 @@ public interface KyeEnum {
...
@@ -56,4 +56,21 @@ public interface KyeEnum {
return
"10"
.
equals
(
type
)
||
"30"
.
equals
(
type
);
return
"10"
.
equals
(
type
)
||
"30"
.
equals
(
type
);
}
}
}
}
/**
* 回单通用类型
*/
@Getter
enum
ReceiptEnum
{
/**
* 已签收未回单
*/
NO
(
"未回单"
);
private
String
desc
;
ReceiptEnum
(
String
desc
)
{
this
.
desc
=
desc
;
}
}
}
}
src/main/java/com/sfa/job/pojo/response/OrdersSentDto.java
浏览文件 @
48a0b4c5
...
@@ -2,6 +2,7 @@ package com.sfa.job.pojo.response;
...
@@ -2,6 +2,7 @@ package com.sfa.job.pojo.response;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
com.baomidou.mybatisplus.annotation.TableField
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.io.Serializable
;
import
java.util.Date
;
import
java.util.Date
;
...
@@ -10,6 +11,7 @@ import java.util.List;
...
@@ -10,6 +11,7 @@ import java.util.List;
/**
/**
* T100出货单中的物流单据
* T100出货单中的物流单据
*/
*/
@Accessors
(
chain
=
true
)
@Data
@Data
public
class
OrdersSentDto
implements
Serializable
{
public
class
OrdersSentDto
implements
Serializable
{
/**
/**
...
...
src/main/java/com/sfa/job/service/order/FinanceOrderSyncService.java
→
src/main/java/com/sfa/job/service/order/
I
FinanceOrderSyncService.java
浏览文件 @
48a0b4c5
...
@@ -6,7 +6,7 @@ import com.sfa.job.pojo.response.SyncOrderDetailDto;
...
@@ -6,7 +6,7 @@ import com.sfa.job.pojo.response.SyncOrderDetailDto;
import
java.util.Date
;
import
java.util.Date
;
public
interface
FinanceOrderSyncService
{
public
interface
IFinanceOrderSyncService
{
SyncOrderDetailDto
syncWdtOrder
(
Date
startTime
,
Date
endTime
,
Integer
syncType
);
SyncOrderDetailDto
syncWdtOrder
(
Date
startTime
,
Date
endTime
,
Integer
syncType
);
SyncOrderDetailDto
syncWdtRefundOrder
(
Date
startTime
,
Date
endTime
,
Integer
syncType
);
SyncOrderDetailDto
syncWdtRefundOrder
(
Date
startTime
,
Date
endTime
,
Integer
syncType
);
...
...
src/main/java/com/sfa/job/service/order/WdtQimenOrderSyncService.java
→
src/main/java/com/sfa/job/service/order/
I
WdtQimenOrderSyncService.java
浏览文件 @
48a0b4c5
...
@@ -5,6 +5,6 @@ import com.sfa.job.pojo.response.SyncOrderDetailDto;
...
@@ -5,6 +5,6 @@ import com.sfa.job.pojo.response.SyncOrderDetailDto;
import
java.util.Date
;
import
java.util.Date
;
public
interface
WdtQimenOrderSyncService
{
public
interface
I
WdtQimenOrderSyncService
{
SyncOrderDetailDto
syncWdtQimenOrder
(
Date
startTime
,
Date
endTime
,
Integer
syncType
,
Long
pageSize
);
SyncOrderDetailDto
syncWdtQimenOrder
(
Date
startTime
,
Date
endTime
,
Integer
syncType
,
Long
pageSize
);
}
}
src/main/java/com/sfa/job/service/order/impl/FinanceOrderSyncServiceImpl.java
浏览文件 @
48a0b4c5
...
@@ -15,7 +15,7 @@ import com.sfa.job.domain.order.wq.FinanceOrderCostWq;
...
@@ -15,7 +15,7 @@ import com.sfa.job.domain.order.wq.FinanceOrderCostWq;
import
com.sfa.job.pojo.request.WdtOrderQueryVO
;
import
com.sfa.job.pojo.request.WdtOrderQueryVO
;
import
com.sfa.job.pojo.request.WdtRefundQueryVO
;
import
com.sfa.job.pojo.request.WdtRefundQueryVO
;
import
com.sfa.job.pojo.response.*
;
import
com.sfa.job.pojo.response.*
;
import
com.sfa.job.service.order.FinanceOrderSyncService
;
import
com.sfa.job.service.order.
I
FinanceOrderSyncService
;
import
com.sfa.job.util.WangdiantongUtil
;
import
com.sfa.job.util.WangdiantongUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
...
@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
...
@@ -36,7 +36,7 @@ import java.util.stream.Collectors;
@DS
(
"bi"
)
@DS
(
"bi"
)
@Slf4j
@Slf4j
@Service
@Service
public
class
FinanceOrderSyncServiceImpl
implements
FinanceOrderSyncService
{
public
class
FinanceOrderSyncServiceImpl
implements
I
FinanceOrderSyncService
{
@Autowired
@Autowired
WangdiantongUtil
wangdiantongUtil
;
WangdiantongUtil
wangdiantongUtil
;
...
...
src/main/java/com/sfa/job/service/order/impl/OrdersSentQueryServiceImpl.java
浏览文件 @
48a0b4c5
...
@@ -6,9 +6,10 @@ import com.sfa.common.core.enums.ECode;
...
@@ -6,9 +6,10 @@ import com.sfa.common.core.enums.ECode;
import
com.sfa.common.core.exception.ServiceException
;
import
com.sfa.common.core.exception.ServiceException
;
import
com.sfa.common.core.utils.DateUtils
;
import
com.sfa.common.core.utils.DateUtils
;
import
com.sfa.job.domain.order.dao.IOrdersSentDao
;
import
com.sfa.job.domain.order.dao.IOrdersSentDao
;
import
com.sfa.job.enums.
Kye
Enum
;
import
com.sfa.job.enums.
SentReceipt
Enum
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
import
com.sfa.job.pojo.response.OrdersSentDto
;
import
com.sfa.job.service.order.IOrdersSentQueryService
;
import
com.sfa.job.service.order.IOrdersSentQueryService
;
import
com.sfa.job.util.JdtcUtil
;
import
com.sfa.job.util.KyeUtil
;
import
com.sfa.job.util.KyeUtil
;
import
com.sfa.job.util.QinCeUtils
;
import
com.sfa.job.util.QinCeUtils
;
import
com.sfa.job.util.aliyun.OssUtil
;
import
com.sfa.job.util.aliyun.OssUtil
;
...
@@ -17,10 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
...
@@ -17,10 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.CollectionUtils
;
import
java.util.ArrayList
;
import
java.util.*
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
/**
/**
...
@@ -40,6 +38,8 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
...
@@ -40,6 +38,8 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
private
KyeUtil
kyeUtil
;
private
KyeUtil
kyeUtil
;
@Autowired
@Autowired
private
OssUtil
ossUtil
;
private
OssUtil
ossUtil
;
@Autowired
private
JdtcUtil
jdtcUtil
;
@Override
@Override
public
void
ordersSentToQince
()
{
public
void
ordersSentToQince
()
{
...
@@ -68,8 +68,59 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
...
@@ -68,8 +68,59 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
// 按物流公司分类
// 按物流公司分类
Map
<
String
,
List
<
OrdersSentDto
>>
transportMap
=
sents
.
stream
().
collect
(
Collectors
.
groupingBy
(
OrdersSentDto:
:
getTransport
));
Map
<
String
,
List
<
OrdersSentDto
>>
transportMap
=
sents
.
stream
().
collect
(
Collectors
.
groupingBy
(
OrdersSentDto:
:
getTransport
));
getOrderSentReceiptBy109
(
transportMap
.
get
(
"109"
));
getOrderSentReceiptBy109
(
transportMap
.
get
(
"109"
));
getOrderSentReceiptBy134
(
transportMap
.
get
(
"134"
));
}
/**
* 134-京东TC回单
*/
private
void
getOrderSentReceiptBy134
(
List
<
OrdersSentDto
>
ordersSentDtos
)
{
if
(
CollectionUtils
.
isEmpty
(
ordersSentDtos
))
{
log
.
info
(
"[134-京东TC]暂无,需回单单据"
);
return
;
}
// 填写Object完整路径(不包含Bucket名称),例:[path]/[文件名.扩展名]
// String ossON = "wuliu/" + DateUtils.getYearMonth() + "/京东TC/";
List
<
List
<
OrdersSentDto
>>
split
=
ordersSentDtos
.
stream
().
collect
(
Collectors
.
groupingBy
(
it
->
ordersSentDtos
.
indexOf
(
it
)
/
20
)).
values
().
stream
().
collect
(
Collectors
.
toList
());
log
.
info
(
"[134-京东TC]需回单{}张,分{}组"
,
ordersSentDtos
.
size
(),
split
.
size
());
for
(
List
<
OrdersSentDto
>
dtos
:
split
)
{
try
{
List
<
String
>
exNos
=
dtos
.
stream
().
map
(
it
->
it
.
getExpressNo
()).
collect
(
Collectors
.
toList
());
JSONArray
waybills
=
jdtcUtil
.
orderQuery
(
exNos
);
if
(
CollectionUtils
.
isEmpty
(
waybills
))
{
log
.
info
(
"[134-京东TC]以上批次,未查询到物流信息"
);
continue
;
}
log
.
info
(
"[134-京东TC]以上批次,查询到{}条物流信息"
,
waybills
.
size
());
for
(
Object
waybill
:
waybills
)
{
disReceiptBy134
((
JSONObject
)
waybill
,
null
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"[134-京东TC]忽略异常:{}"
,
e
.
getMessage
());
}
}
}
}
private
void
disReceiptBy134
(
JSONObject
jdInfo
,
String
ossON
)
{
String
orderStatus
=
jdInfo
.
getString
(
"orderStatus"
);
if
(!
"妥投"
.
equals
(
orderStatus
)){
return
;
}
OrdersSentDto
ordersSentDto
=
new
OrdersSentDto
()
.
setExpressNo
(
jdInfo
.
getString
(
"waybillCode"
))
.
setOperateEndDatetime
(
jdInfo
.
getDate
(
"orderTime"
))
.
setReceiptFlag
(
SentReceiptEnum
.
ReceiptEnum
.
NO
.
getDesc
());
/**
* 京东回单照片暂无获取API
*/
ordersSentDao
.
updateByExpressNo
(
ordersSentDto
);
}
/**
* 109-跨越回单
*/
private
void
getOrderSentReceiptBy109
(
List
<
OrdersSentDto
>
ordersSentDtos
)
{
private
void
getOrderSentReceiptBy109
(
List
<
OrdersSentDto
>
ordersSentDtos
)
{
if
(
CollectionUtils
.
isEmpty
(
ordersSentDtos
))
{
if
(
CollectionUtils
.
isEmpty
(
ordersSentDtos
))
{
log
.
info
(
"[109-跨越]暂无,需回单单据"
);
log
.
info
(
"[109-跨越]暂无,需回单单据"
);
...
@@ -82,6 +133,7 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
...
@@ -82,6 +133,7 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
log
.
info
(
"[109-跨越]需回单{}张,分{}组"
,
ordersSentDtos
.
size
(),
split
.
size
());
log
.
info
(
"[109-跨越]需回单{}张,分{}组"
,
ordersSentDtos
.
size
(),
split
.
size
());
for
(
List
<
OrdersSentDto
>
os
:
split
)
{
for
(
List
<
OrdersSentDto
>
os
:
split
)
{
try
{
List
<
String
>
exNos
=
os
.
stream
().
map
(
it
->
it
.
getExpressNo
()).
collect
(
Collectors
.
toList
());
List
<
String
>
exNos
=
os
.
stream
().
map
(
it
->
it
.
getExpressNo
()).
collect
(
Collectors
.
toList
());
log
.
info
(
"[109-跨越]开始处理:{}"
,
JSONObject
.
toJSONString
(
exNos
));
log
.
info
(
"[109-跨越]开始处理:{}"
,
JSONObject
.
toJSONString
(
exNos
));
...
@@ -90,16 +142,18 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
...
@@ -90,16 +142,18 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
log
.
info
(
"[109-跨越]以上批次,未查询到物流信息"
);
log
.
info
(
"[109-跨越]以上批次,未查询到物流信息"
);
continue
;
continue
;
}
}
log
.
info
(
"[109-跨越]以上批次,查询到{}条物流信息"
,
waybillBaseInfo
.
size
());
log
.
info
(
"[109-跨越]以上批次,查询到{}条物流信息"
,
waybillBaseInfo
.
size
());
for
(
Object
o
:
waybillBaseInfo
)
{
for
(
Object
o
:
waybillBaseInfo
)
{
disReceipt
((
JSONObject
)
o
,
ossON
);
disReceiptBy109
((
JSONObject
)
o
,
ossON
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"[109-跨越]忽略异常:{}"
,
e
.
getMessage
());
}
}
}
}
}
}
private
void
disReceipt
(
JSONObject
infoJson
,
String
ossON
)
{
private
void
disReceipt
By109
(
JSONObject
infoJson
,
String
ossON
)
throws
Exception
{
// 判断物流单是否已签收,未签收数据不处理
// 判断物流单是否已签收,未签收数据不处理
Date
operateEndTime
=
infoJson
.
getDate
(
"operateEndTime"
);
Date
operateEndTime
=
infoJson
.
getDate
(
"operateEndTime"
);
if
(
operateEndTime
==
null
){
if
(
operateEndTime
==
null
){
...
@@ -107,24 +161,21 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
...
@@ -107,24 +161,21 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
}
}
String
expressNo
=
infoJson
.
getString
(
"waybillNumber"
);
String
expressNo
=
infoJson
.
getString
(
"waybillNumber"
);
String
receiptFlag
=
infoJson
.
getString
(
"receiptFlag"
);
String
receiptFlag
=
infoJson
.
getString
(
"receiptFlag"
);
OrdersSentDto
ordersSentDto
=
new
OrdersSentDto
()
;
OrdersSentDto
ordersSentDto
=
new
OrdersSentDto
()
ordersSentDto
.
setExpressNo
(
expressNo
);
.
setExpressNo
(
expressNo
)
ordersSentDto
.
setOperateEndDatetime
(
operateEndTime
);
.
setOperateEndDatetime
(
operateEndTime
)
ordersSentDto
.
setReceiptFlag
(
Kye
Enum
.
KyeReceiptEnum
.
getDesc
(
receiptFlag
));
.
setReceiptFlag
(
SentReceipt
Enum
.
KyeReceiptEnum
.
getDesc
(
receiptFlag
));
/**
/**
* 回单类型为回单原件、回单照片时查询照片,否则跳过
* 回单类型为回单原件、回单照片时查询照片,否则跳过
*/
*/
if
(!
Kye
Enum
.
KyeReceiptEnum
.
hasPhoto
(
receiptFlag
)){
if
(!
SentReceipt
Enum
.
KyeReceiptEnum
.
hasPhoto
(
receiptFlag
)){
ordersSentDao
.
updateByExpressNo
(
ordersSentDto
);
ordersSentDao
.
updateByExpressNo
(
ordersSentDto
);
return
;
return
;
}
}
JSONArray
objects
=
kyeUtil
.
queryWaybillPicture
(
expressNo
);
JSONArray
objects
=
kyeUtil
.
queryWaybillPicture
(
expressNo
);
if
(
CollectionUtils
.
isEmpty
(
objects
)){
if
(!
CollectionUtils
.
isEmpty
(
objects
)){
ordersSentDao
.
updateByExpressNo
(
ordersSentDto
);
return
;
}
List
<
String
>
urls
=
new
ArrayList
<>();
List
<
String
>
urls
=
new
ArrayList
<>();
for
(
Object
object
:
objects
)
{
for
(
Object
object
:
objects
)
{
JSONObject
jsonObject
=
(
JSONObject
)
object
;
JSONObject
jsonObject
=
(
JSONObject
)
object
;
...
@@ -134,6 +185,7 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
...
@@ -134,6 +185,7 @@ public class OrdersSentQueryServiceImpl implements IOrdersSentQueryService {
urls
.
add
(
ossUrl
);
urls
.
add
(
ossUrl
);
}
}
ordersSentDto
.
setReceiptPhoto
(
JSONObject
.
toJSONString
(
urls
));
ordersSentDto
.
setReceiptPhoto
(
JSONObject
.
toJSONString
(
urls
));
}
ordersSentDao
.
updateByExpressNo
(
ordersSentDto
);
ordersSentDao
.
updateByExpressNo
(
ordersSentDto
);
}
}
...
...
src/main/java/com/sfa/job/service/order/impl/WdtQimenOrderSyncServiceImpl.java
浏览文件 @
48a0b4c5
...
@@ -19,7 +19,7 @@ import com.sfa.job.pojo.order.response.WdtQimenResponseDto;
...
@@ -19,7 +19,7 @@ import com.sfa.job.pojo.order.response.WdtQimenResponseDto;
import
com.sfa.job.pojo.order.response.WdtSalesTradeQueryQueryWithDetailDto
;
import
com.sfa.job.pojo.order.response.WdtSalesTradeQueryQueryWithDetailDto
;
import
com.sfa.job.pojo.response.CollectOrderLogDto
;
import
com.sfa.job.pojo.response.CollectOrderLogDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.service.order.WdtQimenOrderSyncService
;
import
com.sfa.job.service.order.
I
WdtQimenOrderSyncService
;
import
com.sfa.job.util.WdtQimenUtil
;
import
com.sfa.job.util.WdtQimenUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.ObjectUtils
;
import
org.apache.commons.lang3.ObjectUtils
;
...
@@ -39,7 +39,7 @@ import java.util.*;
...
@@ -39,7 +39,7 @@ import java.util.*;
@DS
(
"bi"
)
@DS
(
"bi"
)
@Slf4j
@Slf4j
@Service
@Service
public
class
WdtQimenOrderSyncServiceImpl
implements
WdtQimenOrderSyncService
{
public
class
WdtQimenOrderSyncServiceImpl
implements
I
WdtQimenOrderSyncService
{
@Autowired
@Autowired
WdtQimenOrderDetailDao
orderDetailDao
;
WdtQimenOrderDetailDao
orderDetailDao
;
@Autowired
@Autowired
...
...
src/main/java/com/sfa/job/util/JdtcUtil.java
浏览文件 @
48a0b4c5
package
com
.
sfa
.
job
.
util
;
package
com
.
sfa
.
job
.
util
;
import
cn.hutool.core.date.DatePattern
;
import
cn.hutool.http.HttpUtil
;
import
cn.hutool.http.HttpUtil
;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONArray
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.alibaba.fastjson2.JSONObject
;
...
@@ -18,11 +19,7 @@ import java.security.GeneralSecurityException;
...
@@ -18,11 +19,7 @@ import java.security.GeneralSecurityException;
import
java.security.MessageDigest
;
import
java.security.MessageDigest
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.time.OffsetTime
;
import
java.time.OffsetTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.Base64
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.Objects
;
/**
/**
* @author : liqiulin
* @author : liqiulin
...
@@ -36,64 +33,35 @@ public class JdtcUtil {
...
@@ -36,64 +33,35 @@ public class JdtcUtil {
* =================== JDTC API - config ===================
* =================== JDTC API - config ===================
*/
*/
@Value
(
"${jdtc.url}"
)
@Value
(
"${jdtc.url}"
)
private
String
JDTC_URL
;
private
String
jdTCUrl
;
@Value
(
"${jdtc.accesstoken}"
)
@Value
(
"${jdtc.accesstoken}"
)
private
String
TOKEN
;
private
String
jdTCToken
;
@Value
(
"${jdtc.wl_appkey}"
)
@Value
(
"${jdtc.wl_appkey}"
)
private
String
WL_APPKEY
;
private
String
wlAppkey
;
@Value
(
"${jdtc.wl_appsecret}"
)
@Value
(
"${jdtc.wl_appsecret}"
)
private
String
WL_APPSECRET
;
private
String
wlAppSecret
;
@Value
(
"${jdtc.pin}"
)
@Value
(
"${jdtc.pin}"
)
private
String
PIN
;
private
String
pin
;
@Value
(
"${jdtc.customer_code}"
)
private
String
customerCode
;
/**
/**
* =================== JDTC API - path ===================
* =================== JDTC API - path ===================
*/
*/
private
final
String
ORDER_TRACE_QUERY_PATH
=
"/TransferCenterService/order/trace/query/v1"
;
private
final
String
ORDER_TRACE_QUERY_PATH
=
"/TransferCenterService/order/trace/query/v1"
;
private
final
String
ORDER_QUERY_PATH
=
"/TransferCenterService/order/query/v1"
;
private
final
String
DOMAIN
=
"TransferCenterService"
;
private
final
String
DOMAIN
=
"TransferCenterService"
;
private
final
String
HEX_CHARACTERS
=
"0123456789ABCDEF"
;
private
final
String
HEX_CHARACTERS
=
"0123456789ABCDEF"
;
private
final
DateTimeFormatter
DATE_TIME_FORMATTER
=
DateTimeFormatter
.
ofPattern
(
"yyyy-MM-dd HH:mm:ss"
);
private
final
String
ALGORITHM
=
"md5-salt"
;
public
JSONArray
getOrderTrace
(
String
orderNo
)
{
public
JSONArray
getOrderTrace
(
String
orderNo
)
{
try
{
try
{
String
baseUri
=
JDTC_URL
;
String
body
=
"[{\"pin\":\""
+
pin
+
"\",\"purchaseOrderNo\":\""
+
orderNo
+
"\"}]"
;
String
appKey
=
WL_APPKEY
;
Map
<
String
,
String
>
urlParams
=
getUrlParams
(
ORDER_TRACE_QUERY_PATH
,
body
);
String
appSecret
=
WL_APPSECRET
;
String
req
=
HttpUtil
.
createPost
(
jdTCUrl
+
ORDER_TRACE_QUERY_PATH
+
"?"
+
httpBuildQuery
(
urlParams
)).
addHeaders
(
getHeaders
()).
body
(
body
).
execute
().
body
();
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
);
JSONObject
reqJson
=
JSONObject
.
parseObject
(
req
);
if
(!
reqJson
.
getString
(
"code"
).
equals
(
"1000"
)){
if
(!
reqJson
.
getString
(
"code"
).
equals
(
"1000"
)){
log
.
error
(
"请求京东TC
物流轨迹
接口返回异常:{}"
,
reqJson
);
log
.
error
(
"请求京东TC
物流轨迹
接口返回异常:{}"
,
reqJson
);
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_API_ERROR
);
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_API_ERROR
);
}
}
JSONObject
data
=
reqJson
.
getJSONObject
(
"data"
);
JSONObject
data
=
reqJson
.
getJSONObject
(
"data"
);
...
@@ -102,6 +70,28 @@ public class JdtcUtil {
...
@@ -102,6 +70,28 @@ public class JdtcUtil {
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_QUERY_ERROR
);
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_TRACE_QUERY_ERROR
);
}
}
}
}
public
JSONArray
orderQuery
(
List
<
String
>
waybillCodes
)
throws
Exception
{
try
{
Map
<
String
,
Object
>
params
=
new
HashMap
<>();
params
.
put
(
"customerCode"
,
customerCode
);
params
.
put
(
"pin"
,
pin
);
params
.
put
(
"waybillCodes"
,
waybillCodes
);
String
body
=
JSONObject
.
toJSONString
(
Arrays
.
asList
(
params
));
Map
<
String
,
String
>
urlParams
=
getUrlParams
(
ORDER_QUERY_PATH
,
body
);
String
req
=
HttpUtil
.
createPost
(
jdTCUrl
+
ORDER_QUERY_PATH
+
"?"
+
httpBuildQuery
(
urlParams
)).
addHeaders
(
getHeaders
()).
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_QUERY_API_ERROR
);
}
JSONObject
data
=
reqJson
.
getJSONObject
(
"data"
);
return
data
.
containsKey
(
"details"
)
?
data
.
getJSONArray
(
"details"
)
:
new
JSONArray
();
}
catch
(
GeneralSecurityException
|
UnsupportedEncodingException
e
)
{
throw
new
ServiceException
(
ECode
.
JINGDONG_TC_ORDER_QUERY_API_ERROR
);
}
}
private
String
sign
(
String
algorithm
,
byte
[]
data
,
byte
[]
secret
)
throws
GeneralSecurityException
{
private
String
sign
(
String
algorithm
,
byte
[]
data
,
byte
[]
secret
)
throws
GeneralSecurityException
{
if
(
Objects
.
equals
(
algorithm
,
"md5-salt"
))
{
if
(
Objects
.
equals
(
algorithm
,
"md5-salt"
))
{
...
@@ -148,4 +138,37 @@ public class JdtcUtil {
...
@@ -148,4 +138,37 @@ public class JdtcUtil {
}
}
return
stringBuilder
.
toString
();
return
stringBuilder
.
toString
();
}
}
private
Map
<
String
,
String
>
getUrlParams
(
String
method
,
String
body
)
throws
GeneralSecurityException
{
String
timestamp
=
DatePattern
.
NORM_DATETIME_FORMATTER
.
format
(
LocalDateTime
.
now
());
String
content
=
String
.
join
(
""
,
new
String
[]{
wlAppSecret
,
"access_token"
,
jdTCToken
,
"app_key"
,
wlAppkey
,
"method"
,
method
,
"param_json"
,
body
,
"timestamp"
,
timestamp
,
"v"
,
"2.0"
,
wlAppSecret
});
Map
<
String
,
String
>
urlParams
=
new
HashMap
<>();
urlParams
.
put
(
"LOP-DN"
,
DOMAIN
);
urlParams
.
put
(
"access_token"
,
jdTCToken
);
urlParams
.
put
(
"app_key"
,
wlAppkey
);
urlParams
.
put
(
"timestamp"
,
timestamp
);
urlParams
.
put
(
"v"
,
"2.0"
);
urlParams
.
put
(
"sign"
,
sign
(
ALGORITHM
,
content
.
getBytes
(
StandardCharsets
.
UTF_8
),
wlAppSecret
.
getBytes
(
StandardCharsets
.
UTF_8
)));
urlParams
.
put
(
"algorithm"
,
ALGORITHM
);
return
urlParams
;
}
private
Map
<
String
,
String
>
getHeaders
(){
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"
);
return
headers
;
}
}
}
src/main/java/com/sfa/job/util/KyeUtil.java
浏览文件 @
48a0b4c5
...
@@ -72,7 +72,7 @@ public class KyeUtil {
...
@@ -72,7 +72,7 @@ public class KyeUtil {
/**
/**
* 根据单号获取运单信息
* 根据单号获取运单信息
*/
*/
public
JSONArray
getWaybillBaseInfo
(
List
<
String
>
waybillNumbers
)
{
public
JSONArray
getWaybillBaseInfo
(
List
<
String
>
waybillNumbers
)
throws
Exception
{
try
{
try
{
Boolean
isSandbox
=
IS_SANDBOX
;
Boolean
isSandbox
=
IS_SANDBOX
;
String
appKey
=
APP_KEY
;
String
appKey
=
APP_KEY
;
...
@@ -95,7 +95,7 @@ public class KyeUtil {
...
@@ -95,7 +95,7 @@ public class KyeUtil {
}
}
}
}
public
JSONArray
queryWaybillPicture
(
String
expressNo
)
{
public
JSONArray
queryWaybillPicture
(
String
expressNo
)
throws
Exception
{
try
{
try
{
Boolean
isSandbox
=
IS_SANDBOX
;
Boolean
isSandbox
=
IS_SANDBOX
;
String
appKey
=
APP_KEY
;
String
appKey
=
APP_KEY
;
...
...
src/main/java/com/sfa/job/xxljob/order/FinanceOrderTask.java
浏览文件 @
48a0b4c5
...
@@ -6,7 +6,7 @@ import cn.hutool.http.HttpStatus;
...
@@ -6,7 +6,7 @@ import cn.hutool.http.HttpStatus;
import
com.alibaba.fastjson2.JSONObject
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.sfa.job.pojo.response.FinanceOrderDetailUpdateDto
;
import
com.sfa.job.pojo.response.FinanceOrderDetailUpdateDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.service.order.FinanceOrderSyncService
;
import
com.sfa.job.service.order.
I
FinanceOrderSyncService
;
import
com.xxl.job.core.context.XxlJobContext
;
import
com.xxl.job.core.context.XxlJobContext
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
...
@@ -26,7 +26,7 @@ import java.util.Date;
...
@@ -26,7 +26,7 @@ import java.util.Date;
public
class
FinanceOrderTask
{
public
class
FinanceOrderTask
{
@Autowired
@Autowired
FinanceOrderSyncService
f
inanceOrderSyncService
;
IFinanceOrderSyncService
IF
inanceOrderSyncService
;
/**
/**
* 同步财务订单数据
* 同步财务订单数据
...
@@ -45,7 +45,7 @@ public class FinanceOrderTask {
...
@@ -45,7 +45,7 @@ public class FinanceOrderTask {
XxlJobHelper
.
log
(
"xxl-job开始同步-旺店通订单明细api接口数据"
);
XxlJobHelper
.
log
(
"xxl-job开始同步-旺店通订单明细api接口数据"
);
// 定时任务不设定开始时间和结束时间
// 定时任务不设定开始时间和结束时间
SyncOrderDetailDto
detailDto
=
f
inanceOrderSyncService
.
syncWdtOrder
(
null
,
null
,
0
);
SyncOrderDetailDto
detailDto
=
IF
inanceOrderSyncService
.
syncWdtOrder
(
null
,
null
,
0
);
XxlJobHelper
.
log
(
"xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}"
,
XxlJobHelper
.
log
(
"xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{}"
,
detailDto
.
getOrderCount
(),
detailDto
.
getOrderDetailCount
(),
detailDto
.
getBatchNo
(),
detailDto
.
getOrderCount
(),
detailDto
.
getOrderDetailCount
(),
detailDto
.
getBatchNo
(),
DateUtil
.
formatDateTime
(
detailDto
.
getStartTime
()),
DateUtil
.
formatDateTime
(
detailDto
.
getEndTime
())
);
DateUtil
.
formatDateTime
(
detailDto
.
getStartTime
()),
DateUtil
.
formatDateTime
(
detailDto
.
getEndTime
())
);
...
@@ -73,7 +73,7 @@ public class FinanceOrderTask {
...
@@ -73,7 +73,7 @@ public class FinanceOrderTask {
XxlJobHelper
.
log
(
"xxl-job开始同步-旺店通订单明细api接口数据"
);
XxlJobHelper
.
log
(
"xxl-job开始同步-旺店通订单明细api接口数据"
);
// 定时任务不设定开始时间和结束时间
// 定时任务不设定开始时间和结束时间
SyncOrderDetailDto
detailDto
=
f
inanceOrderSyncService
.
syncWdtRefundOrder
(
null
,
null
,
0
);
SyncOrderDetailDto
detailDto
=
IF
inanceOrderSyncService
.
syncWdtRefundOrder
(
null
,
null
,
0
);
Long
endTime
=
System
.
currentTimeMillis
();
Long
endTime
=
System
.
currentTimeMillis
();
XxlJobHelper
.
log
(
"xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{},时长:{}"
,
XxlJobHelper
.
log
(
"xxl-job结束同步-旺店通订单明细api接口数据, 共同步订单{}条数据,订单明细{}条,订单批次号:{},订单的开始时间{}和结束时间{},时长:{}"
,
detailDto
.
getOrderCount
(),
detailDto
.
getOrderDetailCount
(),
detailDto
.
getBatchNo
(),
detailDto
.
getOrderCount
(),
detailDto
.
getOrderDetailCount
(),
detailDto
.
getBatchNo
(),
...
@@ -106,7 +106,7 @@ public class FinanceOrderTask {
...
@@ -106,7 +106,7 @@ public class FinanceOrderTask {
// 定时任务不设定开始时间和结束时间
// 定时任务不设定开始时间和结束时间
Date
startTime
=
DateUtil
.
beginOfDay
(
DateUtil
.
offsetDay
(
new
Date
(),-
1
));
Date
startTime
=
DateUtil
.
beginOfDay
(
DateUtil
.
offsetDay
(
new
Date
(),-
1
));
Date
endTime
=
DateUtil
.
endOfDay
(
DateUtil
.
offsetDay
(
new
Date
(),-
1
));
Date
endTime
=
DateUtil
.
endOfDay
(
DateUtil
.
offsetDay
(
new
Date
(),-
1
));
FinanceOrderDetailUpdateDto
detailDto
=
f
inanceOrderSyncService
.
updateCost
(
startTime
,
endTime
);
FinanceOrderDetailUpdateDto
detailDto
=
IF
inanceOrderSyncService
.
updateCost
(
startTime
,
endTime
);
XxlJobHelper
.
log
(
"修改旺店通订单明细结束-旺店通订单明细api接口数据, 共修改订单数{}条数据"
,
detailDto
.
getTotalCount
());
XxlJobHelper
.
log
(
"修改旺店通订单明细结束-旺店通订单明细api接口数据, 共修改订单数{}条数据"
,
detailDto
.
getTotalCount
());
XxlJobHelper
.
handleSuccess
(
JSONObject
.
toJSONString
(
detailDto
));
XxlJobHelper
.
handleSuccess
(
JSONObject
.
toJSONString
(
detailDto
));
...
...
src/main/java/com/sfa/job/xxljob/order/WdtQimenOrderTask.java
浏览文件 @
48a0b4c5
...
@@ -6,7 +6,7 @@ import cn.hutool.http.HttpStatus;
...
@@ -6,7 +6,7 @@ import cn.hutool.http.HttpStatus;
import
cn.hutool.json.JSONUtil
;
import
cn.hutool.json.JSONUtil
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.pojo.response.SyncOrderDetailDto
;
import
com.sfa.job.service.order.WdtQimenOrderSyncService
;
import
com.sfa.job.service.order.
I
WdtQimenOrderSyncService
;
import
com.xxl.job.core.context.XxlJobContext
;
import
com.xxl.job.core.context.XxlJobContext
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
...
@@ -26,7 +26,7 @@ import java.util.Date;
...
@@ -26,7 +26,7 @@ import java.util.Date;
public
class
WdtQimenOrderTask
{
public
class
WdtQimenOrderTask
{
@Autowired
@Autowired
WdtQimenOrderSyncService
qimenSyncService
;
I
WdtQimenOrderSyncService
qimenSyncService
;
/**
/**
* 同步财务订单数据
* 同步财务订单数据
...
...
src/main/resources/mapper/order/OrdersSentMapper.xml
浏览文件 @
48a0b4c5
...
@@ -51,7 +51,7 @@
...
@@ -51,7 +51,7 @@
<select
id=
"getNotReceiptSent"
resultMap=
"ordersSentResultMap"
>
<select
id=
"getNotReceiptSent"
resultMap=
"ordersSentResultMap"
>
select send_id, transport, transport_name, express_no, dd_no
select send_id, transport, transport_name, express_no, dd_no
from orders_sent
from orders_sent
where transport
= 109
where transport
in (109,134)
and receipt_flag = '无'
and receipt_flag = '无'
and post_data
>
= date_sub(CURDATE(), INTERVAL 45 DAY)
and post_data
>
= date_sub(CURDATE(), INTERVAL 45 DAY)
</select>
</select>
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论