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
d2f97121
Commit
d2f97121
authored
Jan 09, 2023
by
咸鱼
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:订单支持部分退款
parent
27ed02bf
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
204 additions
and
40 deletions
+204
-40
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/order/V2CancelOrderRequest.java
+90
-0
order-application-service/src/main/java/cn/freemud/adapter/CancelOrderRequestAdapter.java
+2
-2
order-application-service/src/main/java/cn/freemud/adapter/V2CancelOrderRequestAdapter.java
+49
-0
order-application-service/src/main/java/cn/freemud/controller/OrderController.java
+1
-1
order-application-service/src/main/java/cn/freemud/entities/vo/OrderRefundVo.java
+5
-0
order-application-service/src/main/java/cn/freemud/service/RefundService.java
+36
-25
order-application-service/src/main/java/cn/freemud/service/thirdparty/OrderServiceClient.java
+5
-0
order-management/src/main/java/cn/freemud/management/service/handle/PaymentHandle.java
+16
-12
No files found.
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/request/order/V2CancelOrderRequest.java
0 → 100644
View file @
d2f97121
package
com
.
freemud
.
sdk
.
api
.
assortment
.
order
.
request
.
order
;
import
com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Builder
;
import
lombok.Data
;
import
org.hibernate.validator.constraints.Range
;
import
javax.validation.constraints.NotNull
;
import
java.math.BigDecimal
;
@Data
public
class
V2CancelOrderRequest
{
@ApiModelProperty
(
value
=
"商户号"
,
required
=
true
)
@NotNull
private
String
partnerId
;
@ApiModelProperty
(
value
=
"操作人"
)
private
String
operator
;
@ApiModelProperty
(
value
=
"订单编号,与thirdOrderCode二选一,如果orderCode为null则使用thirdOrderCode查询订单"
)
private
String
orderCode
;
@ApiModelProperty
(
value
=
"第三方订单编码,与orderCode二选一,三平台订单号,例如百度、饿了么、美团"
)
private
String
thirdOrderCode
;
@NotNull
(
message
=
"下单渠道不能为空"
)
@Range
(
min
=
1
,
max
=
127
)
private
Byte
orderClient
;
@ApiModelProperty
(
value
=
"退的配送费,单位:分"
)
private
BigDecimal
deliveryAmount
;
@ApiModelProperty
(
value
=
"售后原因"
)
private
String
afterSalesReason
;
@ApiModelProperty
(
value
=
"取消原因"
,
hidden
=
true
)
private
String
cancelReason
;
@ApiModelProperty
(
value
=
"申请说明"
)
private
String
reqRemark
=
""
;
@ApiModelProperty
(
value
=
"从创建售后单开始计时,超时完成的时间(单位:分钟),超时后通知。若不需要通知,则不填写。"
)
private
Integer
timeout
;
@ApiModelProperty
(
value
=
"订单定时任务"
)
private
OrderTaskReq
orderTask
;
/**
* 操作来源客户端
*/
@ApiModelProperty
(
value
=
"操作来源客户端 1:POS插件 2:小助手 3:开放平台 4:自动任务 5:用户端 6:系统 7:万象 8:太一"
)
private
Byte
operationClient
;
/**
* 售后退款状态
*/
@ApiModelProperty
(
value
=
"售后退款状态 0:未定义(存量数据) 1:未退款 2:退款中 3:退款失败 4:已退款"
)
private
Byte
refundState
;
/**
* 退款失败原因
*/
@ApiModelProperty
(
value
=
"退款失败原因"
)
private
String
refundFailReason
;
@ApiModelProperty
(
value
=
"售后单类型"
,
required
=
true
)
@NotNull
private
Byte
afterSalesType
;
@ApiModelProperty
(
value
=
"是否退配送费,默认值:是"
)
@Builder
.
Default
private
boolean
isRefundDeliveryAmount
=
true
;
@ApiModelProperty
(
value
=
"申请金额,单位分,如果是全部退款,并且传递null,则自动填入 订单用户需支付金额"
,
required
=
true
)
private
BigDecimal
reqAmount
;
@ApiModelProperty
(
value
=
"若为null,默认只做【创建】,售后单状态为【待处理】\n"
+
"若为2,默认做【创建】+【审核通过】,售后单状态为【退货中】\n"
+
"若为5,默认做【创建】+【同意并退货完成】,售后单状态【已退货】\n"
+
"若为4,默认做【创建】+【同意并退款完成】,售后单状态为【完成】"
)
private
Byte
createEvent
;
@ApiModelProperty
(
value
=
"扩展字段"
)
private
String
extInfo
=
"{}"
;
@ApiModelProperty
(
value
=
"订单是否需要挂起,默认挂起"
)
private
boolean
suspended
=
true
;
}
order-application-service/src/main/java/cn/freemud/adapter/CancelOrderRequestAdapter.java
View file @
d2f97121
...
@@ -15,7 +15,7 @@ import org.apache.commons.lang.StringUtils;
...
@@ -15,7 +15,7 @@ import org.apache.commons.lang.StringUtils;
*/
*/
public
class
CancelOrderRequestAdapter
{
public
class
CancelOrderRequestAdapter
{
public
static
CancelOrderRequest
convert
(
OrderInfoReqs
order
,
String
refundId
,
AfterSalesType
afterSalesType
,
String
reason
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
public
static
CancelOrderRequest
convert
(
OrderInfoReqs
order
,
String
refundId
,
AfterSalesType
afterSalesType
,
String
reason
,
String
remark
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
CancelOrderRequest
req
=
new
CancelOrderRequest
();
CancelOrderRequest
req
=
new
CancelOrderRequest
();
req
.
setOrderId
(
order
.
getOrderCode
());
req
.
setOrderId
(
order
.
getOrderCode
());
req
.
setPartnerId
(
order
.
getPartnerId
());
req
.
setPartnerId
(
order
.
getPartnerId
());
...
@@ -36,7 +36,7 @@ public class CancelOrderRequestAdapter {
...
@@ -36,7 +36,7 @@ public class CancelOrderRequestAdapter {
}
}
// 这里给默认值,外面调用者 自己的根据业务判断退款 状态
// 这里给默认值,外面调用者 自己的根据业务判断退款 状态
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_1
.
getIndex
());
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_1
.
getIndex
());
req
.
setReqRemark
(
re
ason
);
req
.
setReqRemark
(
re
mark
);
req
.
setRefundDeliveryAmount
(
refundDeliveryFee
);
req
.
setRefundDeliveryAmount
(
refundDeliveryFee
);
// 商城订单 增加拓展信息
// 商城订单 增加拓展信息
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
ext
=
new
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
();
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
ext
=
new
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
();
...
...
order-application-service/src/main/java/cn/freemud/adapter/V2CancelOrderRequestAdapter.java
0 → 100644
View file @
d2f97121
package
cn
.
freemud
.
adapter
;
import
com.alibaba.fastjson.JSON
;
import
com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType
;
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
com.freemud.sdk.api.assortment.order.request.order.V2CancelOrderRequest
;
import
org.apache.commons.lang.StringUtils
;
import
java.math.BigDecimal
;
public
class
V2CancelOrderRequestAdapter
{
public
static
V2CancelOrderRequest
convert
(
OrderInfoReqs
order
,
Long
refundAmount
,
AfterSalesType
afterSalesType
,
String
reason
,
String
remark
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
V2CancelOrderRequest
req
=
new
V2CancelOrderRequest
();
req
.
setPartnerId
(
order
.
getPartnerId
());
req
.
setOperator
(
order
.
getUserName
());
if
(
AfterSalesType
.
SYSTEM_CANCEL
.
getIndex
().
equals
(
afterSalesType
.
getIndex
()))
{
req
.
setOperator
(
"admin"
);
req
.
setOperationClient
(
OperationClientEnum
.
STATE_6
.
getIndex
().
byteValue
());
}
req
.
setOrderCode
(
order
.
getOrderCode
());
req
.
setReqAmount
(
new
BigDecimal
(
refundAmount
));
req
.
setOrderClient
(
order
.
getOrderClient
().
byteValue
());
req
.
setOperationClient
(
OperationClientEnum
.
STATE_5
.
getIndex
().
byteValue
());
if
(
StringUtils
.
isNotBlank
(
reason
)
&&
reason
.
length
()
>
50
)
{
reason
=
reason
.
substring
(
0
,
50
);
}
req
.
setAfterSalesReason
(
reason
);
req
.
setCancelReason
(
reason
);
req
.
setReqRemark
(
remark
);
req
.
setAfterSalesType
(
afterSalesType
.
getIndex
().
byteValue
());
// 这里给默认值,外面调用者 自己的根据业务判断退款 状态
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_1
.
getIndex
().
byteValue
());
req
.
setRefundDeliveryAmount
(
refundDeliveryFee
);
// 商城订单 增加拓展信息
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
ext
=
new
CancelOrderRequest
.
AfterSalesOrderExtInfoReq
();
ext
.
setRefundMode
(
refundMode
);
req
.
setExtInfo
(
JSON
.
toJSONString
(
ext
));
return
req
;
}
}
order-application-service/src/main/java/cn/freemud/controller/OrderController.java
View file @
d2f97121
...
@@ -248,7 +248,7 @@ public class OrderController {
...
@@ -248,7 +248,7 @@ public class OrderController {
// 微商城因为没有退款原因选项 所以将用户退款说明用户作为退款原因
// 微商城因为没有退款原因选项 所以将用户退款说明用户作为退款原因
String
reason
=
StringUtils
.
isBlank
(
reqVo
.
getReason
())
String
reason
=
StringUtils
.
isBlank
(
reqVo
.
getReason
())
?
reqVo
.
getRemarks
()
:
reqVo
.
getReason
();
?
reqVo
.
getRemarks
()
:
reqVo
.
getReason
();
refundService
.
refundOrder
(
reqVo
.
getPartnerId
(),
reqVo
.
getOid
(),
re
ason
,
reqVo
.
getRefundMode
());
refundService
.
refundOrder
(
reqVo
.
getPartnerId
(),
reqVo
.
getOid
(),
re
qVo
.
getRefundAmount
(),
reason
,
reqVo
.
getRemarks
()
,
reqVo
.
getRefundMode
());
return
ResponseUtil
.
success
();
return
ResponseUtil
.
success
();
}
}
...
...
order-application-service/src/main/java/cn/freemud/entities/vo/OrderRefundVo.java
View file @
d2f97121
...
@@ -43,6 +43,11 @@ public class OrderRefundVo {
...
@@ -43,6 +43,11 @@ public class OrderRefundVo {
private
String
partnerId
;
private
String
partnerId
;
/**
/**
* 退款金额
*/
private
Long
refundAmount
;
/**
* 微商城退款方式
* 微商城退款方式
*
*
* @see RefundModeEnum#getIndex()
* @see RefundModeEnum#getIndex()
...
...
order-application-service/src/main/java/cn/freemud/service/RefundService.java
View file @
d2f97121
...
@@ -3,6 +3,8 @@ package cn.freemud.service;
...
@@ -3,6 +3,8 @@ package cn.freemud.service;
import
cn.freemud.adapter.CancelOrderRequestAdapter
;
import
cn.freemud.adapter.CancelOrderRequestAdapter
;
import
cn.freemud.adapter.MessageNoticeAdapter
;
import
cn.freemud.adapter.MessageNoticeAdapter
;
import
cn.freemud.adapter.OrderPrintDtoAdapter
;
import
cn.freemud.adapter.OrderPrintDtoAdapter
;
import
cn.freemud.adapter.V2CancelOrderRequestAdapter
;
import
cn.freemud.base.entity.BaseResponse
;
import
cn.freemud.base.util.DateUtil
;
import
cn.freemud.base.util.DateUtil
;
import
cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse
;
import
cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedResponse
;
import
cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo
;
import
cn.freemud.entities.dto.delivery.QueryFreightRefundSupportedVo
;
...
@@ -24,6 +26,7 @@ import cn.freemud.service.impl.OrderQueueService;
...
@@ -24,6 +26,7 @@ import cn.freemud.service.impl.OrderQueueService;
import
cn.freemud.service.thirdparty.DeliveryFeiginClient
;
import
cn.freemud.service.thirdparty.DeliveryFeiginClient
;
import
cn.freemud.service.thirdparty.EcologyAdminApplicationClient
;
import
cn.freemud.service.thirdparty.EcologyAdminApplicationClient
;
import
cn.freemud.service.thirdparty.FMAssistantCloudPrintClient
;
import
cn.freemud.service.thirdparty.FMAssistantCloudPrintClient
;
import
cn.freemud.service.thirdparty.OrderServiceClient
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentCloudPrinter
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentCloudPrinter
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentCloudPrinterManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentCloudPrinterManager
;
...
@@ -41,6 +44,7 @@ import com.freemud.application.sdk.api.structure.service.MessageCenterClient;
...
@@ -41,6 +44,7 @@ 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.constant.OrderRedisKeyConstant
;
import
com.freemud.sdk.api.assortment.order.entities.OrderRefundConfigEntity
;
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.request.order.CancelOrderRequest
;
import
com.freemud.sdk.api.assortment.order.request.order.V2CancelOrderRequest
;
import
com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse
;
import
com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse
;
import
com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService
;
import
com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService
;
import
lombok.RequiredArgsConstructor
;
import
lombok.RequiredArgsConstructor
;
...
@@ -77,6 +81,7 @@ public class RefundService {
...
@@ -77,6 +81,7 @@ public class RefundService {
private
final
FMAssistantCloudPrintClient
fmAssistantCloudPrintClient
;
private
final
FMAssistantCloudPrintClient
fmAssistantCloudPrintClient
;
private
final
OrderManagerAdapter
orderManagerAdapter
;
private
final
OrderManagerAdapter
orderManagerAdapter
;
private
final
OrderVerifyHandle
orderVerifyHandle
;
private
final
OrderVerifyHandle
orderVerifyHandle
;
private
final
OrderServiceClient
orderServiceClient
;
private
OrderInfoReqs
preValidRefund
(
String
partnerId
,
String
orderCode
,
Byte
refundMode
)
{
private
OrderInfoReqs
preValidRefund
(
String
partnerId
,
String
orderCode
,
Byte
refundMode
)
{
// 查询订单信息
// 查询订单信息
...
@@ -104,16 +109,19 @@ public class RefundService {
...
@@ -104,16 +109,19 @@ public class RefundService {
/**
/**
* C端用户发起退款
* C端用户发起退款
*
* @param partnerId 商户号
* @param partnerId 商户号
* @param orderCode 订单号
* @param orderCode 订单号
* @param refundAmount 退款金额
* @param reason 退款原因/说明
* @param reason 退款原因/说明
* @param remark 退款备注
* @param refundMode 商城订单 退款模式
* @param refundMode 商城订单 退款模式
*/
*/
public
void
refundOrder
(
String
partnerId
,
String
orderCode
,
String
reason
,
Byte
refundMode
)
{
public
void
refundOrder
(
String
partnerId
,
String
orderCode
,
Long
refundAmount
,
String
reason
,
String
remark
,
Byte
refundMode
)
{
if
(
StringUtils
.
isEmpty
(
reason
))
reason
=
"退款"
;
if
(
StringUtils
.
isEmpty
(
reason
))
reason
=
"退款"
;
// 退款校验
// 退款校验
OrderInfoReqs
order
=
preValidRefund
(
partnerId
,
orderCode
,
refundMode
);
OrderInfoReqs
order
=
preValidRefund
(
partnerId
,
orderCode
,
refundMode
);
//存在售后信息
//
存在售后信息
if
(
CollectionUtils
.
isNotEmpty
(
order
.
getAfterSalesOrderList
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
order
.
getAfterSalesOrderList
()))
{
Optional
<
AfterSalesOrderResp
>
exists
=
order
.
getAfterSalesOrderList
().
stream
()
Optional
<
AfterSalesOrderResp
>
exists
=
order
.
getAfterSalesOrderList
().
stream
()
.
filter
(
r
->
AfterSalesStatus
.
PENDING
.
getIndex
().
equals
(
r
.
getAfterSalesStatus
()))
.
filter
(
r
->
AfterSalesStatus
.
PENDING
.
getIndex
().
equals
(
r
.
getAfterSalesStatus
()))
...
@@ -124,21 +132,22 @@ public class RefundService {
...
@@ -124,21 +132,22 @@ public class RefundService {
if
(!
orderVerifyHandle
.
getRefundConfig
(
order
))
if
(!
orderVerifyHandle
.
getRefundConfig
(
order
))
throw
new
ServiceException
(
"该门店不支持线上退款,请联系门店进行线下处理"
);
throw
new
ServiceException
(
"该门店不支持线上退款,请联系门店进行线下处理"
);
//退款是否退配送费
//
退款是否退配送费
boolean
refundDeliveryFee
=
isRefundDeliveryFee
(
order
);
boolean
refundDeliveryFee
=
isRefundDeliveryFee
(
order
,
refundAmount
);
// 未接单
// 未接单
if
(
NewOrderStatus
.
PLACE_AN_ORDER
.
getIndex
().
equals
(
order
.
getOrderState
()))
{
if
(
NewOrderStatus
.
PLACE_AN_ORDER
.
getIndex
().
equals
(
order
.
getOrderState
()))
{
//商家未接单逻辑处理 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
//
商家未接单逻辑处理 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
refundOrder
(
order
,
reason
,
refundDeliveryFee
,
refundMode
);
refundOrder
(
order
,
reason
,
re
mark
,
re
fundDeliveryFee
,
refundMode
);
orderQueueService
.
backOrdersStatusChange
(
order
.
getOrderCode
(),
order
.
getOrderState
(),
order
.
getPayState
(),
order
.
getPartnerId
());
orderQueueService
.
backOrdersStatusChange
(
order
.
getOrderCode
(),
order
.
getOrderState
(),
order
.
getPayState
(),
order
.
getPartnerId
());
}
else
{
}
else
{
//
已接单的,创建售后单
//
已接单的,创建售后单
createAfterSales
(
order
,
re
ason
,
refundDeliveryFee
,
refundMode
);
createAfterSales
(
order
,
re
fundAmount
,
reason
,
remark
,
refundDeliveryFee
,
refundMode
);
}
}
}
}
/**
/**
* 退订单金额(仅退款,不会处理订单状态)
* 退订单金额(仅退款,不会处理订单状态)
*
* @param partnerId 商户号
* @param partnerId 商户号
* @param orderCode 订单号
* @param orderCode 订单号
* @return 退款状态 {@link PayRefundStatus}
* @return 退款状态 {@link PayRefundStatus}
...
@@ -155,7 +164,6 @@ public class RefundService {
...
@@ -155,7 +164,6 @@ public class RefundService {
/**
/**
* 研发批量退款,内部技术支持使用
* 研发批量退款,内部技术支持使用
*
*/
*/
public
Map
<
String
,
String
>
batchDevelopRefund
(
OrderDevelopRefundVo
orderRefundVo
)
{
public
Map
<
String
,
String
>
batchDevelopRefund
(
OrderDevelopRefundVo
orderRefundVo
)
{
if
(
CollectionUtils
.
isEmpty
(
orderRefundVo
.
getOrderCodes
()))
{
if
(
CollectionUtils
.
isEmpty
(
orderRefundVo
.
getOrderCodes
()))
{
...
@@ -189,7 +197,7 @@ public class RefundService {
...
@@ -189,7 +197,7 @@ public class RefundService {
throw
new
ServiceException
(
"订单未支付!"
);
throw
new
ServiceException
(
"订单未支付!"
);
// fisherman 该接口的调用 肯定是因已经商户确认要退款的操作, 所以不走正常的 是否可退款判断
// fisherman 该接口的调用 肯定是因已经商户确认要退款的操作, 所以不走正常的 是否可退款判断
boolean
refundDeliveryFee
=
isRefundDeliveryFee
(
order
);
boolean
refundDeliveryFee
=
isRefundDeliveryFee
(
order
,
order
.
getActualPayAmount
().
longValue
()
);
// 未接单
// 未接单
if
(
NewOrderStatus
.
PLACE_AN_ORDER
.
getIndex
().
equals
(
order
.
getOrderState
()))
{
if
(
NewOrderStatus
.
PLACE_AN_ORDER
.
getIndex
().
equals
(
order
.
getOrderState
()))
{
// 未接单的 请用户直接操作C端小程序处理
// 未接单的 请用户直接操作C端小程序处理
...
@@ -207,7 +215,7 @@ public class RefundService {
...
@@ -207,7 +215,7 @@ public class RefundService {
if
(!
isCreateAfter
)
{
if
(!
isCreateAfter
)
{
// 没有已申请的售后单,创建售后单
// 没有已申请的售后单,创建售后单
createAfterSales
(
order
,
reqVo
.
getReason
(),
refundDeliveryFee
,
reqVo
.
getRefundMode
());
createAfterSales
(
order
,
null
,
reqVo
.
getReason
(),
reqVo
.
getReason
(),
refundDeliveryFee
,
reqVo
.
getRefundMode
());
}
}
// 调用oms的 同意退款操作
// 调用oms的 同意退款操作
OrderManagerRequest
request
=
new
OrderManagerRequest
();
OrderManagerRequest
request
=
new
OrderManagerRequest
();
...
@@ -223,7 +231,11 @@ public class RefundService {
...
@@ -223,7 +231,11 @@ public class RefundService {
/**
/**
* 是否退配送费判断
* 是否退配送费判断
*/
*/
private
boolean
isRefundDeliveryFee
(
OrderInfoReqs
order
)
{
private
boolean
isRefundDeliveryFee
(
OrderInfoReqs
order
,
Long
refundAmount
)
{
// 退款金额小于实付金额的情况,表示部分退不需要退配送费
if
(
refundAmount
<
order
.
getActualPayAmount
().
longValue
())
{
return
false
;
}
boolean
refundDeliveryFee
=
true
;
boolean
refundDeliveryFee
=
true
;
if
(
Objects
.
equals
(
BizTypeEnum
.
MALL
.
getBizType
(),
order
.
getBizType
())
if
(
Objects
.
equals
(
BizTypeEnum
.
MALL
.
getBizType
(),
order
.
getBizType
())
&&
StringUtils
.
isNotEmpty
(
order
.
getExtInfo
()))
{
&&
StringUtils
.
isNotEmpty
(
order
.
getExtInfo
()))
{
...
@@ -266,9 +278,8 @@ public class RefundService {
...
@@ -266,9 +278,8 @@ public class RefundService {
/**
/**
* 商家未接单,取消订单逻辑处理
* 商家未接单,取消订单逻辑处理
* 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
* 1.调用支付退款 2.根据支付退款返回状态组装订单取消参数,调用订单取消接口
*
*/
*/
private
void
refundOrder
(
OrderInfoReqs
order
,
String
reason
,
Boolean
isRefundDeliveryFee
,
Byte
refundMode
)
{
private
void
refundOrder
(
OrderInfoReqs
order
,
String
reason
,
String
remark
,
Boolean
isRefundDeliveryFee
,
Byte
refundMode
)
{
int
state
=
PayRefundStatus
.
SUCCESS
.
getCode
();
int
state
=
PayRefundStatus
.
SUCCESS
.
getCode
();
if
(
order
.
getActualPayAmount
().
longValue
()
>
0
)
{
if
(
order
.
getActualPayAmount
().
longValue
()
>
0
)
{
PayRefundResponse
refundResponse
=
paymentHandle
.
getCommonPayRefundResponse
(
order
,
reason
);
PayRefundResponse
refundResponse
=
paymentHandle
.
getCommonPayRefundResponse
(
order
,
reason
);
...
@@ -276,7 +287,7 @@ public class RefundService {
...
@@ -276,7 +287,7 @@ public class RefundService {
}
}
CancelOrderRequest
req
=
CancelOrderRequestAdapter
.
convert
(
order
,
UUID
.
randomUUID
().
toString
(),
CancelOrderRequest
req
=
CancelOrderRequestAdapter
.
convert
(
order
,
UUID
.
randomUUID
().
toString
(),
AfterSalesType
.
USER_CANCEL
,
reason
,
isRefundDeliveryFee
,
refundMode
);
AfterSalesType
.
USER_CANCEL
,
reason
,
remark
,
isRefundDeliveryFee
,
refundMode
);
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_4
.
getIndex
());
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_4
.
getIndex
());
if
(
Objects
.
equals
(
PayRefundStatus
.
SUCCESS
.
getCode
(),
state
))
{
if
(
Objects
.
equals
(
PayRefundStatus
.
SUCCESS
.
getCode
(),
state
))
{
//退款成功
//退款成功
...
@@ -304,27 +315,28 @@ public class RefundService {
...
@@ -304,27 +315,28 @@ public class RefundService {
/**
/**
* 创建售后单
* 创建售后单
*/
*/
private
void
createAfterSales
(
OrderInfoReqs
order
,
String
reason
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
private
void
createAfterSales
(
OrderInfoReqs
order
,
Long
refundAmount
,
String
reason
,
String
remark
,
Boolean
refundDeliveryFee
,
Byte
refundMode
)
{
AfterSalesType
type
=
NewOrderStatus
.
COMPLETE
.
getIndex
().
equals
(
order
.
getOrderState
())
AfterSalesType
type
=
NewOrderStatus
.
COMPLETE
.
getIndex
().
equals
(
order
.
getOrderState
())
?
AfterSalesType
.
USER_SALE_RETURN
:
AfterSalesType
.
USER_CANCEL
;
?
AfterSalesType
.
USER_SALE_RETURN
:
AfterSalesType
.
USER_CANCEL
;
CancelOrderRequest
req
=
CancelOrderRequestAdapter
.
convert
(
order
,
null
,
type
,
reason
,
refundDeliveryFee
,
refundMode
);
req
.
setRefundState
(
AfterSalesRefunStateEnum
.
STATE_1
.
getIndex
()
);
V2CancelOrderRequest
req
=
V2CancelOrderRequestAdapter
.
convert
(
order
,
refundAmount
,
type
,
reason
,
remark
,
refundDeliveryFee
,
refundMode
);
Base
OrderResponse
resp
=
orderCenterSdkService
.
orderCancel
(
req
);
Base
Response
<
Void
>
resp
=
orderServiceClient
.
refundOrder
(
req
);
if
(!
Objects
.
equals
(
resp
.
getErrcode
(),
100
))
{
if
(!
ResponseConstant
.
SUCCESS_RESPONSE_CODE_STR
.
equals
(
resp
.
getCode
()
))
{
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
.
getCode
(),
resp
.
get
Errmsg
());
throw
new
ServiceException
(
ResponseResult
.
ORDER__ERRORREFUND
.
getCode
(),
resp
.
get
Message
());
}
}
// 金额大于0的退款,发送到消息中心推送到pos
if
(
order
.
getActualPayAmount
().
longValue
()
>
0
)
{
if
(
order
.
getActualPayAmount
().
longValue
()
>
0
)
{
PushMessageNoticeDto
notify
=
MessageNoticeAdapter
.
convent2PushMessageNoticeDto
(
2
,
order
.
getPartnerId
(),
order
.
getStoreId
(),
PushMessageNoticeDto
notify
=
MessageNoticeAdapter
.
convent2PushMessageNoticeDto
(
2
,
order
.
getPartnerId
(),
order
.
getStoreId
(),
null
,
null
,
null
,
null
);
null
,
null
,
null
,
null
);
messageCenterClient
.
createMessage
(
notify
,
LogThreadLocal
.
getTrackingNo
());
messageCenterClient
.
createMessage
(
notify
,
LogThreadLocal
.
getTrackingNo
());
}
}
//通知小助手发送申请退款公众号订阅消息
//
通知小助手发送申请退款公众号订阅消息
sendApplyRefundSubscriptionNotice
(
order
,
reason
);
sendApplyRefundSubscriptionNotice
(
order
,
reason
);
//已接单可发起退款申请,查询门店有无云打印机,有则打印退款申请小票
//
已接单可发起退款申请,查询门店有无云打印机,有则打印退款申请小票
printApplyRefundSmallTicket
(
order
,
reason
);
printApplyRefundSmallTicket
(
order
,
reason
);
}
}
/**
/**
* 通知小助手发送申请退款公众号订阅消息
* 通知小助手发送申请退款公众号订阅消息
*/
*/
...
@@ -350,7 +362,6 @@ public class RefundService {
...
@@ -350,7 +362,6 @@ public class RefundService {
/**
/**
* 申请退款小票打印
* 申请退款小票打印
*
*/
*/
private
void
printApplyRefundSmallTicket
(
OrderInfoReqs
order
,
String
reason
)
{
private
void
printApplyRefundSmallTicket
(
OrderInfoReqs
order
,
String
reason
)
{
// 有云打印机 打印小票,杯贴
// 有云打印机 打印小票,杯贴
...
...
order-application-service/src/main/java/cn/freemud/service/thirdparty/OrderServiceClient.java
View file @
d2f97121
...
@@ -15,6 +15,7 @@ import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
...
@@ -15,6 +15,7 @@ import cn.freemud.entities.dto.pay.QueryInvoiceByCodesRequest;
import
cn.freemud.entities.vo.QueryInvoiceReq
;
import
cn.freemud.entities.vo.QueryInvoiceReq
;
import
cn.freemud.entities.vo.QueryRefundFailuresListReq
;
import
cn.freemud.entities.vo.QueryRefundFailuresListReq
;
import
cn.freemud.entities.vo.RefundFailuresSuccessfulReq
;
import
cn.freemud.entities.vo.RefundFailuresSuccessfulReq
;
import
com.freemud.sdk.api.assortment.order.request.order.V2CancelOrderRequest
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.cloud.openfeign.FeignClient
;
import
org.springframework.http.MediaType
;
import
org.springframework.http.MediaType
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.PostMapping
;
...
@@ -90,4 +91,8 @@ public interface OrderServiceClient {
...
@@ -90,4 +91,8 @@ public interface OrderServiceClient {
@PostMapping
(
value
=
"/order/config/queryByKeys"
)
@PostMapping
(
value
=
"/order/config/queryByKeys"
)
BaseResponse
<
List
<
QueryByKeysResp
>>
queryByKeys
(
@RequestBody
QueryByKeysReq
req
);
BaseResponse
<
List
<
QueryByKeysResp
>>
queryByKeys
(
@RequestBody
QueryByKeysReq
req
);
@LogIgnoreFeign
(
logMessage
=
"createInvoice"
)
@PostMapping
(
"/order/v2/cancelPortion"
)
BaseResponse
<
Void
>
refundOrder
(
@RequestBody
V2CancelOrderRequest
v2CancelOrderRequest
);
}
}
order-management/src/main/java/cn/freemud/management/service/handle/PaymentHandle.java
View file @
d2f97121
...
@@ -90,19 +90,20 @@ public class PaymentHandle {
...
@@ -90,19 +90,20 @@ public class PaymentHandle {
public
PayRefundResponse
getCommonPayRefundResponse
(
OrderManagerRequest
request
,
OrderBeanV1
orderBean
)
{
public
PayRefundResponse
getCommonPayRefundResponse
(
OrderManagerRequest
request
,
OrderBeanV1
orderBean
)
{
PayRefundResponse
refundResponse
;
PayRefundResponse
refundResponse
;
try
{
try
{
BigDecimal
refundAmount
=
getRefundAmount
(
orderBean
.
getCompanyId
(),
new
BigDecimal
(
orderBean
.
getAmount
()),
orderBean
.
getOid
());
if
(
null
!=
orderBean
.
getOrderPayItem
()
&&
orderBean
.
getOrderPayItem
().
size
()
>
0
)
{
if
(
null
!=
orderBean
.
getOrderPayItem
()
&&
orderBean
.
getOrderPayItem
().
size
()
>
0
)
{
// payment/application/refund
// payment/application/refund
refundResponse
=
this
.
multiRefund
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
getRefundAmount
(
orderBean
)
);
refundResponse
=
this
.
multiRefund
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
refundAmount
);
}
else
{
}
else
{
OrderExtendedReq
extended
=
orderBean
.
getOrderExtended
();
OrderExtendedReq
extended
=
orderBean
.
getOrderExtended
();
if
(
StringUtils
.
isNotBlank
(
extended
.
getAgentPayerId
())
&&
!
Objects
.
equals
(
extended
.
getAgentPayerId
(),
orderBean
.
getUserId
()))
{
if
(
StringUtils
.
isNotBlank
(
extended
.
getAgentPayerId
())
&&
!
Objects
.
equals
(
extended
.
getAgentPayerId
(),
orderBean
.
getUserId
()))
{
OrderExtInfoDto
ext
=
JSON
.
parseObject
(
orderBean
.
getExtInfo
(),
OrderExtInfoDto
.
class
);
OrderExtInfoDto
ext
=
JSON
.
parseObject
(
orderBean
.
getExtInfo
(),
OrderExtInfoDto
.
class
);
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
refundResponse
=
this
.
agentPayRefund
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
getRefundAmount
(
orderBean
)
,
ext
.
getPayTransId
());
refundResponse
=
this
.
agentPayRefund
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
refundAmount
,
ext
.
getPayTransId
());
}
else
{
}
else
{
//正常订单现金退款 paymentcenter/refund
//正常订单现金退款 paymentcenter/refund
PayRefundRequestDto
req
=
paymentSdkAdapter
.
getOrderRefundRequest
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
PayRefundRequestDto
req
=
paymentSdkAdapter
.
getOrderRefundRequest
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
getRefundAmount
(
orderBean
)
,
orderBean
.
getPayVoucher
(),
orderBean
.
getExtInfo
(),
request
.
getReason
());
orderBean
.
getOid
(),
refundAmount
,
orderBean
.
getPayVoucher
(),
orderBean
.
getExtInfo
(),
request
.
getReason
());
// 抖音订单,退款时需要传递商品信息
// 抖音订单,退款时需要传递商品信息
if
(
OrderClientType
.
TIKTOKPAY
.
getIndex
().
toString
().
equals
(
orderBean
.
getOrderClient
()))
{
if
(
OrderClientType
.
TIKTOKPAY
.
getIndex
().
toString
().
equals
(
orderBean
.
getOrderClient
()))
{
Map
<
String
,
String
>
extParam
=
new
HashMap
<>();
Map
<
String
,
String
>
extParam
=
new
HashMap
<>();
...
@@ -142,19 +143,20 @@ public class PaymentHandle {
...
@@ -142,19 +143,20 @@ public class PaymentHandle {
public
PayRefundResponse
getCommonPayRefundResponse
(
OrderInfoReqs
order
,
String
reason
)
{
public
PayRefundResponse
getCommonPayRefundResponse
(
OrderInfoReqs
order
,
String
reason
)
{
PayRefundResponse
refundResponse
;
PayRefundResponse
refundResponse
;
try
{
try
{
BigDecimal
refundAmount
=
getRefundAmount
(
order
.
getPartnerId
(),
order
.
getActualPayAmount
(),
order
.
getOrderCode
());
if
(
CollectionUtils
.
isNotEmpty
(
order
.
getOrderPayItemCreateReqList
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
order
.
getOrderPayItemCreateReqList
()))
{
// payment/application/refund
// payment/application/refund
refundResponse
=
this
.
multiRefund
(
order
.
getPartnerId
(),
order
.
getStoreId
(),
order
.
getOrderCode
(),
order
.
getActualPayAmount
()
);
refundResponse
=
this
.
multiRefund
(
order
.
getPartnerId
(),
order
.
getStoreId
(),
order
.
getOrderCode
(),
refundAmount
);
}
else
{
}
else
{
OrderExtendedReq
extended
=
order
.
getOrderExtended
();
OrderExtendedReq
extended
=
order
.
getOrderExtended
();
if
(
StringUtils
.
isNotBlank
(
extended
.
getAgentPayerId
())
&&
!
Objects
.
equals
(
extended
.
getAgentPayerId
(),
order
.
getUserId
()))
{
if
(
StringUtils
.
isNotBlank
(
extended
.
getAgentPayerId
())
&&
!
Objects
.
equals
(
extended
.
getAgentPayerId
(),
order
.
getUserId
()))
{
OrderExtInfoDto
ext
=
JSON
.
parseObject
(
order
.
getExtInfo
(),
OrderExtInfoDto
.
class
);
OrderExtInfoDto
ext
=
JSON
.
parseObject
(
order
.
getExtInfo
(),
OrderExtInfoDto
.
class
);
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
//代付人信息不为空 并且和订单创建人不一样,表示代付单 payment/application/agentRefund
refundResponse
=
this
.
agentPayRefund
(
order
.
getPartnerId
(),
order
.
getStoreId
(),
order
.
getOrderCode
(),
order
.
getActualPayAmount
()
,
ext
.
getPayTransId
());
refundResponse
=
this
.
agentPayRefund
(
order
.
getPartnerId
(),
order
.
getStoreId
(),
order
.
getOrderCode
(),
refundAmount
,
ext
.
getPayTransId
());
}
else
{
}
else
{
//正常订单现金退款 paymentcenter/refund
//正常订单现金退款 paymentcenter/refund
PayRefundRequestDto
req
=
paymentSdkAdapter
.
getOrderRefundRequest
(
order
.
getPartnerId
(),
order
.
getStoreId
(),
PayRefundRequestDto
req
=
paymentSdkAdapter
.
getOrderRefundRequest
(
order
.
getPartnerId
(),
order
.
getStoreId
(),
order
.
getOrderCode
(),
order
.
getActualPayAmount
()
,
order
.
getPayRequestNo
(),
order
.
getExtInfo
(),
reason
);
order
.
getOrderCode
(),
refundAmount
,
order
.
getPayRequestNo
(),
order
.
getExtInfo
(),
reason
);
// 抖音订单,退款时需要传递商品信息
// 抖音订单,退款时需要传递商品信息
if
(
OrderClientType
.
TIKTOKPAY
.
getIndex
().
equals
(
order
.
getOrderClient
()))
{
if
(
OrderClientType
.
TIKTOKPAY
.
getIndex
().
equals
(
order
.
getOrderClient
()))
{
Map
<
String
,
String
>
extParam
=
new
HashMap
<>();
Map
<
String
,
String
>
extParam
=
new
HashMap
<>();
...
@@ -355,8 +357,9 @@ public class PaymentHandle {
...
@@ -355,8 +357,9 @@ public class PaymentHandle {
public
PayRefundResponse
refund
(
String
reason
,
OrderBeanV1
orderBean
)
{
public
PayRefundResponse
refund
(
String
reason
,
OrderBeanV1
orderBean
)
{
PayRefundStatus
refundStatus
=
PayRefundStatus
.
SUCCESS
;
PayRefundStatus
refundStatus
=
PayRefundStatus
.
SUCCESS
;
BigDecimal
refundAmount
=
getRefundAmount
(
orderBean
.
getCompanyId
(),
new
BigDecimal
(
orderBean
.
getAmount
()),
orderBean
.
getOid
());
PayRefundRequestDto
orderRefundRequest
=
paymentSdkAdapter
PayRefundRequestDto
orderRefundRequest
=
paymentSdkAdapter
.
getOrderRefundRequest
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
getRefundAmount
(
orderBean
)
,
orderBean
.
getPayVoucher
(),
orderBean
.
getExtInfo
(),
reason
);
.
getOrderRefundRequest
(
orderBean
.
getCompanyId
(),
orderBean
.
getShopId
(),
orderBean
.
getOid
(),
refundAmount
,
orderBean
.
getPayVoucher
(),
orderBean
.
getExtInfo
(),
reason
);
if
(
ObjectUtils
.
equals
(
orderBean
.
getAmount
(),
0L
))
{
if
(
ObjectUtils
.
equals
(
orderBean
.
getAmount
(),
0L
))
{
return
handlePayRefundResponse
(
refundStatus
,
orderRefundRequest
.
getRefundId
());
return
handlePayRefundResponse
(
refundStatus
,
orderRefundRequest
.
getRefundId
());
}
}
...
@@ -413,12 +416,13 @@ public class PaymentHandle {
...
@@ -413,12 +416,13 @@ public class PaymentHandle {
/**
/**
* 获取退款金额
* 获取退款金额
*
*
* @param data
* @param partnerId 商户号
* @return
* @param refundAmount 总金额
* @param orderId 订单号
* @return 退款金额
*/
*/
private
BigDecimal
getRefundAmount
(
OrderBeanV1
data
)
{
private
BigDecimal
getRefundAmount
(
String
partnerId
,
BigDecimal
refundAmount
,
String
orderId
)
{
BigDecimal
refundAmount
=
new
BigDecimal
(
data
.
getAmount
());
OrderBaseResp
<
List
<
AfterSalesOrderResp
>>
listBaseResponse
=
orderSdkService
.
queryAfterSaleByOrderCode
(
partnerId
,
orderId
);
OrderBaseResp
<
List
<
AfterSalesOrderResp
>>
listBaseResponse
=
orderSdkService
.
queryAfterSaleByOrderCode
(
data
.
getCompanyId
(),
data
.
getOid
());
if
(
CollectionUtils
.
isNotEmpty
(
listBaseResponse
.
getResult
()))
{
if
(
CollectionUtils
.
isNotEmpty
(
listBaseResponse
.
getResult
()))
{
refundAmount
=
new
BigDecimal
(
listBaseResponse
.
getResult
().
get
(
0
).
getActualAmount
());
refundAmount
=
new
BigDecimal
(
listBaseResponse
.
getResult
().
get
(
0
).
getActualAmount
());
}
}
...
...
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