@@ -12,12 +12,11 @@ import com.google.common.collect.Sets;
import com.huifu.adapay.core.exception.BaseAdaPayException ;
import com.huifu.adapay.model.Payment ;
import com.huifu.adapay.model.PaymentConfirm ;
import com.huifu.adapay.model.PaymentReverse ;
import com.huifu.adapay.model.Refund ;
import com.jsowell.adapay.common.CreateAdaPaymentParam ;
import com.jsowell.adapay.common.DivMember ;
import com.jsowell.adapay.response.BalancePaymentResponse ;
import com.jsowell.adapay.response.PaymentConfirmResponse ;
import com.jsowell.adapay.response.PaymentReverseResponse ;
import com.jsowell.adapay.service.AdapayMemberService ;
import com.jsowell.adapay.vo.OrderSettleResult ;
import com.jsowell.common.constant.CacheConstants ;
@@ -170,6 +169,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
@Autowired
private AdapayMemberService adapayMemberService ;
@Autowired
private MemberAdapayRecordService memberAdapayRecordService ;
/**
* 条件查询订单基本信息
*
@@ -184,6 +186,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 查询订单列表
* 带权限过滤
*
* @param dto 订单
* @return 订单
*/
@@ -203,6 +206,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 查询订单列表
* 无权限过滤
*
* @param dto 订单
* @return 订单
*/
@@ -472,6 +476,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 关闭启动失败订单
*
* @param startTime
* @param endTime
*/
@@ -614,6 +619,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 通过交易流水号查询订单信息
*
* @param transactionCode 交易流水号
* @return 订单信息
*/
@@ -677,6 +683,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
public void settleOrder ( TransactionRecordsData data , OrderBasicInfo orderBasicInfo ) {
logger . info ( " 结算订单start data:{}, orderBasicInfo:{} " , data . toString ( ) , orderBasicInfo . toString ( ) ) ;
String orderCode = orderBasicInfo . getOrderCode ( ) ;
String memberId = orderBasicInfo . getMemberId ( ) ;
// 判断订单状态
if ( StringUtils . equals ( orderBasicInfo . getOrderStatus ( ) , OrderStatusEnum . ORDER_COMPLETE . getValue ( ) ) ) {
@@ -714,9 +721,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
}
// 查询订单详情 修改订单数据
OrderDetail orderDetail = getOrderDetailByOrderCode ( orderCode ) ;
// 把交易记录中的用电量,金额等信息 更新到orderBasicInfo和orderDetail
orderBasicInfo . setVirtualAmount ( virtualAmount ) ; // 虚拟金额
orderBasicInfo . setSettleAmount ( orderAmount . subtract ( virtualAmount ) ) ; // 结算金额
@@ -725,7 +729,8 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
orderBasicInfo . setSettlementTime ( DateUtils . getNowDate ( ) ) ; // 结算时间
orderBasicInfo . setRefundAmount ( residue ) ; // 结算退款金额
// 更新订单详情
// 更新订单详情 查询订单详情 修改订单数据
OrderDetail orderDetail = getOrderDetailByOrderCode ( orderCode ) ;
try {
// 总电费金额
BigDecimal totalElectricityAmount = BigDecimal . ZERO ;
@@ -808,28 +813,14 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
transactionService . doUpdateOrder ( dto ) ;
logger . info ( " 结算订单end:{} OrderTransactionDTO:{} " , orderCode , JSONObject . toJSONString ( dto ) ) ;
try {
// 将卡/vin状态解锁
if ( ! StringUtils . equals ( " 0000000000000000 " , data . getLogicCard ( ) ) ) {
// 根据物理卡号查出当前为锁定状态的卡
PileAuthCard cardInfo = pileAuthCardService . selectSomeStatusCardInfo ( CardStatusEnum . START_LOCK . getCode ( ) , orderBasicInfo . getLogicCard ( ) ) ;
if ( cardInfo ! = null ) {
// orderBasicInfo.setMemberId(cardInfo.getMemberId());
// 将此卡状态改为正常
cardInfo . setStatus ( CardStatusEnum . NORMAL . getCode ( ) ) ;
pileAuthCardService . updatePileAuthCard ( cardInfo ) ;
}
}
// 如果是vin启动, 将启动锁定状态改为正常
if ( StringUtils . equals ( data . getTransactionIdentifier ( ) , " 05 " ) ) {
MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService . getMemberPlateInfoByVinCode ( data . getVinCode ( ) ) ;
if ( plateInfo ! = null & & ( StringUtils . equals ( plateInfo . getVinStatus ( ) , " 2 " ) ) ) {
plateInfo . setVinStatus ( " 1 " ) ;
memberPlateNumberRelationService . updateMemberPlateNumberRelation ( plateInfo ) ;
}
}
} catch ( Exception e ) {
logger . error ( " 解锁卡/vin状态 error, " , e ) ;
// 将卡/vin状态解锁
if ( ! StringUtils . equals ( " 0000000000000000 " , data . getLogicCard ( ) ) ) {
cardStatusUnlocked ( orderBasicInfo . getLogicCard ( ) ) ;
}
// 如果是vin启动, 将启动锁定状态改为正常
if ( StringUtils . equals ( data . getTransactionIdentifier ( ) , " 05 " ) ) {
vinStatusUnlocked ( data . getVinCode ( ) ) ;
}
// 发送停止充电订阅消息
@@ -839,13 +830,50 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
realTimeMonitorDataRedis2DB ( orderBasicInfo . getTransactionCode ( ) , orderCode ) ;
}
/**
* 卡状态解锁
*/
private void cardStatusUnlocked ( String logicCard ) {
try {
// 根据物理卡号查出当前为锁定状态的卡
PileAuthCard cardInfo = pileAuthCardService . selectSomeStatusCardInfo ( CardStatusEnum . START_LOCK . getCode ( ) , logicCard ) ;
if ( cardInfo ! = null ) {
// 将此卡状态改为正常
cardInfo . setStatus ( CardStatusEnum . NORMAL . getCode ( ) ) ;
pileAuthCardService . updatePileAuthCard ( cardInfo ) ;
}
} catch ( Exception e ) {
logger . error ( " 解锁卡状态 error, " , e ) ;
}
}
/**
* 解锁vin状态
*
* @param vinCode
*/
private void vinStatusUnlocked ( String vinCode ) {
try {
MemberPlateNumberRelation plateInfo = memberPlateNumberRelationService . getMemberPlateInfoByVinCode ( vinCode ) ;
if ( plateInfo ! = null & & ( StringUtils . equals ( plateInfo . getVinStatus ( ) , " 2 " ) ) ) {
plateInfo . setVinStatus ( " 1 " ) ;
memberPlateNumberRelationService . updateMemberPlateNumberRelation ( plateInfo ) ;
}
} catch ( Exception e ) {
logger . error ( " 解锁vin状态 error, " , e ) ;
}
}
/**
* 订单退款逻辑
*
* @param orderBasicInfo 订单信息
* @param residue 需退款金额
* @param residue 需退款金额
*/
private void refundOrder ( OrderBasicInfo orderBasicInfo , BigDecimal residue ) {
// 订单编号
String orderCode = orderBasicInfo . getOrderCode ( ) ;
// 订单消费金额
BigDecimal orderAmount = orderBasicInfo . getOrderAmount ( ) ;
// 查支付记录
List < OrderPayRecord > payRecordList = orderPayRecordService . getOrderPayRecordList ( orderCode ) ;
@@ -984,10 +1012,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 执行分账
for ( OrderBasicInfo orderBasicInfo : orderBasicInfos ) {
try {
OrderSettleResult orderSettleResult = null ;
OrderSettleResult orderSettleResult ;
if ( OrderPayModeEnum . PAYMENT_OF_BALANCE . getValue ( ) . equals ( orderBasicInfo . getPayMode ( ) ) ) {
// 余额支付的订单 只用余额支付转账
orderSettleResult = doBalancePayment( orderBasicInfo, adapayMemberAccount) ;
// 余额支付的订单
// orderSettleResult = doBalancePayment( orderBasicInfo, adapayMemberAccount) ;
orderSettleResult = doBalancePaymentV2 ( orderBasicInfo , adapayMemberAccount ) ;
} else {
// 在线支付,进行支付确认分账
orderSettleResult = doPaymentConfirm ( orderBasicInfo , adapayMemberAccount ) ;
@@ -1109,6 +1138,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 余额支付订单,使用余额支付转账
*
* @param orderBasicInfo
* @param adapayMemberAccount
* @return
@@ -1133,15 +1163,109 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
result . setConfirm_amt ( balancePaymentRequest . getTrans_amt ( ) ) ;
result . setStatus ( balancePaymentRequest . getStatus ( ) ) ;
result . setFee_amt ( feeAmount . toString ( ) ) ;
JSONObject jsonObject = new JSONObject( ) ;
jsonObject. put ( " orderCode " , orderCode) ;
result. setDescription( jsonObject. toJSONString( ) ) ;
// JSONObject jsonObject = new JSONObject() ;
// jsonObject.put("orderCode", orderCode) ;
// result. setDescription( jsonObject. toJSONString()) ;
return result ;
}
/**
* 余额支付订单,使用余额支付转账
*
* @param orderBasicInfo
* @param adapayMemberAccount
* @return
*/
public OrderSettleResult doBalancePaymentV2 ( OrderBasicInfo orderBasicInfo , AdapayMemberAccount adapayMemberAccount ) throws BaseAdaPayException {
BigDecimal settleAmount = orderBasicInfo . getSettleAmount ( ) ;
String orderCode = orderBasicInfo . getOrderCode ( ) ;
BigDecimal confirmAmt = BigDecimal . ZERO ;
BigDecimal feeAmt = BigDecimal . ZERO ;
String status = null ;
String description = null ;
// 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况
List < BalanceDeductionAmountVO > list = calculateTheBalanceDeductionAmount ( orderBasicInfo . getMemberId ( ) , settleAmount ) ;
for ( BalanceDeductionAmountVO vo : list ) {
String paymentId = vo . getPaymentId ( ) ;
BigDecimal deductionAmount = vo . getDeductionAmount ( ) ;
// 调汇付的分账接口 确认交易
PaymentConfirmResponse paymentConfirmResponse = adapayMemberService . createPaymentConfirmRequest ( paymentId , adapayMemberAccount , deductionAmount , orderCode ) ;
if ( paymentConfirmResponse ! = null ) {
confirmAmt = confirmAmt . add ( new BigDecimal ( paymentConfirmResponse . getConfirmed_amt ( ) ) ) ;
feeAmt = feeAmt . add ( new BigDecimal ( paymentConfirmResponse . getFee_amt ( ) ) ) ;
status = paymentConfirmResponse . getStatus ( ) ;
description = paymentConfirmResponse . getDescription ( ) ;
}
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService . selectByPaymentId ( paymentId ) ;
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
record . setSpendAmt ( record . getSpendAmt ( ) . add ( deductionAmount ) ) ;
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record . setBalanceAmt ( record . getPayAmt ( ) . subtract ( record . getRefundAmt ( ) ) . subtract ( record . getSpendAmt ( ) ) ) ;
memberAdapayRecordService . updateByPrimaryKeySelective ( record ) ;
}
// 分账接口返回的信息
OrderSettleResult result = new OrderSettleResult ( ) ;
result . setConfirm_amt ( confirmAmt . toString ( ) ) ;
result . setStatus ( status ) ;
result . setFee_amt ( feeAmt . toString ( ) ) ;
// result.setDescription(description);
return result ;
}
/**
* 计算余额扣除金额
* @param memberId 会员id
* @param amount 消费金额/退款金额
*/
@Override
public List < BalanceDeductionAmountVO > calculateTheBalanceDeductionAmount ( String memberId , BigDecimal amount ) {
List < BalanceDeductionAmountVO > resultList = Lists . newArrayList ( ) ;
// 查询会员的余额充值记录 按照充值时间正序
List < MemberAdapayRecord > memberAdapayRecords = memberAdapayRecordService . selectAvailableBalance ( memberId ) ;
// 定义一个临时金额等于消费金额
BigDecimal tempAmount = new BigDecimal ( amount . toString ( ) ) ;
for ( MemberAdapayRecord memberAdapayRecord : memberAdapayRecords ) {
// 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗
BigDecimal balanceAmt = memberAdapayRecord . getBalanceAmt ( ) ;
// 该笔支付扣除金额
BigDecimal deductionAmount ;
// 消费金额 - 剩余金额
tempAmount = tempAmount . subtract ( balanceAmt ) ;
if ( tempAmount . compareTo ( BigDecimal . ZERO ) > = 0 ) {
// 计算以后, 大于等于0, 说明这笔支付剩余金额需要扣完
deductionAmount = balanceAmt ;
BalanceDeductionAmountVO build = BalanceDeductionAmountVO . builder ( )
. memberId ( memberId )
. paymentId ( memberAdapayRecord . getPaymentId ( ) )
. deductionAmount ( deductionAmount )
. build ( ) ;
resultList . add ( build ) ;
} else {
// 如果小于0, 则说明剩余的钱用不完, 扣除金额等于消费金额, 并结束循环
deductionAmount = balanceAmt . add ( tempAmount ) ;
BalanceDeductionAmountVO build = BalanceDeductionAmountVO . builder ( )
. memberId ( memberId )
. paymentId ( memberAdapayRecord . getPaymentId ( ) )
. deductionAmount ( deductionAmount )
. build ( ) ;
resultList . add ( build ) ;
break ;
}
}
return resultList ;
}
/**
* 延迟交易订单 交易确认
* @param orderBasicInfo 订单
*
* @param orderBasicInfo 订单
* @param adapayMemberAccount 结算账户
* @throws BaseAdaPayException
*/
@@ -1159,22 +1283,17 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 调汇付的分账接口 确认交易
Map < String , Object > confirmParams = Maps . newHashMap ( ) ;
// Adapay生成的支付对象id
confirmParams . put ( " payment_id " , adapayCallbackRecord . getPaymentId ( ) ) ;
// 请求订单号, 只能为英文、数字或者下划线的一种或多种组合, 保证在app_id下唯一
confirmParams . put ( " order_no " , " PC " + System . currentTimeMillis ( ) ) ;
// 确认金额, 必须大于0, 保留两位小数点, 如0.10、100.05等。必须小于等于原支付金额-已确认金额-已撤销金额。
confirmParams . put ( " confirm_amt " , settleAmount ) ;
// 附加说明
JSONObject jsonObject = new JSONObject ( ) ;
jsonObject . put ( " orderCode " , orderBasicInfo . getOrderCode ( ) ) ;
jsonObject . put ( " adapayMemberId " , adapayMemberAccount . getAdapayMemberId ( ) ) ;
confirmParams . put ( " description " , jsonObject . toJSONString ( ) ) ;
// 分账对象信息
DivMember divMember = new DivMember ( ) ;
divMember . setMember_id ( adapayMemberAccount . getAdapayMemberId ( ) ) ;
@@ -1183,13 +1302,14 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
confirmParams . put ( " div_members " , Lists . newArrayList ( divMember ) ) ;
Map < String , Object > paymentConfirm = PaymentConfirm . create ( confirmParams ) ;
logger . info ( " 调分账接口param:{}, result:{} " , JSON . toJSONString ( confirmParams ) , JSON . toJSONString ( paymentConfirm ) ) ;
// 分账接口返回的信息
PaymentConfirmResponse paymentConfirmResponse = JSONObject . parseObject ( JSON . toJSONString ( paymentConfirm ) , PaymentConfirmResponse . class ) ;
OrderSettleResult result = new OrderSettleResult ( ) ;
result . setConfirm_amt ( paymentConfirmResponse . getConfirm_amt ( ) ) ;
result . setStatus ( paymentConfirmResponse . getStatus ( ) ) ;
result . setFee_amt ( paymentConfirmResponse . getFee_amt ( ) ) ;
result. setDescription( paymentConfirmResponse. getDescription( ) ) ;
// result. setDescription( paymentConfirmResponse. getDescription()) ;
return result ;
}
@@ -1207,6 +1327,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 批量查询订单
*
* @param orderCodeList
* @return
*/
@@ -1382,6 +1503,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 生成订单编号
*
* @return
*/
private String generateNewOrderCode ( ) {
@@ -1397,6 +1519,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 保存异常订单到订单主表
*
* @param data 交易记录数据
*/
@Override
@@ -1983,12 +2106,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
PileBasicInfo pileBasicInfo = pileBasicInfoService . selectPileBasicInfoBySN ( dto . getPileSn ( ) ) ;
PileStationWhitelist pileStationWhitelist = pileStationWhitelistService . queryWhitelistByMemberId ( String . valueOf ( pileBasicInfo . getStationId ( ) ) , dto . getMemberId ( ) ) ;
if ( platformTesterVO ! = null & & StringUtils . equals ( Constants . ONE , platformTesterVO . getStatus ( ) ) ) {
if ( platformTesterVO ! = null & & StringUtils . equals ( Constants . ONE , platformTesterVO . getStatus ( ) ) ) {
// 是平台测试员
accountBalance = new BigDecimal ( " 500 " ) ;
payMode = OrderPayModeEnum . PAYMENT_OF_WHITELIST . getValue ( ) ;
} else if ( pileStationWhitelist ! = null ) {
} else if ( pileStationWhitelist ! = null ) {
// 站点白名单
accountBalance = new BigDecimal ( " 500 " ) ;
payMode = OrderPayModeEnum . PAYMENT_OF_WHITELIST . getValue ( ) ;
@@ -2232,59 +2355,55 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 汇付支付-订单退款处理逻辑
*
* @param dto
*/
@Override
public void refundOrderWithAdapay ( ApplyRefundDTO dto ) {
logger . info ( " 汇付支付订单:{}, 执行退款逻辑 param:{} " , dto . getOrderCode ( ) , JSON . toJSONString ( dto ) ) ;
// 查出来原来的支付信息
AdapayCallbackRecord r ecord = adapayCallbackRecordService . selectByOrderCode ( dto . getOrderCode ( ) ) ;
if ( Objects . isNull ( r ecord) ) {
AdapayCallbackRecord callbackR ecord = adapayCallbackRecordService . selectByOrderCode ( dto . getOrderCode ( ) ) ;
if ( Objects . isNull ( callbackR ecord) ) {
logger . error ( " 汇付支付orderCode:{}, 订单退款处理逻辑, 查询订单微信支付记录为空! " , dto . getOrderCode ( ) ) ;
throw new BusinessException ( ReturnCodeEnum . CODE_REFUND_ORDER_CALLBACK_RECORD_ERROR ) ;
}
// 判断支付金额和退款金额
String paymentId = callbackRecord . getPaymentId ( ) ;
BigDecimal refundAmount = dto . getRefundAmount ( ) ;
BigDecimal payAmt = r ecord. getPayAmt ( ) ;
BigDecimal payAmt = callbackR ecord. getPayAmt ( ) ;
if ( refundAmount . compareTo ( payAmt ) > 0 ) {
logger . error ( " 汇付支付订单号:{}, 退款金额:{}(元),大于可退金额{}(元), 抛出异常 " , dto . getOrderCode ( ) , refundAmount , payAmt ) ;
throw new BusinessException ( ReturnCodeEnum . CODE_REFUND_ORDER_AMOUNT_ERROR ) ;
}
// 创建汇付退款对象 在完成初始化设置情况下,调用方法,获取 Refund对象
String id = record . getPaymentId ( ) ; //
String snowflakeId = SnowflakeIdWorker . getSnowflakeId ( ) ;
String amount = AdapayUtil . formatAmount ( dto . getRefundAmount ( ) ) ;
// TODO 拿orderCode查询清分状态
String payMode = " delay " ;
if ( StringUtils . equals ( " " , payMode ) ) {
// 延迟分账确认的调退款接口
Map < String , Object > refundParams = Maps . newHashMap ( ) ;
refundParams . put ( " refund_amt " , amount ) ;
refundParams . put ( " refund_order_no " , snowflakeId ) ;
refundParams . put ( " notify_url " , ADAPAY_CALLBACK_URL ) ;
try {
Map < String , Object > response = Refund . create ( id , refundParams ) ;
logger . info ( " 汇付支付创建退款对象:{} " , JSON . toJSONString ( response ) ) ;
} catch ( BaseAdaPayException e ) {
logger . error ( " 汇付支付创建退款对象error " , e ) ;
}
adapayMemberService . createRefundRequest ( paymentId , refundAmount ) ;
} else {
// 延迟分账未确认调撤销调撤销接口退款
Map < String , Object > reverseParams = Maps . newHashMap ( ) ;
reverseParams . put ( " app_id " , ADAPAY_APP_ID ) ;
reverseParams . put ( " payment_id " , i d ) ;
reverseParams . put ( " reverse_amt " , amount ) ;
reverseParams . put ( " order_no " , snowflakeId ) ;
reverseParams . put ( " notify_url " , ADAPAY_CALLBACK_URL ) ;
try {
Map < String , Object > paymentReverse = PaymentReverse . create ( reverseParams ) ;
logger . info ( " 汇付支付创建交易撤销对象:{} " , JSON . toJSONString ( paymentR everse) ) ;
} catch ( BaseAdaPayException e ) {
logger . error ( " 汇付支付创建交易撤销对象error " , e ) ;
PaymentReverseResponse response = adapayMemberService . createPaymentReverseRequest ( paymentId , refundAmount ) ;
if ( response ! = null ) {
MemberAdapayRecord record = memberAdapayRecordService . selectByPaymentId ( paymentI d ) ;
BigDecimal reverseAmt = new BigDecimal ( response . getReverse_amt ( ) ) ;
// 更新此笔交易单的消费金额 = 支付金额 - 撤销金额
BigDecimal spendAmt = callbackRecord . getPayAmt ( ) . subtract ( reverseAmt ) ;
record . setSpendAmt ( spendAmt ) ;
// 退款金额
record . setRefundAmt ( r everseAmt ) ;
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record . setBalanceAmt ( record . getPayAmt ( ) . subtract ( record . getRefundAmt ( ) ) . subtract ( record . getSpendAmt ( ) ) ) ;
if ( BigDecimal . ZERO . compareTo ( record . getBalanceAmt ( ) ) ! = 0 ) {
logger . error ( " 订单分账结束后账不平, paymentId:{}, orderCode:{}, 支付金额:{}, 消费金额:{}, 退款金额:{} " ,
paymentId , dto . getOrderCode ( ) , payAmt , spendAmt , reverseAmt ) ;
}
memberAdapayRecordService . updateByPrimaryKeySelective ( record ) ;
}
}
}
@@ -2295,6 +2414,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
if ( memberVO = = null ) {
throw new BusinessException ( ReturnCodeEnum . CODE_MEMBER_NOT_FOUND_ERROR ) ;
}
// 校验退款金额
BigDecimal principalBalance = memberVO . getPrincipalBalance ( ) ;
BigDecimal refundAmount = dto . getRefundAmount ( ) ;
@@ -2303,12 +2423,27 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
}
// 查询用户充值余额订单 过滤掉已经退款的充值订单
List < BalanceDeductionAmountVO > list = calculateTheBalanceDeductionAmount ( dto . getMemberId ( ) , refundAmount ) ;
for ( BalanceDeductionAmountVO vo : list ) {
String paymentId = vo . getPaymentId ( ) ;
BigDecimal deductionAmount = vo . getDeductionAmount ( ) ;
// 也许需要多笔支付订单才够退款
// 调汇付的交易撤销接口
adapayMemberService . createPaymentReverseRequest ( paymentId , deductionAmount ) ;
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService . selectByPaymentId ( paymentId ) ;
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
record . setSpendAmt ( record . getSpendAmt ( ) . add ( deductionAmount ) ) ;
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record . setBalanceAmt ( record . getPayAmt ( ) . subtract ( record . getRefundAmt ( ) ) . subtract ( record . getSpendAmt ( ) ) ) ;
memberAdapayRecordService . updateByPrimaryKeySelective ( record ) ;
}
}
/**
* 计算站点订单报表
*
* @param stationId 站点id
* @param tradeDate 交易日期
*/
@@ -2427,6 +2562,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 通过结算金额,计算客户到账金额和手续费
*
* @param settleAmount 需要拆分的结算金额
* @return
*/
@@ -2505,10 +2641,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
*
* @param dto
* @return
* @throws Exception
*/
@Override
public Map < String , Object > payOrder ( PayOrderDTO dto ) throws Exception {
public Map < String , Object > payOrder ( PayOrderDTO dto ) {
OrderBasicInfo orderInfo = this . getOrderInfoByOrderCode ( dto . getOrderCode ( ) ) ;
if ( orderInfo = = null ) {
throw new BusinessException ( ReturnCodeEnum . CODE_QUERY_ORDER_NULL_ERROR ) ;
@@ -2530,8 +2665,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 返回微信支付参数
resultMap . put ( " weixinMap " , weixinMap ) ;
} else if ( StringUtils . equals ( dto . getPayMode ( ) , OrderPayModeEnum . PAYMENT_OF_ALIPAY . getValue ( ) ) ) { // 支付宝支付
// TODO 返回支付宝支付参数
} else if ( StringUtils . equals ( dto . getPayMode ( ) , OrderPayModeEnum . PAYMENT_OF_WHITELIST . getValue ( ) ) ) { // 白名单支付
// 白名单支付可以直接调支付回调方法
dto . setPayAmount ( new BigDecimal ( " 500 " ) ) ;
@@ -2662,6 +2795,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
map . put ( " type " , ScenarioEnum . ORDER . getValue ( ) ) ;
map . put ( " orderCode " , dto . getOrderCode ( ) ) ;
map . put ( " payMode " , payMode ) ;
map . put ( " memberId " , dto . getMemberId ( ) ) ;
createAdaPaymentParam . setDescription ( JSON . toJSONString ( map ) ) ;
// 异步通知地址, url为http/https路径, 服务器POST回调, URL 上请勿附带参数
createAdaPaymentParam . setNotify_url ( ADAPAY_CALLBACK_URL ) ;
@@ -2675,7 +2809,8 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
if ( response ! = null & & ! response . isEmpty ( ) ) {
JSONObject expend = JSONObject . parseObject ( response . get ( " expend " ) . toString ( ) ) ;
JSONObject pay_info = expend . getJSONObject ( " pay_info " ) ;
Map < String , Object > resultMap = JSONObject . parseObject ( pay_info . toJSONString ( ) , new TypeReference < Map < String , Object > > ( ) { } ) ;
Map < String , Object > resultMap = JSONObject . parseObject ( pay_info . toJSONString ( ) , new TypeReference < Map < String , Object > > ( ) {
} ) ;
if ( resultMap ! = null ) {
// 表示已经获取到支付参数了,后续再有支付请求就拒绝
redisCache . setCacheObject ( redisKey , resultMap , 15 , TimeUnit . MINUTES ) ;
@@ -2802,7 +2937,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 如果是鉴权卡或者vin启动, 不判断枪口状态
if ( ! ( StringUtils . equals ( dto . getStartMode ( ) , StartModeEnum . AUTH_CARD . getValue ( ) )
| | StringUtils . equals ( dto . getStartMode ( ) , StartModeEnum . VIN_CODE . getValue ( ) ) ) ) {
| | StringUtils . equals ( dto . getStartMode ( ) , StartModeEnum . VIN_CODE . getValue ( ) ) ) ) {
// 判断枪口状态
if ( ! ( StringUtils . equals ( pileConnector . getConnectorStatus ( ) , PileConnectorDataBaseStatusEnum . FREE . getValue ( ) )