补充退款逻辑

This commit is contained in:
HH 2023-04-11 01:33:16 +08:00
parent bea163252a
commit 1f1c6d94b4
10 changed files with 203 additions and 171 deletions

View File

@ -55,7 +55,7 @@ public class PayReverseCallbackService implements CallBackService {
@Override
public void onResponse(JSONObject response) {
log.debug("撤销支付 Response: {}", response.toString());
}
@Autowired

View File

@ -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();
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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());
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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">

View File

@ -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);
/**
* 退款成功时 退款回调接口里会调用这个方法

View File

@ -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