补充退款逻辑
This commit is contained in:
parent
bea163252a
commit
1f1c6d94b4
|
|
@ -55,7 +55,7 @@ public class PayReverseCallbackService implements CallBackService {
|
|||
|
||||
@Override
|
||||
public void onResponse(JSONObject response) {
|
||||
log.debug("撤销支付 Response: {}", response.toString());
|
||||
|
||||
}
|
||||
|
||||
@Autowired
|
||||
|
|
|
|||
|
|
@ -735,7 +735,7 @@ public class OrderMasterController extends BaseController {
|
|||
@PostMapping("/cancel")
|
||||
@ResponseBody
|
||||
public AjaxResult cancel(Long orderMasterId) throws BaseAdaPayException {
|
||||
orderMasterService.cancel(orderMasterId);
|
||||
orderMasterService.applyForCancel(orderMasterId);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.ghy.order.service;
|
||||
|
||||
import com.ghy.common.enums.OrderStatus;
|
||||
import com.ghy.order.domain.OrderDetail;
|
||||
import com.ghy.order.domain.OrderStatusCount;
|
||||
import com.ghy.payment.domain.FinancialChangeRecord;
|
||||
|
|
@ -153,4 +154,13 @@ public interface OrderDetailService {
|
|||
* @param reverseId 退款ID
|
||||
*/
|
||||
void refundSucceeded(String reverseId);
|
||||
|
||||
/**
|
||||
* 更新子订单状态
|
||||
*
|
||||
* @param id 子订单id
|
||||
* @param status 状态码 {@link OrderStatus}
|
||||
* @return
|
||||
*/
|
||||
int updateStatus(Long id, int status);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ import com.huifu.adapay.core.exception.BaseAdaPayException;
|
|||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* 主订单接口
|
||||
|
|
@ -96,7 +95,7 @@ public interface OrderMasterService {
|
|||
*
|
||||
* @param orderMasterId 主订单ID
|
||||
*/
|
||||
void cancel(Long orderMasterId) throws BaseAdaPayException;
|
||||
void applyForCancel(Long orderMasterId) throws BaseAdaPayException;
|
||||
|
||||
/**
|
||||
* 师傅同意取消主订单
|
||||
|
|
@ -128,4 +127,12 @@ public interface OrderMasterService {
|
|||
* @param reverseId 退款ID
|
||||
*/
|
||||
void refundSucceeded(String reverseId);
|
||||
|
||||
/**
|
||||
* 判断是否全部派单
|
||||
*
|
||||
* @param orderMasterId 主订单ID
|
||||
* @return true/false
|
||||
*/
|
||||
boolean isAllAssign(Long orderMasterId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,9 +3,7 @@ package com.ghy.order.service.impl;
|
|||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ghy.common.adapay.model.AdapayStatusEnum;
|
||||
import com.ghy.common.core.text.Convert;
|
||||
import com.ghy.common.enums.OrderStatus;
|
||||
import com.ghy.common.enums.PayStatus;
|
||||
import com.ghy.common.enums.PayTypeEnum;
|
||||
import com.ghy.common.enums.RefundType;
|
||||
import com.ghy.common.exception.base.BaseException;
|
||||
import com.ghy.common.utils.DateUtils;
|
||||
|
|
@ -19,11 +17,11 @@ import com.ghy.payment.service.AdapayService;
|
|||
import com.ghy.payment.service.FinancialDetailService;
|
||||
import com.ghy.payment.service.FinancialMasterService;
|
||||
import com.huifu.adapay.core.exception.BaseAdaPayException;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
|
@ -36,30 +34,22 @@ import java.util.Objects;
|
|||
* @date 2022-09-25
|
||||
*/
|
||||
@Service
|
||||
public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
||||
{
|
||||
@Autowired
|
||||
public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService {
|
||||
@Resource
|
||||
private AfterServiceRecordMapper afterServiceRecordMapper;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private IAfterServiceImgsService afterServiceImgsService;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private FinancialDetailService financialDetailService;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private OrderMasterService orderMasterService;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private FinancialMasterService financialMasterService;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private AdapayService adapayService;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private OrderDetailService orderDetailService;
|
||||
|
||||
@Autowired
|
||||
@Resource
|
||||
private OrderGoodsService orderGoodsService;
|
||||
|
||||
/**
|
||||
|
|
@ -69,8 +59,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
* @return 售后记录
|
||||
*/
|
||||
@Override
|
||||
public AfterServiceRecord selectAfterServiceRecordById(String id)
|
||||
{
|
||||
public AfterServiceRecord selectAfterServiceRecordById(String id) {
|
||||
return afterServiceRecordMapper.selectAfterServiceRecordById(id);
|
||||
}
|
||||
|
||||
|
|
@ -81,8 +70,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
* @return 售后记录
|
||||
*/
|
||||
@Override
|
||||
public List<AfterServiceRecord> selectAfterServiceRecordList(AfterServiceRecord afterServiceRecord)
|
||||
{
|
||||
public List<AfterServiceRecord> selectAfterServiceRecordList(AfterServiceRecord afterServiceRecord) {
|
||||
List<AfterServiceRecord> list = afterServiceRecordMapper.selectAfterServiceRecordList(afterServiceRecord);
|
||||
list.forEach(record -> {
|
||||
AfterServiceImgs param = new AfterServiceImgs();
|
||||
|
|
@ -99,13 +87,12 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int insertAfterServiceRecord(AfterServiceRecord afterServiceRecord)
|
||||
{
|
||||
public int insertAfterServiceRecord(AfterServiceRecord afterServiceRecord) {
|
||||
afterServiceRecord.setCreateTime(DateUtils.getNowDate());
|
||||
int result = afterServiceRecordMapper.insertAfterServiceRecord(afterServiceRecord);
|
||||
|
||||
if(afterServiceRecord.getImgsList() != null && afterServiceRecord.getImgsList().size() > 0){
|
||||
afterServiceRecord.getImgsList().forEach(imgUrl->{
|
||||
if (afterServiceRecord.getImgsList() != null && afterServiceRecord.getImgsList().size() > 0) {
|
||||
afterServiceRecord.getImgsList().forEach(imgUrl -> {
|
||||
imgUrl.setAfterServiceRecordId(Long.valueOf(afterServiceRecord.getId()));
|
||||
afterServiceImgsService.insertAfterServiceImgs(imgUrl);
|
||||
});
|
||||
|
|
@ -121,11 +108,11 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public int updateAfterServiceRecord(AfterServiceRecord param) throws Exception {
|
||||
public int updateAfterServiceRecord(AfterServiceRecord param) throws BaseAdaPayException {
|
||||
AfterServiceRecord afterServiceRecord = this.selectAfterServiceRecordById(param.getId());
|
||||
Assert.notNull(afterServiceRecord, "售后记录不存在!");
|
||||
// 实际同意,需要发起退款,减少原单分账金额-调用退款接口
|
||||
if(param.getCustomerFinalCheck() != null && param.getCustomerFinalCheck() == 1){
|
||||
if (param.getCustomerFinalCheck() != null && param.getCustomerFinalCheck() == 1) {
|
||||
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
|
||||
Assert.notNull(orderDetail, "子单不存在!");
|
||||
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId());
|
||||
|
|
@ -133,82 +120,42 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId());
|
||||
Assert.notNull(orderMaster, "找不到对应的订单");
|
||||
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderDetail.getOrderMasterId());
|
||||
Assert.notNull(financialMaster, "找不到订单");
|
||||
Assert.notNull(financialMaster, "找不到支付记录");
|
||||
Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员");
|
||||
Assert.isTrue(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus()), "订单未支付");
|
||||
// 申请退款金额
|
||||
BigDecimal refundMoney;
|
||||
if(ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())){
|
||||
if (ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())) {
|
||||
refundMoney = afterServiceRecord.getAgreedRefund();
|
||||
}else {
|
||||
} else {
|
||||
refundMoney = afterServiceRecord.getRefund();
|
||||
}
|
||||
// 判断是否只有一个师傅接单,且单据派单完成.
|
||||
if(this.checkIsOnlyServer(orderMaster.getId(), orderDetail.getWorkerId())){
|
||||
BigDecimal workerFee = financialMaster.getPayMoney();
|
||||
List<FinancialDetail> financialDetailList = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
|
||||
for (FinancialDetail detail : financialDetailList) {
|
||||
if (!orderDetail.getWorkerId().equals(detail.getPayeeId())) {
|
||||
workerFee = workerFee.subtract(detail.getPayMoney());
|
||||
}
|
||||
}
|
||||
if(workerFee.compareTo(refundMoney) < 0){
|
||||
refundMoney = financialMaster.getPayMoney();
|
||||
}
|
||||
}else if(refundMoney.compareTo(financialDetail.getPayMoney()) < 0){
|
||||
if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) {
|
||||
// 申请退款金额 < 子单金额
|
||||
financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(afterServiceRecord.getAgreedRefund()));
|
||||
}else {
|
||||
refundMoney = financialDetail.getPayMoney();
|
||||
financialDetail.setPayMoney(BigDecimal.ZERO);
|
||||
}
|
||||
|
||||
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
|
||||
// 更新主/子财务单金额
|
||||
financialMasterService.updateFinancialMaster(financialMaster);
|
||||
financialDetailService.updateFinancialDetail(financialDetail);
|
||||
// 发起支付撤销
|
||||
|
||||
if(PayTypeEnum.ALIPAY_QR.getCode().equals(orderMaster.getPayType()) && ! PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())){
|
||||
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
|
||||
financialMasterService.updateFinancialMaster(financialMaster);
|
||||
financialDetailService.updateFinancialDetail(financialDetail);
|
||||
param.setOriginalRefund(BigDecimal.ZERO);
|
||||
} else {
|
||||
Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员");
|
||||
JSONObject response = null;
|
||||
try {
|
||||
response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), String.valueOf(refundMoney), RefundType.RAS);
|
||||
JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(),
|
||||
String.valueOf(refundMoney), RefundType.RAS);
|
||||
if (AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
|
||||
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
|
||||
financialMasterService.updateFinancialMaster(financialMaster);
|
||||
financialDetailService.updateFinancialDetail(financialDetail);
|
||||
param.setOriginalRefund(refundMoney);
|
||||
param.setRefundApplyTime(new Date());
|
||||
} else if (AdapayStatusEnum.failed.code.equals(response.getString("status"))) {
|
||||
if("reverse_amt_over".equals(response.getString("error_code"))){
|
||||
throw new BaseException("退款金额大于最后一次支付,请撤销改金额再发起");
|
||||
}else {
|
||||
} else {
|
||||
if ("reverse_amt_over".equals(response.getString("error_code"))) {
|
||||
throw new BaseException("退款金额超出订单金额");
|
||||
} else {
|
||||
throw new BaseException("发起退款异常");
|
||||
}
|
||||
}
|
||||
// 如果已经全部退款,则需要更新订单状态为取消。
|
||||
if(financialMaster.getPayMoney().compareTo(BigDecimal.ZERO) == 0){
|
||||
orderMasterService.updateStatus(orderMaster.getId(), OrderStatus.CANCEL.code());
|
||||
OrderDetail data = new OrderDetail();
|
||||
data.setOrderMasterId(orderMaster.getId());
|
||||
data.setOrderStatus(OrderStatus.CANCEL.code());
|
||||
orderDetailService.updateByOrderMasterId(data);
|
||||
}
|
||||
} catch (BaseAdaPayException e) {
|
||||
throw new BaseException(e.getMessage());
|
||||
} else {
|
||||
// 子单全额退款 直接走取消流程
|
||||
orderDetailService.cancelAgree(orderDetail.getId(), 1);
|
||||
}
|
||||
}
|
||||
|
||||
// 判断子单payMoney是否已经是0了,是的话就修改子单状态为已取消;主单状态会随之更改,不用做处理。
|
||||
if (financialDetail.getPayMoney().compareTo(BigDecimal.ZERO) == 0) {
|
||||
OrderDetail orderDetail2Update = new OrderDetail();
|
||||
orderDetail2Update.setId(orderDetail.getId());
|
||||
orderDetail2Update.setOrderStatus(OrderStatus.CANCEL.code());
|
||||
int affectedOrderDetail = orderDetailService.updateOrderDetail(orderDetail2Update);
|
||||
if (affectedOrderDetail != 1) {
|
||||
throw new Exception("子订单修改状态为已取消失败。");
|
||||
}
|
||||
}
|
||||
}
|
||||
param.setUpdateTime(DateUtils.getNowDate());
|
||||
param.setUpdateTime(new Date());
|
||||
return afterServiceRecordMapper.updateAfterServiceRecord(param);
|
||||
}
|
||||
|
||||
|
|
@ -219,8 +166,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int deleteAfterServiceRecordByIds(String ids)
|
||||
{
|
||||
public int deleteAfterServiceRecordByIds(String ids) {
|
||||
|
||||
return afterServiceRecordMapper.deleteAfterServiceRecordByIds(Convert.toStrArray(ids));
|
||||
}
|
||||
|
|
@ -232,27 +178,26 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
|
|||
* @return 结果
|
||||
*/
|
||||
@Override
|
||||
public int deleteAfterServiceRecordById(String id)
|
||||
{
|
||||
public int deleteAfterServiceRecordById(String id) {
|
||||
return afterServiceRecordMapper.deleteAfterServiceRecordById(id);
|
||||
}
|
||||
|
||||
private boolean checkIsOnlyServer(Long orderMasterId, Long workId){
|
||||
private boolean checkIsOnlyServer(Long orderMasterId, Long workId) {
|
||||
// 找出原单的数量
|
||||
List<OrderGoods> orderGoodsList = orderGoodsService.selectByOrderMasterId(orderMasterId);
|
||||
// 找出原单关联的细单的商品数量
|
||||
List<OrderDetail> orderDetailList = orderDetailService.selectByOrderMasterId(orderMasterId);
|
||||
for (OrderDetail detail : orderDetailList){
|
||||
for (OrderDetail detail : orderDetailList) {
|
||||
// 非一个师傅接单
|
||||
if(!workId.equals(detail.getWorkerId())){
|
||||
if (!workId.equals(detail.getWorkerId())) {
|
||||
return false;
|
||||
}
|
||||
// 子单数量
|
||||
List<OrderGoods> orderDetailGoodsList = orderGoodsService.selectByOrderDetailId(detail.getId());
|
||||
// 计算剩余未分配的商品数量
|
||||
for (OrderGoods detailGoods : orderDetailGoodsList) {
|
||||
for(OrderGoods masterGoods : orderGoodsList){
|
||||
if(Objects.equals(masterGoods.getGoodsStandardId(), detailGoods.getGoodsStandardId())){
|
||||
for (OrderGoods masterGoods : orderGoodsList) {
|
||||
if (Objects.equals(masterGoods.getGoodsStandardId(), detailGoods.getGoodsStandardId())) {
|
||||
masterGoods.setGoodsNum(masterGoods.getGoodsNum() - detailGoods.getGoodsNum());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -210,7 +210,6 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void applyForCancel(Long orderDetailId) throws BaseAdaPayException {
|
||||
OrderDetail orderDetail = selectById(orderDetailId);
|
||||
Assert.notNull(orderDetail, "找不到对应的子订单");
|
||||
|
|
@ -227,16 +226,14 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
}
|
||||
if (allCancel) {
|
||||
logger.info("主订单[id={}]下所有的子订单都被取消 直接进入主订单取消流程", orderDetail.getOrderMasterId());
|
||||
orderMasterService.cancel(orderDetail.getOrderMasterId());
|
||||
orderMasterService.applyForCancel(orderDetail.getOrderMasterId());
|
||||
return;
|
||||
}
|
||||
|
||||
switch (orderDetail.getOrderStatus()) {
|
||||
case 0:
|
||||
case 1: // 待接单和待排期状态可直接取消
|
||||
orderDetailMapper.updateStatus(orderDetailId, OrderStatus.CANCEL.code());
|
||||
// 发起退款
|
||||
refund(orderDetail);
|
||||
cancel(orderDetailId);
|
||||
break;
|
||||
case 2: // 待上门状态需要师傅同意才能取消
|
||||
orderDetailMapper.updateStatus(orderDetailId, OrderStatus.GOING_CANCEL.code());
|
||||
|
|
@ -252,71 +249,113 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 子订单取消
|
||||
*
|
||||
* @param orderDetailId 子订单ID
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void cancel(long orderDetailId) throws BaseAdaPayException {
|
||||
OrderDetail orderDetail = selectById(orderDetailId);
|
||||
Assert.notNull(orderDetail, "找不到对应的子订单");
|
||||
|
||||
// 查询出所有的子订单 就走主订单取消流程
|
||||
List<OrderDetail> orderDetails = orderDetailMapper.selectByOrderMasterId(orderDetail.getOrderMasterId());
|
||||
// 如果除了这个子订单以外 没有其它未取消的订单
|
||||
boolean allCancel = true;
|
||||
for (OrderDetail od : orderDetails) {
|
||||
if (!od.getId().equals(orderDetailId)) {
|
||||
if (!od.getOrderStatus().equals(OrderStatus.CANCEL.code())) {
|
||||
allCancel = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 判断主单是否全部派单
|
||||
boolean allAssign = orderMasterService.isAllAssign(orderDetail.getOrderMasterId());
|
||||
// 如果主单已经全部派单 并且 其它订单都已经取消
|
||||
if (allAssign && allCancel) {
|
||||
logger.info("主订单[id={}]下所有的子订单都被取消 直接进入主订单取消流程", orderDetail.getOrderMasterId());
|
||||
orderMasterService.cancelAgree(orderDetail.getOrderMasterId(), 1);
|
||||
return;
|
||||
}
|
||||
orderDetailMapper.updateStatus(orderDetailId, OrderStatus.CANCEL.code());
|
||||
// 发起退款
|
||||
refund(orderDetail);
|
||||
}
|
||||
|
||||
/**
|
||||
* 子单全额退款
|
||||
*
|
||||
* @param orderDetail
|
||||
* @throws BaseAdaPayException
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void refund(OrderDetail orderDetail) throws BaseAdaPayException {
|
||||
Long orderDetailId = orderDetail.getId();
|
||||
OrderMaster orderMaster = orderMasterMapper.selectById(orderDetail.getOrderMasterId());
|
||||
Assert.notNull(orderMaster, "OrderMaster is null !");
|
||||
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMaster.getId());
|
||||
Assert.notNull(financialMaster, "FinancialMaster is null !");
|
||||
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(orderDetailId);
|
||||
Assert.notNull(financialMaster, "找不到支付记录");
|
||||
Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员");
|
||||
Assert.isTrue(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus()), "订单未支付");
|
||||
|
||||
// 退款金额
|
||||
BigDecimal refundMoney = BigDecimal.ZERO;
|
||||
// 主财务单金额
|
||||
BigDecimal masterMoney = financialMaster.getPayMoney();
|
||||
// 子财务单金额
|
||||
BigDecimal detailMoney = financialDetail.getPayMoney();
|
||||
|
||||
List<FinancialChangeRecord> fcrList = financialChangeRecordService.selectByDetailIds(orderDetailId.toString());
|
||||
// 先把这个子单的加价单全退了
|
||||
for (FinancialChangeRecord fcr : fcrList) {
|
||||
financialChangeRecordService.refund(orderDetail.getDeptId(), fcr);
|
||||
// 子单对应的财务单里也加上了加价单的金额 所以这里减掉
|
||||
refundMoney = refundMoney.subtract(fcr.getChangeMoney());
|
||||
}
|
||||
|
||||
List<FinancialDetail> fdList = financialDetailService.selectListByOrderDetailId(orderDetailId);
|
||||
for (FinancialDetail fd : fdList) {
|
||||
if (PayStatus.REFUND.getCode().equals(fd.getPayStatus()) ||
|
||||
PayStatus.REFUNDING.getCode().equals(fd.getPayStatus()) ||
|
||||
PayStatus.REVERSING.getCode().equals(fd.getPayStatus())) {
|
||||
// 减去退款中和已退款的子财务单金额
|
||||
refundMoney = refundMoney.subtract(fd.getPayMoney());
|
||||
} else if (PayStatus.PAID.getCode().equals(fd.getPayStatus())) {
|
||||
refundMoney = refundMoney.add(fd.getPayMoney());
|
||||
if (PayStatus.PAID.getCode().equals(fcr.getPayStatus()) || PayStatus.PAYED_ADD.getCode().equals(fcr.getPayStatus())) {
|
||||
executor.execute(() -> financialChangeRecordService.refund(orderMaster.getDeptId(), fcr));
|
||||
// 主/子财务单里也加上了加价单的金额 所以这里减掉
|
||||
masterMoney = masterMoney.subtract(fcr.getChangeMoney());
|
||||
detailMoney = detailMoney.subtract(fcr.getChangeMoney());
|
||||
}
|
||||
}
|
||||
|
||||
if (BigDecimal.ZERO.compareTo(refundMoney) > -1) {
|
||||
logger.info("子订单[id={}]待退款金额<=0,不需要退款", orderDetailId);
|
||||
// detailMoney ≤ 0 不需要退款
|
||||
if (BigDecimal.ZERO.compareTo(detailMoney) > -1) {
|
||||
logger.info("子订单[{}]不需要退款 payMoney={}元", orderDetail.getId(), detailMoney);
|
||||
// 更新子财务单金额和状态
|
||||
financialDetail.setPayStatus(PayStatus.REFUND.getCode());
|
||||
financialDetail.setPayMoney(detailMoney);
|
||||
financialDetailService.updateFinancialDetail(financialDetail);
|
||||
|
||||
// 更新主财务单金额
|
||||
financialMaster.setPayMoney(masterMoney);
|
||||
financialMasterService.updateFinancialMaster(financialMaster);
|
||||
return;
|
||||
}
|
||||
|
||||
// 子订单的退款肯定≤主订单金额 否则肯定算错了
|
||||
Assert.isTrue(refundMoney.compareTo(financialMaster.getPayMoney()) < 1, "订单金额异常");
|
||||
// 更新子财务单金额和状态
|
||||
financialDetail.setPayMoney(detailMoney);
|
||||
financialDetail.setPayStatus(PayStatus.REFUNDING.getCode());
|
||||
financialDetailService.updateFinancialDetail(financialDetail);
|
||||
|
||||
// 更新主财务单金额
|
||||
financialMaster.setPayMoney(masterMoney.subtract(detailMoney));
|
||||
financialMasterService.updateFinancialMaster(financialMaster);
|
||||
|
||||
// 发起退款
|
||||
String refundAmt = AdapayUtils.bigDecimalToString(refundMoney);
|
||||
String refundAmt = AdapayUtils.bigDecimalToString(detailMoney);
|
||||
logger.info("子订单[id={}]发起退款: refundAmt={}元", orderDetailId, refundAmt);
|
||||
JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), refundAmt, RefundType.ROD);
|
||||
logger.debug("子订单退款结果: " + response.toJSONString());
|
||||
boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) ||
|
||||
AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
||||
// 如果退款失败 这里携带失败原因抛出异常 回滚订单状态
|
||||
Assert.isTrue(status, response.getString("error_msg"));
|
||||
logger.info("子订单[id={}]退款成功", orderDetailId);
|
||||
|
||||
executor.execute(() -> {
|
||||
String reverseId = response.getString("id");
|
||||
for (FinancialDetail fd : fdList) {
|
||||
if (PayStatus.PAID.getCode().equals(fd.getPayStatus())) {
|
||||
FinancialDetail fd2update = new FinancialDetail();
|
||||
fd2update.setId(fd.getId());
|
||||
fd2update.setPayStatus(PayStatus.REFUND.getCode());
|
||||
fd2update.setId(financialDetail.getId());
|
||||
fd2update.setReverseId(reverseId);
|
||||
financialDetailService.updateFinancialDetail(fd2update);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -326,10 +365,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
Assert.notNull(orderDetail, "找不到对应的子订单");
|
||||
if (Integer.valueOf(1).equals(agree)) {
|
||||
// 师傅同意取消订单
|
||||
// 修改主订单状态为已取消
|
||||
orderDetailMapper.updateStatus(orderDetailId, OrderStatus.CANCEL.code());
|
||||
// 发起退款
|
||||
refund(orderDetail);
|
||||
cancel(orderDetailId);
|
||||
} else {
|
||||
// 师傅不同意取消订单
|
||||
Integer orderStatus = orderDetail.getOrderStatus();
|
||||
|
|
@ -633,4 +669,14 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
public void refundSucceeded(String reverseId) {
|
||||
financialDetailService.refundSucceeded(reverseId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int updateStatus(Long id, int status) {
|
||||
for (OrderStatus os : OrderStatus.values()) {
|
||||
if (status == os.code()) {
|
||||
return orderDetailMapper.updateStatus(id, status);
|
||||
}
|
||||
}
|
||||
throw new IllegalArgumentException("Unknown OrderStatus: " + status);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,13 +6,18 @@ import com.ghy.common.adapay.model.DivMember;
|
|||
import com.ghy.common.adapay.model.PaymentDTO;
|
||||
import com.ghy.common.constant.UserConstants;
|
||||
import com.ghy.common.core.text.Convert;
|
||||
import com.ghy.common.enums.*;
|
||||
import com.ghy.common.enums.AdapayOrderType;
|
||||
import com.ghy.common.enums.OrderStatus;
|
||||
import com.ghy.common.enums.PayStatus;
|
||||
import com.ghy.common.enums.RefundType;
|
||||
import com.ghy.common.utils.AdapayUtils;
|
||||
import com.ghy.order.domain.OrderDetail;
|
||||
import com.ghy.order.domain.OrderGoods;
|
||||
import com.ghy.order.domain.OrderMaster;
|
||||
import com.ghy.order.mapper.OrderMasterMapper;
|
||||
import com.ghy.order.request.AppOrderRequest;
|
||||
import com.ghy.order.service.OrderDetailService;
|
||||
import com.ghy.order.service.OrderGoodsService;
|
||||
import com.ghy.order.service.OrderMasterService;
|
||||
import com.ghy.payment.domain.FinancialChangeRecord;
|
||||
import com.ghy.payment.domain.FinancialDetail;
|
||||
|
|
@ -56,6 +61,8 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
@Resource
|
||||
private OrderDetailService orderDetailService;
|
||||
@Resource
|
||||
private OrderGoodsService orderGoodsService;
|
||||
@Resource
|
||||
private FinancialMasterService financialMasterService;
|
||||
@Resource
|
||||
private FinancialDetailService financialDetailService;
|
||||
|
|
@ -279,7 +286,7 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void cancel(Long orderMasterId) throws BaseAdaPayException {
|
||||
public void applyForCancel(Long orderMasterId) throws BaseAdaPayException {
|
||||
OrderMaster orderMaster = selectById(orderMasterId);
|
||||
Assert.notNull(orderMaster, "找不到对应的订单");
|
||||
switch (orderMaster.getOrderStatus()) {
|
||||
|
|
@ -434,4 +441,18 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
public void refundSucceeded(String reverseId) {
|
||||
financialMasterService.refundSucceeded(reverseId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllAssign(Long orderMasterId) {
|
||||
OrderMaster orderMaster = orderMasterMapper.selectById(orderMasterId);
|
||||
Assert.notNull(orderMaster, "OrderMaster is null!!!");
|
||||
// 先判断主订单是否派完单
|
||||
List<OrderGoods> masterGoods = orderGoodsService.selectByOrderMasterId(orderMasterId);
|
||||
long masterCount = masterGoods.stream().mapToInt(OrderGoods::getGoodsNum).sum();
|
||||
long detailCount = orderDetailService.selectByOrderMasterId(orderMasterId).stream().mapToInt(x -> {
|
||||
List<OrderGoods> detailGoods = orderGoodsService.selectByOrderDetailId(x.getId());
|
||||
return detailGoods.stream().mapToInt(OrderGoods::getGoodsNum).sum();
|
||||
}).sum();
|
||||
return masterCount == detailCount;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -92,11 +92,7 @@
|
|||
|
||||
<select id="selectByOrderId" parameterType="long" resultMap="OrderGoodsResult">
|
||||
<include refid="selectOrderGoods"/>
|
||||
<where>
|
||||
<if test="orderId != null and orderId != 0">
|
||||
AND order_id = #{orderId}
|
||||
</if>
|
||||
</where>
|
||||
WHERE order_id = #{orderId}
|
||||
</select>
|
||||
|
||||
<select id="selectByOrderDetailId" parameterType="long" resultMap="OrderGoodsResult">
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package com.ghy.payment.service;
|
||||
|
||||
import com.ghy.payment.domain.FinancialChangeRecord;
|
||||
import com.huifu.adapay.core.exception.BaseAdaPayException;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
|
@ -76,7 +75,7 @@ public interface FinancialChangeRecordService {
|
|||
* @param deptId 公司ID
|
||||
* @param fcr 加价单
|
||||
*/
|
||||
void refund(Long deptId, FinancialChangeRecord fcr) throws BaseAdaPayException;
|
||||
boolean refund(Long deptId, FinancialChangeRecord fcr);
|
||||
|
||||
/**
|
||||
* 退款成功时 退款回调接口里会调用这个方法
|
||||
|
|
|
|||
|
|
@ -17,10 +17,7 @@ import org.springframework.util.CollectionUtils;
|
|||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.StringJoiner;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* @author clunt
|
||||
|
|
@ -135,20 +132,31 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe
|
|||
}
|
||||
|
||||
@Override
|
||||
public void refund(Long deptId, FinancialChangeRecord fcr) throws BaseAdaPayException {
|
||||
String changeMoney = fcr.getChangeMoney().setScale(2, RoundingMode.DOWN).toString();
|
||||
JSONObject response = adapayService.payReverse(deptId, fcr.getPaymentId(), changeMoney, RefundType.RCG);
|
||||
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status")) ||
|
||||
AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
|
||||
// 发起撤销支付成功
|
||||
public boolean refund(Long deptId, FinancialChangeRecord fcr) {
|
||||
FinancialChangeRecord update = new FinancialChangeRecord();
|
||||
update.setId(fcr.getId());
|
||||
update.setReverseId(response.getString("id"));
|
||||
update.setPayStatus(PayStatus.REFUNDING.getCode());
|
||||
update.setUpdateTime(new Date());
|
||||
update(update);
|
||||
String reverseAmt = fcr.getChangeMoney().setScale(2, RoundingMode.DOWN).toString();
|
||||
log.info("加价单[{}]退款: {}元", fcr.getId(), reverseAmt);
|
||||
JSONObject response;
|
||||
try {
|
||||
response = adapayService.payReverse(deptId, fcr.getPaymentId(), reverseAmt, RefundType.RCG);
|
||||
} catch (BaseAdaPayException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")) ||
|
||||
AdapayStatusEnum.pending.code.equals(response.getString("status"));
|
||||
if (status) {
|
||||
// 发起撤销支付成功
|
||||
update.setId(fcr.getId());
|
||||
update.setReverseId(response.getString("id"));
|
||||
update(update);
|
||||
} else {
|
||||
log.error("改价单退款失败: {}", response.toJSONString());
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Reference in New Issue