单师傅全额退款逻辑

This commit is contained in:
clunt 2022-10-18 23:24:10 +08:00
parent ead994fd89
commit 73e9017b7b
1 changed files with 63 additions and 13 deletions

View File

@ -3,6 +3,7 @@ package com.ghy.order.service.impl;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.model.AdapayStatusEnum;
@ -14,12 +15,8 @@ import com.ghy.common.enums.PayTypeEnum;
import com.ghy.common.exception.base.BaseException;
import com.ghy.common.utils.DateUtils;
import com.ghy.common.utils.ObjectUtils;
import com.ghy.order.domain.AfterServiceImgs;
import com.ghy.order.domain.OrderDetail;
import com.ghy.order.domain.OrderMaster;
import com.ghy.order.service.IAfterServiceImgsService;
import com.ghy.order.service.OrderDetailService;
import com.ghy.order.service.OrderMasterService;
import com.ghy.order.domain.*;
import com.ghy.order.service.*;
import com.ghy.payment.domain.FinancialDetail;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.service.AdapayService;
@ -29,8 +26,6 @@ import com.huifu.adapay.core.exception.BaseAdaPayException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ghy.order.mapper.AfterServiceRecordMapper;
import com.ghy.order.domain.AfterServiceRecord;
import com.ghy.order.service.IAfterServiceRecordService;
import com.ghy.common.core.text.Convert;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
@ -65,6 +60,9 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
@Autowired
private OrderDetailService orderDetailService;
@Autowired
private OrderGoodsService orderGoodsService;
/**
* 查询售后记录
*
@ -133,23 +131,37 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
Assert.notNull(orderDetail, "子单不存在!");
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId());
Assert.notNull(financialDetail, "财务子单不存在!");
OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId());
Assert.notNull(orderMaster, "找不到对应的订单");
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderDetail.getOrderMasterId());
Assert.notNull(financialMaster, "找不到订单");
BigDecimal refundMoney = BigDecimal.ZERO;
if(ObjectUtils.isNotEmpty(afterServiceRecord.getAgreedRefund())){
refundMoney = afterServiceRecord.getAgreedRefund();
}else {
refundMoney = afterServiceRecord.getRefund();
}
if(refundMoney.compareTo(financialDetail.getPayMoney()) < 0){
// 判断是否只有一个师傅接单,且单据派单完成.
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){
financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(afterServiceRecord.getAgreedRefund()));
}else {
refundMoney = financialDetail.getPayMoney();
financialDetail.setPayMoney(BigDecimal.ZERO);
}
// 发起支付撤销
OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId());
Assert.notNull(orderMaster, "找不到对应的订单");
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderDetail.getOrderMasterId());
Assert.notNull(financialMaster, "找不到订单");
if(PayTypeEnum.ALIPAY_QR.getCode().equals(orderMaster.getPayType()) && ! PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())){
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
financialMasterService.updateFinancialMaster(financialMaster);
@ -173,6 +185,14 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
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());
}
@ -217,4 +237,34 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
{
return afterServiceRecordMapper.deleteAfterServiceRecordById(id);
}
private boolean checkIsOnlyServer(Long orderMasterId, Long workId){
// 找出原单的数量
List<OrderGoods> orderGoodsList = orderGoodsService.selectByOrderMasterId(orderMasterId);
// 找出原单关联的细单的商品数量
List<OrderDetail> orderDetailList = orderDetailService.selectByOrderMasterId(orderMasterId);
for (OrderDetail detail : orderDetailList){
// 非一个师傅接单
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())){
masterGoods.setGoodsNum(masterGoods.getGoodsNum() - detailGoods.getGoodsNum());
}
}
}
}
// 有单派完.
for (OrderGoods orderGoods : orderGoodsList) {
if (orderGoods.getGoodsNum() > 0) {
return false;
}
}
return true;
}
}