Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
jinli gu
Jeepay
Commits
121598e1
Commit
121598e1
authored
Jan 25, 2022
by
terrfly
Browse files
订单分账MQ支持重新发起分账接口;
parent
4ba0a56c
Changes
6
Hide whitespace changes
Inline
Side-by-side
jeepay-components/jeepay-components-mq/src/main/java/com/jeequan/jeepay/components/mq/model/PayOrderDivisionMQ.java
View file @
121598e1
...
@@ -64,6 +64,9 @@ public class PayOrderDivisionMQ extends AbstractMQ {
...
@@ -64,6 +64,9 @@ public class PayOrderDivisionMQ extends AbstractMQ {
* **/
* **/
private
List
<
CustomerDivisionReceiver
>
receiverList
;
private
List
<
CustomerDivisionReceiver
>
receiverList
;
/** 是否重新发送 ( 如分账失败,重新请求分账接口 ) , 空表示false **/
private
Boolean
isResend
;
}
}
@Override
@Override
...
@@ -84,7 +87,12 @@ public class PayOrderDivisionMQ extends AbstractMQ {
...
@@ -84,7 +87,12 @@ public class PayOrderDivisionMQ extends AbstractMQ {
/** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/
/** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/
public
static
PayOrderDivisionMQ
build
(
String
payOrderId
,
Byte
useSysAutoDivisionReceivers
,
List
<
CustomerDivisionReceiver
>
receiverList
){
public
static
PayOrderDivisionMQ
build
(
String
payOrderId
,
Byte
useSysAutoDivisionReceivers
,
List
<
CustomerDivisionReceiver
>
receiverList
){
return
new
PayOrderDivisionMQ
(
new
MsgPayload
(
payOrderId
,
useSysAutoDivisionReceivers
,
receiverList
));
return
new
PayOrderDivisionMQ
(
new
MsgPayload
(
payOrderId
,
useSysAutoDivisionReceivers
,
receiverList
,
false
));
}
/** 【!重要配置项!】 构造MQModel , 一般用于发送MQ时 **/
public
static
PayOrderDivisionMQ
build
(
String
payOrderId
,
Byte
useSysAutoDivisionReceivers
,
List
<
CustomerDivisionReceiver
>
receiverList
,
Boolean
isResend
){
return
new
PayOrderDivisionMQ
(
new
MsgPayload
(
payOrderId
,
useSysAutoDivisionReceivers
,
receiverList
,
isResend
));
}
}
/** 解析MQ消息, 一般用于接收MQ消息时 **/
/** 解析MQ消息, 一般用于接收MQ消息时 **/
...
...
jeepay-merchant/src/main/java/com/jeequan/jeepay/mch/ctrl/division/PayOrderDivisionRecordController.java
View file @
121598e1
...
@@ -18,6 +18,8 @@ package com.jeequan.jeepay.mch.ctrl.division;
...
@@ -18,6 +18,8 @@ package com.jeequan.jeepay.mch.ctrl.division;
import
com.alibaba.fastjson.JSONObject
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.jeequan.jeepay.components.mq.model.PayOrderDivisionMQ
;
import
com.jeequan.jeepay.components.mq.vender.IMQSender
;
import
com.jeequan.jeepay.core.constants.ApiCodeEnum
;
import
com.jeequan.jeepay.core.constants.ApiCodeEnum
;
import
com.jeequan.jeepay.core.entity.PayOrder
;
import
com.jeequan.jeepay.core.entity.PayOrder
;
import
com.jeequan.jeepay.core.entity.PayOrderDivisionRecord
;
import
com.jeequan.jeepay.core.entity.PayOrderDivisionRecord
;
...
@@ -45,6 +47,7 @@ import org.springframework.web.bind.annotation.RestController;
...
@@ -45,6 +47,7 @@ import org.springframework.web.bind.annotation.RestController;
public
class
PayOrderDivisionRecordController
extends
CommonCtrl
{
public
class
PayOrderDivisionRecordController
extends
CommonCtrl
{
@Autowired
private
PayOrderDivisionRecordService
payOrderDivisionRecordService
;
@Autowired
private
PayOrderDivisionRecordService
payOrderDivisionRecordService
;
@Autowired
private
IMQSender
mqSender
;
/** list */
/** list */
...
@@ -112,4 +115,32 @@ public class PayOrderDivisionRecordController extends CommonCtrl {
...
@@ -112,4 +115,32 @@ public class PayOrderDivisionRecordController extends CommonCtrl {
return
ApiRes
.
ok
(
record
);
return
ApiRes
.
ok
(
record
);
}
}
/** 分账接口重试 */
@PreAuthorize
(
"hasAuthority( 'ENT_DIVISION_RECORD_RESEND' )"
)
@RequestMapping
(
value
=
"/resend/{recordId}"
,
method
=
RequestMethod
.
POST
)
public
ApiRes
resend
(
@PathVariable
(
"recordId"
)
Long
recordId
)
{
PayOrderDivisionRecord
record
=
payOrderDivisionRecordService
.
getOne
(
PayOrderDivisionRecord
.
gw
()
.
eq
(
PayOrderDivisionRecord:
:
getMchNo
,
getCurrentMchNo
())
.
eq
(
PayOrderDivisionRecord:
:
getRecordId
,
recordId
));
if
(
record
==
null
)
{
throw
new
BizException
(
ApiCodeEnum
.
SYS_OPERATION_FAIL_SELETE
);
}
if
(
record
.
getState
()
!=
PayOrderDivisionRecord
.
STATE_FAIL
){
throw
new
BizException
(
"请选择失败的分账记录"
);
}
// 更新订单状态 & 记录状态
payOrderDivisionRecordService
.
updateResendState
(
record
.
getPayOrderId
());
// 重发到MQ
mqSender
.
send
(
PayOrderDivisionMQ
.
build
(
record
.
getPayOrderId
(),
null
,
null
,
true
));
return
ApiRes
.
ok
(
record
);
}
}
}
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/ctrl/division/PayOrderDivisionExecController.java
View file @
121598e1
...
@@ -102,7 +102,7 @@ public class PayOrderDivisionExecController extends ApiController {
...
@@ -102,7 +102,7 @@ public class PayOrderDivisionExecController extends ApiController {
}
}
//处理分账请求
//处理分账请求
ChannelRetMsg
channelRetMsg
=
payOrderDivisionProcessService
.
processPayOrderDivision
(
bizRQ
.
getPayOrderId
(),
bizRQ
.
getUseSysAutoDivisionReceivers
(),
receiverList
);
ChannelRetMsg
channelRetMsg
=
payOrderDivisionProcessService
.
processPayOrderDivision
(
bizRQ
.
getPayOrderId
(),
bizRQ
.
getUseSysAutoDivisionReceivers
(),
receiverList
,
false
);
PayOrderDivisionExecRS
bizRS
=
new
PayOrderDivisionExecRS
();
PayOrderDivisionExecRS
bizRS
=
new
PayOrderDivisionExecRS
();
bizRS
.
setState
(
channelRetMsg
.
getChannelState
()
==
ChannelRetMsg
.
ChannelState
.
CONFIRM_SUCCESS
?
PayOrderDivisionRecord
.
STATE_SUCCESS
:
PayOrderDivisionRecord
.
STATE_FAIL
);
bizRS
.
setState
(
channelRetMsg
.
getChannelState
()
==
ChannelRetMsg
.
ChannelState
.
CONFIRM_SUCCESS
?
PayOrderDivisionRecord
.
STATE_SUCCESS
:
PayOrderDivisionRecord
.
STATE_FAIL
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/mq/PayOrderDivisionMQReceiver.java
View file @
121598e1
...
@@ -39,7 +39,7 @@ public class PayOrderDivisionMQReceiver implements PayOrderDivisionMQ.IMQReceive
...
@@ -39,7 +39,7 @@ public class PayOrderDivisionMQReceiver implements PayOrderDivisionMQ.IMQReceive
try
{
try
{
log
.
info
(
"接收订单分账通知MQ, msg={}"
,
payload
.
toString
());
log
.
info
(
"接收订单分账通知MQ, msg={}"
,
payload
.
toString
());
payOrderDivisionProcessService
.
processPayOrderDivision
(
payload
.
getPayOrderId
(),
payload
.
getUseSysAutoDivisionReceivers
(),
payload
.
getReceiverList
());
payOrderDivisionProcessService
.
processPayOrderDivision
(
payload
.
getPayOrderId
(),
payload
.
getUseSysAutoDivisionReceivers
(),
payload
.
getReceiverList
()
,
payload
.
getIsResend
()
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
log
.
error
(
e
.
getMessage
(),
e
);
...
...
jeepay-payment/src/main/java/com/jeequan/jeepay/pay/service/PayOrderDivisionProcessService.java
View file @
121598e1
...
@@ -72,7 +72,13 @@ public class PayOrderDivisionProcessService {
...
@@ -72,7 +72,13 @@ public class PayOrderDivisionProcessService {
* @site https://www.jeequan.com
* @site https://www.jeequan.com
* @date 2021/8/27 9:44
* @date 2021/8/27 9:44
*/
*/
public
ChannelRetMsg
processPayOrderDivision
(
String
payOrderId
,
Byte
useSysAutoDivisionReceivers
,
List
<
PayOrderDivisionMQ
.
CustomerDivisionReceiver
>
receiverList
)
{
public
ChannelRetMsg
processPayOrderDivision
(
String
payOrderId
,
Byte
useSysAutoDivisionReceivers
,
List
<
PayOrderDivisionMQ
.
CustomerDivisionReceiver
>
receiverList
,
Boolean
isResend
)
{
// 是否重发分账接口( 当分账失败, 列表允许再次发送请求 )
if
(
isResend
==
null
){
isResend
=
false
;
}
String
logPrefix
=
"订单["
+
payOrderId
+
"]执行分账"
;
String
logPrefix
=
"订单["
+
payOrderId
+
"]执行分账"
;
...
@@ -104,39 +110,50 @@ public class PayOrderDivisionProcessService {
...
@@ -104,39 +110,50 @@ public class PayOrderDivisionProcessService {
throw
new
BizException
(
"更新支付订单为分账处理中异常"
);
throw
new
BizException
(
"更新支付订单为分账处理中异常"
);
}
}
// 查询&过滤 所有的分账接收对象
List
<
MchDivisionReceiver
>
allReceiver
=
this
.
queryReceiver
(
useSysAutoDivisionReceivers
,
payOrder
,
receiverList
);
//得到全部分账比例 (所有待分账账号的分账比例总和)
// 所有的分账列表
BigDecimal
allDivisionProfit
=
BigDecimal
.
ZERO
;
List
<
PayOrderDivisionRecord
>
recordList
=
null
;
for
(
MchDivisionReceiver
receiver
:
allReceiver
)
{
allDivisionProfit
=
allDivisionProfit
.
add
(
receiver
.
getDivisionProfit
());
}
//计算分账金额 = 商家实际入账金额
// 重发通知,可直接查库
Long
payOrderDivisionAmount
=
payOrderService
.
calMchIncomeAmount
(
payOrder
);
if
(
isResend
){
recordList
=
payOrderDivisionRecordService
.
list
(
PayOrderDivisionRecord
.
gw
().
eq
(
PayOrderDivisionRecord:
:
getPayOrderId
,
payOrderId
));
}
else
{
//剩余待分账金额 (用作最后一个分账账号的 计算, 避免出现分账金额超出最大) [结果向下取整 , 避免出现金额溢出的情况。 ]
// 查询&过滤 所有的分账接收对象
Long
subDivisionAmount
=
AmountUtil
.
calPercentageFee
(
payOrderDivisionAmount
,
allDivisionProfit
,
BigDecimal
.
ROUND_FLOOR
);
List
<
MchDivisionReceiver
>
allReceiver
=
this
.
queryReceiver
(
useSysAutoDivisionReceivers
,
payOrder
,
receiverList
);
List
<
PayOrderDivisionRecord
>
recordList
=
new
ArrayList
<>();
//得到全部分账比例 (所有待分账账号的分账比例总和)
BigDecimal
allDivisionProfit
=
BigDecimal
.
ZERO
;
for
(
MchDivisionReceiver
receiver
:
allReceiver
)
{
allDivisionProfit
=
allDivisionProfit
.
add
(
receiver
.
getDivisionProfit
());
}
//计算订单分账金额, 并插入到记录表
//计算分账金额 = 商家实际入账金额
Long
payOrderDivisionAmount
=
payOrderService
.
calMchIncomeAmount
(
payOrder
);
String
batchOrderId
=
SeqKit
.
genDivisionBatchId
();
//剩余待分账金额 (用作最后一个分账账号的 计算, 避免出现分账金额超出最大) [结果向下取整 , 避免出现金额溢出的情况。 ]
Long
subDivisionAmount
=
AmountUtil
.
calPercentageFee
(
payOrderDivisionAmount
,
allDivisionProfit
,
BigDecimal
.
ROUND_FLOOR
);
for
(
MchDivisionReceiver
receiver
:
allReceiver
)
{
recordList
=
new
ArrayList
<>();
PayOrderDivisionRecord
record
=
genRecord
(
batchOrderId
,
payOrder
,
receiver
,
payOrderDivisionAmount
,
subDivisionAmount
);
//计算订单分账金额, 并插入到记录表
//剩余金额
String
batchOrderId
=
SeqKit
.
genDivisionBatchId
();
subDivisionAmount
=
subDivisionAmount
-
record
.
getCalDivisionAmount
();
//入库保存
for
(
MchDivisionReceiver
receiver
:
allReceiver
)
{
payOrderDivisionRecordService
.
save
(
record
);
recordList
.
add
(
record
);
PayOrderDivisionRecord
record
=
genRecord
(
batchOrderId
,
payOrder
,
receiver
,
payOrderDivisionAmount
,
subDivisionAmount
);
//剩余金额
subDivisionAmount
=
subDivisionAmount
-
record
.
getCalDivisionAmount
();
//入库保存
payOrderDivisionRecordService
.
save
(
record
);
recordList
.
add
(
record
);
}
}
}
ChannelRetMsg
channelRetMsg
=
null
;
ChannelRetMsg
channelRetMsg
=
null
;
try
{
try
{
...
...
jeepay-service/src/main/java/com/jeequan/jeepay/service/impl/PayOrderDivisionRecordService.java
View file @
121598e1
package
com.jeequan.jeepay.service.impl
;
package
com.jeequan.jeepay.service.impl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.jeequan.jeepay.core.entity.PayOrder
;
import
com.jeequan.jeepay.core.entity.PayOrderDivisionRecord
;
import
com.jeequan.jeepay.core.entity.PayOrderDivisionRecord
;
import
com.jeequan.jeepay.core.exception.BizException
;
import
com.jeequan.jeepay.service.mapper.PayOrderDivisionRecordMapper
;
import
com.jeequan.jeepay.service.mapper.PayOrderDivisionRecordMapper
;
import
com.jeequan.jeepay.service.mapper.PayOrderMapper
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
...
@@ -19,6 +24,8 @@ import java.util.List;
...
@@ -19,6 +24,8 @@ import java.util.List;
@Service
@Service
public
class
PayOrderDivisionRecordService
extends
ServiceImpl
<
PayOrderDivisionRecordMapper
,
PayOrderDivisionRecord
>
{
public
class
PayOrderDivisionRecordService
extends
ServiceImpl
<
PayOrderDivisionRecordMapper
,
PayOrderDivisionRecord
>
{
@Autowired
private
PayOrderMapper
payOrderMapper
;
/** 更新分账记录为分账成功**/
/** 更新分账记录为分账成功**/
public
void
updateRecordSuccessOrFail
(
List
<
PayOrderDivisionRecord
>
records
,
Byte
state
,
String
channelBatchOrderId
,
String
channelRespResult
){
public
void
updateRecordSuccessOrFail
(
List
<
PayOrderDivisionRecord
>
records
,
Byte
state
,
String
channelBatchOrderId
,
String
channelRespResult
){
...
@@ -38,8 +45,32 @@ public class PayOrderDivisionRecordService extends ServiceImpl<PayOrderDivisionR
...
@@ -38,8 +45,32 @@ public class PayOrderDivisionRecordService extends ServiceImpl<PayOrderDivisionR
}
}
/** 更新分账订单为: 等待分账中的状态 **/
@Transactional
public
void
updateResendState
(
String
payOrderId
){
PayOrder
updateRecord
=
new
PayOrder
();
updateRecord
.
setDivisionState
(
PayOrder
.
DIVISION_STATE_WAIT_TASK
);
// 更新订单
int
payOrderUpdateRow
=
payOrderMapper
.
update
(
updateRecord
,
PayOrder
.
gw
().
eq
(
PayOrder:
:
getPayOrderId
,
payOrderId
).
eq
(
PayOrder:
:
getDivisionState
,
PayOrder
.
DIVISION_STATE_FINISH
));
if
(
payOrderUpdateRow
<=
0
){
throw
new
BizException
(
"更新订单分账状态失败"
);
}
PayOrderDivisionRecord
updateRecordByDiv
=
new
PayOrderDivisionRecord
();
updateRecordByDiv
.
setState
(
PayOrderDivisionRecord
.
STATE_WAIT
);
//待分账
updateRecordByDiv
.
setChannelRespResult
(
""
);
updateRecordByDiv
.
setChannelBatchOrderId
(
""
);
boolean
recordUpdateFlag
=
update
(
updateRecordByDiv
,
PayOrderDivisionRecord
.
gw
().
eq
(
PayOrderDivisionRecord:
:
getPayOrderId
,
payOrderId
).
eq
(
PayOrderDivisionRecord:
:
getState
,
PayOrderDivisionRecord
.
STATE_FAIL
)
);
if
(!
recordUpdateFlag
){
throw
new
BizException
(
"更新分账记录状态失败"
);
}
}
}
}
Write
Preview
Supports
Markdown
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