Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
order-group
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
order-group-application
order-group
Commits
90ae4502
Commit
90ae4502
authored
Apr 04, 2023
by
查志伟
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix/门店自动退款不生效问题修复
parent
d5627814
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
164 additions
and
37 deletions
+164
-37
order-application-service/src/main/java/cn/freemud/adapter/OrderCancelReqAdapter.java
+35
-24
order-application-service/src/main/java/cn/freemud/adapter/OrderTaskReqAdapter.java
+67
-0
order-application-service/src/main/java/cn/freemud/entities/dto/store/BusinessInfoDto.java
+4
-0
order-application-service/src/main/java/cn/freemud/service/RefundService.java
+21
-11
order-application-service/src/main/java/cn/freemud/service/store/StoreManager.java
+36
-1
order-application-service/src/main/java/cn/freemud/service/thirdparty/StoreClient.java
+1
-1
No files found.
order-application-service/src/main/java/cn/freemud/adapter/
CancelOrderRequest
Adapter.java
→
order-application-service/src/main/java/cn/freemud/adapter/
OrderCancelReq
Adapter.java
View file @
90ae4502
package
cn
.
freemud
.
adapter
;
import
com.
freemud.application.sdk.api.log.LogThreadLocal
;
import
com.
alibaba.fastjson.JSONObject
;
import
com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderCancelReq
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs
;
import
com.freemud.sdk.api.assortment.order.enums.AfterSalesRefunStateEnum
;
import
com.freemud.sdk.api.assortment.order.enums.OperationClientEnum
;
import
com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest
;
import
org.apache.commons.lang.StringUtils
;
import
java.math.BigDecimal
;
...
...
@@ -15,39 +15,50 @@ import java.math.BigDecimal;
* @version 1.0.0
* @since 1.0.0
*/
public
class
CancelOrderRequest
Adapter
{
public
class
OrderCancelReq
Adapter
{
public
static
CancelOrderRequest
convert
(
OrderInfoReqs
order
,
String
refundId
,
AfterSalesType
afterSalesType
,
Long
refundAmount
,
String
reason
,
String
remark
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
CancelOrderRequest
req
=
new
CancelOrderRequest
();
req
.
setOrderId
(
order
.
getOrderCode
());
req
.
setPartnerId
(
order
.
getPartnerId
());
req
.
setAfterSalesType
(
afterSalesType
);
req
.
setOrderClient
(
order
.
getOrderClient
());
public
static
OrderCancelReq
convert
(
OrderInfoReqs
order
,
String
refundId
,
AfterSalesType
afterSalesType
,
Long
refundAmount
,
String
reason
,
String
remark
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
OrderCancelReq
req
=
new
OrderCancelReq
();
if
(
StringUtils
.
isNotBlank
(
reason
)
&&
reason
.
length
()
>
50
)
{
reason
=
reason
.
substring
(
0
,
50
);
}
req
.
setReason
(
reason
);
req
.
setTrackingNo
(
LogThreadLocal
.
getTrackingNo
());
req
.
setRefundSerialNo
(
refundId
);
//商户号必传
req
.
setPartnerId
(
order
.
getPartnerId
());
req
.
setOrderCode
(
order
.
getOrderCode
());
req
.
setReqRemark
(
remark
);
req
.
setReqAmount
(
refundAmount
!=
null
?
new
BigDecimal
(
refundAmount
)
:
null
);
req
.
setIsPartRefund
(
refundAmount
!=
null
);
// 是否部分退
req
.
setReqAmount
(
refundAmount
!=
null
?
new
BigDecimal
(
refundAmount
)
:
null
);
// 退款金额
//售后单类型 1:其他取消 2:用户取消 3:商户取消 4:未支付超时关单 5:商户接单超时取消 6:商家拒单
// 7:配送用户拒收 8:用户售后退货/售后退款 9:系统取消 10:客服取消 11:用户统一取消,
req
.
setAfterSalesType
(
afterSalesType
.
getIndex
());
req
.
setOrderClient
(
order
.
getOrderClient
());
req
.
setCancelReason
(
reason
);
req
.
setAfterSalesReason
(
reason
);
req
.
setAfterSerialNo
(
refundId
);
// 商城订单 增加拓展信息
if
(
null
!=
refundMode
)
{
JSONObject
ext
=
new
JSONObject
();
ext
.
put
(
"refundMode"
,
refundMode
);
req
.
setExtInfo
(
ext
.
toJSONString
());
}
req
.
setRefundDeliveryAmount
(
refundDeliveryFee
);
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_1
.
getIndex
());
//操作来源客户端 1:POS插件 2:小助手 3:开放平台 4:自动任务 5:用户端 6:系统 7:万象 8:太一
req
.
setOperationClient
(
OperationClientEnum
.
STATE_5
.
getIndex
());
req
.
setOperator
(
order
.
getUserName
());
if
(
AfterSalesType
.
SYSTEM_CANCEL
.
getIndex
().
equals
(
afterSalesType
.
getIndex
()))
{
req
.
setOperator
(
"admin"
);
req
.
setOperationClient
(
OperationClientEnum
.
STATE_6
.
getIndex
());
}
else
{
req
.
setOperationClient
(
OperationClientEnum
.
STATE_5
.
getIndex
());
req
.
setOperator
(
order
.
getUserName
());
}
// 这里给默认值,外面调用者 自己的根据业务判断退款 状态
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_1
.
getIndex
());
req
.
setReqRemark
(
remark
);
req
.
setRefundDeliveryAmount
(
refundDeliveryFee
);
// 商城订单 增加拓展信息
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
ext
=
new
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
();
ext
.
setRefundMode
(
refundMode
);
req
.
setExtInfoReq
(
ext
);
return
req
;
}
}
order-application-service/src/main/java/cn/freemud/adapter/OrderTaskReqAdapter.java
0 → 100644
View file @
90ae4502
package
cn
.
freemud
.
adapter
;
import
cn.freemud.base.util.DateUtil
;
import
cn.freemud.entities.dto.store.BusinessInfoDto
;
import
com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq
;
import
java.util.Date
;
import
java.util.Objects
;
import
java.util.Random
;
/**
* @author Clover.z
* @version 1.0.0
* @since 1.0.0
*/
public
class
OrderTaskReqAdapter
{
/**
* 设置申请退款时间
* 如果时间的类型是2表示采用原来的48小时逻辑
* 如果时间的类型是1表示在指定的时间之后进行退款
* 为了防止同一时刻的退款量太大,需要将退款的订单分散到指定的时间后半小时内
*/
public
static
OrderTaskReq
convert
(
BusinessInfoDto
config
)
{
OrderTaskReq
orderTask
;
if
(
config
.
getTimeTypeOfRefund
()
==
null
||
Objects
.
equals
(
config
.
getTimeTypeOfRefund
(),
2
))
{
// 48小时之后
orderTask
=
new
OrderTaskReq
();
orderTask
.
setTaskType
(
4
);
orderTask
.
setTimeout
(
1
);
//1000*60*60*24*2 毫秒(48小时)
long
timeout
=
172800000
;
long
timeMillis
=
System
.
currentTimeMillis
();
Date
processingDate
=
new
Date
(
timeMillis
+
timeout
-
60000
);
Date
taskTime
=
new
Date
(
timeMillis
+
timeout
);
orderTask
.
setTaskTime
(
DateUtil
.
convert2String
(
taskTime
,
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
));
//处理时间,当前时间加48小时减1分钟
orderTask
.
setProcessingTime
(
DateUtil
.
convert2String
(
processingDate
,
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
));
}
else
if
(
config
.
getTimeTypeOfRefund
()
!=
null
&&
config
.
getTimeTypeOfRefund
().
compareTo
(
1
)
==
0
)
{
// 指定时间
orderTask
=
new
OrderTaskReq
();
orderTask
.
setTaskType
(
4
);
orderTask
.
setTimeout
(
1
);
// 获取门店配置的当天指定的退款时间
String
timeOfRefund
=
config
.
getTimeOfRefund
();
// 获取半小时的随机数
Random
r
=
new
Random
();
int
minute
=
r
.
ints
(
1
,
31
).
findFirst
().
getAsInt
()
*
60000
;
String
today
=
DateUtil
.
getCurrentDate
(
DateUtil
.
FORMAT_YMD
);
Date
configTime
=
DateUtil
.
convert2Date
(
today
+
" "
+
timeOfRefund
,
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
);
// 判断当前时间是否已经超过门店设置的截至时间
if
(
new
Date
().
after
(
configTime
))
{
today
=
DateUtil
.
convert2String
(
DateUtil
.
addDays
(
new
Date
(),
1
),
DateUtil
.
FORMAT_YMD
);
configTime
=
DateUtil
.
convert2Date
(
today
+
" "
+
timeOfRefund
,
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
);
}
Date
processingDate
=
new
Date
(
configTime
.
getTime
()
+
minute
);
String
processingStr
=
DateUtil
.
convert2String
(
processingDate
,
DateUtil
.
FORMAT_YYYY_MM_DD_HHMMSS
);
orderTask
.
setTaskTime
(
processingStr
);
orderTask
.
setProcessingTime
(
processingStr
);
}
else
{
orderTask
=
null
;
}
return
orderTask
;
}
}
order-application-service/src/main/java/cn/freemud/entities/dto/store/BusinessInfoDto.java
View file @
90ae4502
...
...
@@ -197,6 +197,10 @@ public class BusinessInfoDto {
private
String
timeOfRefund
;
/**
* 1-指定时间退款
* 2-48小时后自动退款处理
*/
private
Integer
timeTypeOfRefund
;
...
...
order-application-service/src/main/java/cn/freemud/service/RefundService.java
View file @
90ae4502
package
cn
.
freemud
.
service
;
import
cn.freemud.adapter.CancelOrderRequestAdapter
;
import
cn.freemud.adapter.MessageNoticeAdapter
;
import
cn.freemud.adapter.OrderCancelReqAdapter
;
import
cn.freemud.adapter.OrderPrintDtoAdapter
;
import
cn.freemud.adapter.OrderTaskReqAdapter
;
import
cn.freemud.base.util.DateUtil
;
import
cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse
;
import
cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo
;
import
cn.freemud.entities.dto.ecology.SendMessageRequest
;
import
cn.freemud.entities.dto.store.BusinessInfoDto
;
import
cn.freemud.entities.vo.OrderDevelopRefundVo
;
import
cn.freemud.enums.AfterSalesOrderCreateEventEnum
;
import
cn.freemud.enums.PayRefundStatus
;
...
...
@@ -21,6 +23,7 @@ import cn.freemud.management.service.handle.OrderVerifyHandle;
import
cn.freemud.management.service.handle.PaymentHandle
;
import
cn.freemud.redis.RedisCache
;
import
cn.freemud.service.impl.OrderQueueService
;
import
cn.freemud.service.store.StoreManager
;
import
cn.freemud.service.thirdparty.DeliveryFeiginClient
;
import
cn.freemud.service.thirdparty.EcologyAdminApplicationClient
;
import
cn.freemud.service.thirdparty.FMAssistantCloudPrintClient
;
...
...
@@ -31,7 +34,9 @@ import com.freemud.application.sdk.api.constant.ResponseConstant;
import
com.freemud.application.sdk.api.log.ErrorLog
;
import
com.freemud.application.sdk.api.log.LogThreadLocal
;
import
com.freemud.application.sdk.api.ordercenter.enums.*
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderCancelReq
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto
;
import
com.freemud.application.sdk.api.ordercenter.response.OrderBaseResp
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSalesOrderResp
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.QueryByCodeResponse
;
...
...
@@ -40,8 +45,7 @@ import com.freemud.application.sdk.api.structure.request.PushMessageNoticeDto;
import
com.freemud.application.sdk.api.structure.service.MessageCenterClient
;
import
com.freemud.sdk.api.assortment.order.constant.OrderRedisKeyConstant
;
import
com.freemud.sdk.api.assortment.order.entities.OrderRefundConfigEntity
;
import
com.freemud.sdk.api.assortment.order.request.order.CancelOrderRequest
;
import
com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse
;
import
com.freemud.sdk.api.assortment.order.enums.AutoOrderConfigTime
;
import
com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService
;
import
lombok.RequiredArgsConstructor
;
import
org.apache.commons.collections4.CollectionUtils
;
...
...
@@ -77,6 +81,7 @@ public class RefundService {
private
final
FMAssistantCloudPrintClient
fmAssistantCloudPrintClient
;
private
final
OrderManagerAdapter
orderManagerAdapter
;
private
final
OrderVerifyHandle
orderVerifyHandle
;
private
final
StoreManager
storeManager
;
private
OrderInfoReqs
preValidRefund
(
String
partnerId
,
String
orderCode
,
Byte
refundMode
)
{
// 查询订单信息
...
...
@@ -281,7 +286,7 @@ public class RefundService {
state
=
refundResponse
.
getPayRefundStatus
().
getCode
();
}
CancelOrderRequest
req
=
CancelOrderRequest
Adapter
.
convert
(
order
,
UUID
.
randomUUID
().
toString
(),
OrderCancelReq
req
=
OrderCancelReq
Adapter
.
convert
(
order
,
UUID
.
randomUUID
().
toString
(),
AfterSalesType
.
USER_CANCEL
,
null
,
reason
,
remark
,
isRefundDeliveryFee
,
refundMode
);
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_4
.
getIndex
());
if
(
Objects
.
equals
(
PayRefundStatus
.
SUCCESS
.
getCode
(),
state
))
{
...
...
@@ -295,9 +300,8 @@ public class RefundService {
throw
new
ServiceException
(
ResponseResult
.
MULTIORDER__ERRORREFUND
.
getMessage
());
}
BaseOrderResponse
resp
=
orderCenterSdkService
.
orderCancel
(
req
);
if
(
resp
==
null
||
!
ObjectUtils
.
equals
(
ResponseConstant
.
SUCCESS_RESPONSE_CODE
,
resp
.
getErrcode
()))
{
OrderBaseResp
<?>
resp
=
orderSdkService
.
cancelOrder
(
req
,
LogThreadLocal
.
getTrackingNo
());
if
(
resp
==
null
||
!
ObjectUtils
.
equals
(
ResponseConstant
.
SUCCESS_RESPONSE_CODE_STR
,
resp
.
getCode
()))
{
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
.
getMessage
());
}
...
...
@@ -313,10 +317,16 @@ public class RefundService {
private
void
createAfterSales
(
OrderInfoReqs
order
,
Long
refundAmount
,
String
reason
,
String
remark
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
AfterSalesType
type
=
NewOrderStatus
.
COMPLETE
.
getIndex
().
equals
(
order
.
getOrderState
())
?
AfterSalesType
.
USER_SALE_RETURN
:
AfterSalesType
.
USER_CANCEL
;
CancelOrderRequest
req
=
CancelOrderRequestAdapter
.
convert
(
order
,
null
,
type
,
refundAmount
,
reason
,
remark
,
refundDeliveryFee
,
refundMode
);
BaseOrderResponse
resp
=
orderCenterSdkService
.
orderCancel
(
req
);
if
(!
Objects
.
equals
(
resp
.
getErrcode
(),
100
))
{
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
.
getCode
(),
resp
.
getErrmsg
());
OrderCancelReq
req
=
OrderCancelReqAdapter
.
convert
(
order
,
null
,
type
,
refundAmount
,
reason
,
remark
,
refundDeliveryFee
,
refundMode
);
// 查询门店服务配置,退单模式为2为自动退款,判断自动退款时间,设置为0则不传入timeout,
BusinessInfoDto
config
=
storeManager
.
queryStoreBusiness
(
order
.
getPartnerId
(),
order
.
getStoreId
());
if
(
Objects
.
equals
(
config
.
getAutoChargebackOrderType
(),
2
)
&&
!
Objects
.
equals
(
config
.
getAutoChargebackOrderTime
(),
0
))
{
req
.
setTimeOut
(
AutoOrderConfigTime
.
getTime
(
config
.
getAutoChargebackOrderTime
().
toString
()));
}
req
.
setOrderTask
(
OrderTaskReqAdapter
.
convert
(
config
));
OrderBaseResp
<?>
resp
=
orderSdkService
.
cancelOrder
(
req
,
LogThreadLocal
.
getTrackingNo
());
if
(!
Objects
.
equals
(
resp
.
getCode
(),
"100"
))
{
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
.
getCode
(),
resp
.
getMessage
());
}
// 金额大于0的退款,发送到消息中心推送到pos
...
...
order-application-service/src/main/java/cn/freemud/service/store/StoreManager.java
View file @
90ae4502
package
cn
.
freemud
.
service
.
store
;
import
cn.freemud.constant.ResponseCodeConstant
;
import
cn.freemud.entities.dto.StoreResponseDto
;
import
cn.freemud.entities.dto.store.BusinessInfoDto
;
import
cn.freemud.entities.dto.store.StoreMixResponseDto
;
import
cn.freemud.entities.dto.store.StoreBaseResponseDto
;
import
cn.freemud.entities.dto.store.StoreInfoRequestDto
;
...
...
@@ -29,7 +31,7 @@ public class StoreManager {
* @param partnerId 商户号
* @param storeCode 门店号
* @param q 设置查询数据的func
* @return
* @return
门店聚合信息
*/
public
StoreMixResponseDto
queryStoreMixInfo
(
String
partnerId
,
String
storeCode
,
Consumer
<
StoreInfoRequestDto
.
QueryInfo
>
q
)
{
StoreInfoRequestDto
request
=
new
StoreInfoRequestDto
(
partnerId
,
storeCode
);
...
...
@@ -43,4 +45,37 @@ public class StoreManager {
return
response
.
getBizVO
();
}
/**
* 查询门店信息
* @param partnerId 商户号
* @param storeCode 门店号
* @return 门店信息
*/
public
StoreResponseDto
queryStoreInfo
(
String
partnerId
,
String
storeCode
)
{
StoreMixResponseDto
mix
=
this
.
queryStoreMixInfo
(
partnerId
,
storeCode
,
query
->
{
query
.
setQueryStoreInfo
(
true
);
});
if
(
null
==
mix
.
getStoreInfo
())
{
throw
new
ServiceException
(
"门店不存在"
);
}
return
mix
.
getStoreInfo
();
}
/**
* 查询门店业务配置信息
* @param partnerId 商户号
* @param storeCode 门店号
* @return 门店业务配置信息
*/
public
BusinessInfoDto
queryStoreBusiness
(
String
partnerId
,
String
storeCode
)
{
StoreMixResponseDto
mix
=
this
.
queryStoreMixInfo
(
partnerId
,
storeCode
,
query
->
{
query
.
setQueryBusinessInfo
(
true
);
});
if
(
null
==
mix
.
getBusinessInfo
())
{
throw
new
ServiceException
(
"门店未初始化业务配置"
);
}
return
mix
.
getBusinessInfo
();
}
}
order-application-service/src/main/java/cn/freemud/service/thirdparty/StoreClient.java
View file @
90ae4502
...
...
@@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
@FeignClient
(
name
=
"CONSOLE-API"
,
url
=
"${saas.storeclient.feign.url}"
)
@FeignClient
(
name
=
"CONSOLE-API"
,
url
=
"${saas.storeclient.feign.url
:
}"
)
@RequestMapping
(
produces
=
{
"application/json;charset=UTF-8"
})
public
interface
StoreClient
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment