当客户申请退款大师傅手中所有金额时:

如果派了单给子师傅,就不全退。
如果没有派单给子师傅,就全退。
This commit is contained in:
Hawking 2023-04-20 00:49:09 +08:00
parent 8d3a159405
commit fb30737591
11 changed files with 119 additions and 53 deletions

View File

@ -108,7 +108,7 @@ public class AfterServiceRecordController extends BaseController {
public AjaxResult addSave(@RequestBody AfterServiceRecord afterServiceRecord) { public AjaxResult addSave(@RequestBody AfterServiceRecord afterServiceRecord) {
logger.info("新增售后记录:{}", afterServiceRecord); logger.info("新增售后记录:{}", afterServiceRecord);
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
if(orderDetail.getDrawCashTime() != null){ if (orderDetail.getDrawCashTime() != null) {
return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!"); return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!");
} }
return toAjax(afterServiceRecordService.insertAfterServiceRecord(afterServiceRecord)); return toAjax(afterServiceRecordService.insertAfterServiceRecord(afterServiceRecord));
@ -134,10 +134,6 @@ public class AfterServiceRecordController extends BaseController {
public AjaxResult editSave(@RequestBody AfterServiceRecord afterServiceRecord) { public AjaxResult editSave(@RequestBody AfterServiceRecord afterServiceRecord) {
logger.info("修改售后记录:{}", afterServiceRecord); logger.info("修改售后记录:{}", afterServiceRecord);
try { try {
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
if(orderDetail.getDrawCashTime() != null){
return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!");
}
return toAjax(afterServiceRecordService.updateAfterServiceRecord(afterServiceRecord)); return toAjax(afterServiceRecordService.updateAfterServiceRecord(afterServiceRecord));
} catch (Exception exception) { } catch (Exception exception) {
logger.error(ExceptionUtils.getStackTrace(exception)); logger.error(ExceptionUtils.getStackTrace(exception));

View File

@ -292,6 +292,7 @@ public class OrderController extends BaseController {
@ResponseBody @ResponseBody
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public AjaxResult assign(@RequestBody AppOrderAssignRequest request) throws BaseAdaPayException { public AjaxResult assign(@RequestBody AppOrderAssignRequest request) throws BaseAdaPayException {
logger.info("分配订单请求参数:{}", request);
OrderMaster om = orderMasterService.selectById(request.getOrderMasterId()); OrderMaster om = orderMasterService.selectById(request.getOrderMasterId());
Assert.notNull(om, "订单不存在"); Assert.notNull(om, "订单不存在");
FinancialMaster fm = financialMasterService.selectByOrderMasterId(om.getId()); FinancialMaster fm = financialMasterService.selectByOrderMasterId(om.getId());
@ -689,7 +690,7 @@ public class OrderController extends BaseController {
response.setServingOrderNum(orderDetailService.countOrderDetailList(orderDetail)); response.setServingOrderNum(orderDetailService.countOrderDetailList(orderDetail));
// 统计待确认单量 // 统计待确认单量
orderDetail.setOrderStatus(null); orderDetail.setOrderStatus(null);
orderDetail.setOrderStatusList(new ArrayList<Integer>(){{ orderDetail.setOrderStatusList(new ArrayList<Integer>() {{
add(4); add(4);
add(5); add(5);
}}); }});

View File

@ -6,6 +6,7 @@ import com.ghy.common.core.text.Convert;
import com.ghy.common.enums.PayStatus; import com.ghy.common.enums.PayStatus;
import com.ghy.common.enums.RefundType; import com.ghy.common.enums.RefundType;
import com.ghy.common.exception.base.BaseException; import com.ghy.common.exception.base.BaseException;
import com.ghy.common.utils.AdapayUtils;
import com.ghy.common.utils.ObjectUtils; import com.ghy.common.utils.ObjectUtils;
import com.ghy.order.domain.AfterServiceImgs; import com.ghy.order.domain.AfterServiceImgs;
import com.ghy.order.domain.AfterServiceRecord; import com.ghy.order.domain.AfterServiceRecord;
@ -140,6 +141,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
private int agreeRefund(AfterServiceRecord afterServiceRecord) throws BaseAdaPayException { private int agreeRefund(AfterServiceRecord afterServiceRecord) throws BaseAdaPayException {
OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId());
Assert.notNull(orderDetail, "子单不存在!"); Assert.notNull(orderDetail, "子单不存在!");
// DrawCashTime不为空说明已经发起过分账
Assert.isTrue(orderDetail.getDrawCashTime() == null, "子单已发起分账,请联系师傅处理线下售后!");
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId()); FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId());
Assert.notNull(financialDetail, "财务子单不存在!"); Assert.notNull(financialDetail, "财务子单不存在!");
OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId()); OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId());
@ -155,34 +158,84 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService
} else { } else {
refundMoney = afterServiceRecord.getRefund(); refundMoney = afterServiceRecord.getRefund();
} }
if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) {
// 申请退款金额 < 子单金额 // 是不是大师傅的子单
afterServiceRecord.setOriginalRefund(refundMoney); boolean isMaster = orderMaster.getWorkerId().equals(orderDetail.getWorkerId());
financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney)); if (isMaster) {
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney)); // 如果这是大师傅的子单 退款金额最大可以等于主单服务金额
// 更新主/子财务单金额 // 判断退款金额 >= 主单服务金额
financialMasterService.updateFinancialMaster(financialMaster); boolean refundAll = refundMoney.compareTo(financialMaster.getServerMoney()) > -1;
financialDetailService.updateFinancialDetail(financialDetail); List<OrderDetail> orderDetails = orderDetailService.selectByOrderMasterId(orderMaster.getId());
// 发起支付撤销 // 判断是否有派单给子师傅
JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), boolean noneSubWorker = true;
String.valueOf(refundMoney), RefundType.RAS); for (OrderDetail od : orderDetails) {
if (!AdapayStatusEnum.pending.code.equals(response.getString("status"))) { if (!orderMaster.getWorkerId().equals(od.getWorkerId())) {
log.error("发起退款异常,异常信息:{}", response); noneSubWorker = false;
if ("reverse_amt_over".equals(response.getString("error_code"))) { break;
throw new BaseException("退款金额超出订单金额");
} else {
throw new BaseException("发起退款失败");
} }
} }
if (refundAll && noneSubWorker) {
// 如果退款金额 >= 主单服务金额 并且 没有派单给子师傅 则退整个主单
orderMasterService.cancelAgree(orderMaster.getId(), 1);
afterServiceRecord.setOriginalRefund(financialMaster.getPayMoney());
} else if (refundAll) {
// 如果退款金额 >= 主单服务金额 但是有派单给子师傅
afterServiceRecord.setOriginalRefund(financialMaster.getServerMoney());
// 退款金额就是主单服务金额
String reverseAmt = AdapayUtils.bigDecimalToString(financialMaster.getServerMoney());
// 更新主财务单 PayMoney=PayMoney-ServerMoney ServerMoney=0
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(financialMaster.getServerMoney()));
financialMaster.setServerMoney(BigDecimal.ZERO);
financialMasterService.updateFinancialMaster(financialMaster);
// 发起支付撤销
payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt);
} else {
// 如果退款金额 < 主单服务金额
afterServiceRecord.setOriginalRefund(refundMoney);
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
financialMaster.setServerMoney(financialMaster.getServerMoney().subtract(refundMoney));
financialMasterService.updateFinancialMaster(financialMaster);
String reverseAmt = AdapayUtils.bigDecimalToString(refundMoney);
// 发起支付撤销
payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt);
}
} else { } else {
// 子单全额退款 直接走取消流程 // 是子师傅的子单 退款金额最大可以等于子单的派单金额
orderDetailService.cancelAgree(orderDetail.getId(), 1); if (refundMoney.compareTo(financialDetail.getPayMoney()) > -1) {
afterServiceRecord.setOriginalRefund(financialDetail.getPayMoney()); // 子单全额退款 直接走取消流程
orderDetailService.cancelAgree(orderDetail.getId(), 1);
afterServiceRecord.setOriginalRefund(financialDetail.getPayMoney());
} else {
afterServiceRecord.setOriginalRefund(refundMoney);
financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney));
financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney));
// 更新主/子财务单金额
financialMasterService.updateFinancialMaster(financialMaster);
financialDetailService.updateFinancialDetail(financialDetail);
// 发起支付撤销
String reverseAmt = AdapayUtils.bigDecimalToString(financialMaster.getServerMoney());
payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt);
}
} }
afterServiceRecord.setRefundApplyTime(new Date()); afterServiceRecord.setRefundApplyTime(new Date());
return afterServiceRecordMapper.updateAfterServiceRecord(afterServiceRecord); return afterServiceRecordMapper.updateAfterServiceRecord(afterServiceRecord);
} }
private void payReverse(Long deptId, String paymentId, String reverseAmt) throws BaseAdaPayException {
JSONObject response = adapayService.payReverse(deptId, paymentId, reverseAmt, RefundType.RAS);
if (!AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
log.error("发起退款异常,异常信息:{}", response);
if ("reverse_amt_over".equals(response.getString("error_code"))) {
throw new BaseException("退款金额超出订单金额");
} else {
throw new BaseException("发起退款失败");
}
}
}
/** /**
* 批量删除售后记录 * 批量删除售后记录
* *

View File

@ -303,7 +303,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
// 先把这个子单的加价单全退了 // 先把这个子单的加价单全退了
for (FinancialChangeRecord fcr : fcrList) { for (FinancialChangeRecord fcr : fcrList) {
if (PayStatus.PAID.getCode().equals(fcr.getPayStatus()) || PayStatus.PAYED_ADD.getCode().equals(fcr.getPayStatus())) { if (PayStatus.PAID.getCode().equals(fcr.getPayStatus()) || PayStatus.PAYED_ADD.getCode().equals(fcr.getPayStatus())) {
executor.execute(() -> financialChangeRecordService.refund(orderMaster.getDeptId(), fcr)); executor.execute(() -> financialChangeRecordService.refund(orderMaster.getDeptId(), fcr.getId()));
// /子财务单里也加上了加价单的金额 所以这里减掉 // /子财务单里也加上了加价单的金额 所以这里减掉
masterMoney = masterMoney.subtract(fcr.getChangeMoney()); masterMoney = masterMoney.subtract(fcr.getChangeMoney());
detailMoney = detailMoney.subtract(fcr.getChangeMoney()); detailMoney = detailMoney.subtract(fcr.getChangeMoney());

View File

@ -311,7 +311,7 @@ public class OrderMasterServiceImpl implements OrderMasterService {
orderDetailService.updateByOrderMasterId(update); orderDetailService.updateByOrderMasterId(update);
// 发起退款 -- 如果是未付款的单不需要退款 // 发起退款 -- 如果是未付款的单不需要退款
FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMasterId); FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMasterId);
if(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())){ if (PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())) {
refund(orderMaster); refund(orderMaster);
} }
break; break;
@ -381,14 +381,12 @@ public class OrderMasterServiceImpl implements OrderMasterService {
Assert.isTrue(paid, "订单未支付"); Assert.isTrue(paid, "订单未支付");
Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员"); Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员");
// 改主订单的订单状态和支付状态 // 改主订单的支付状态
updateStatus(orderMasterId, OrderStatus.CANCEL.code());
updatePayStatus(orderMasterId, PayStatus.REFUND.getCode()); updatePayStatus(orderMasterId, PayStatus.REFUND.getCode());
// 改子订单的订单状态和支付状态 // 改子订单的支付状态
OrderDetail odUpdate = new OrderDetail(); OrderDetail odUpdate = new OrderDetail();
odUpdate.setOrderMasterId(orderMasterId); odUpdate.setOrderMasterId(orderMasterId);
odUpdate.setPayStatus(PayStatus.REFUND.getCode()); odUpdate.setPayStatus(PayStatus.REFUND.getCode());
odUpdate.setOrderStatus(OrderStatus.CANCEL.code());
orderDetailService.updateByOrderMasterId(odUpdate); orderDetailService.updateByOrderMasterId(odUpdate);
// 主订单金额=订单原价+加价 // 主订单金额=订单原价+加价
@ -396,40 +394,37 @@ public class OrderMasterServiceImpl implements OrderMasterService {
List<FinancialChangeRecord> fcrList = financialChangeRecordService.selectByMasterId(orderMasterId); List<FinancialChangeRecord> fcrList = financialChangeRecordService.selectByMasterId(orderMasterId);
for (FinancialChangeRecord fcr : fcrList) { for (FinancialChangeRecord fcr : fcrList) {
// 把已支付的加价单退了 并从主单金额里减去 // 把已支付的加价单退了 并从主单金额里减去
if (PayStatus.PAID.getCode().equals(fcr.getPayStatus())) { if (financialChangeRecordService.refund(orderMaster.getDeptId(), fcr.getId())) {
financialChangeRecordService.refund(orderMaster.getDeptId(), fcr);
payMoney = payMoney.subtract(fcr.getChangeMoney()); payMoney = payMoney.subtract(fcr.getChangeMoney());
} }
} }
// 修改主财务单状态
financialMasterService.updatePayStatus(financialMaster.getId(), PayStatus.REVERSING.getCode());
// 修改子财务单状态
List<FinancialDetail> fdList = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); List<FinancialDetail> fdList = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
for (FinancialDetail fd : fdList) { for (FinancialDetail fd : fdList) {
// 如果有已退款或正在退款的子财务单 从主单金额里减去 if (PayStatus.PAID.getCode().equals(fd.getPayStatus())) {
if (PayStatus.REFUND.getCode().equals(fd.getPayStatus()) || financialDetailService.updatePayStatus(fd.getId(), PayStatus.REFUND.getCode());
PayStatus.REFUNDING.getCode().equals(fd.getPayStatus()) ||
PayStatus.REVERSING.getCode().equals(fd.getPayStatus())) {
payMoney = payMoney.subtract(fd.getPayMoney());
} else if (PayStatus.PAID.getCode().equals(fd.getPayStatus()) ||
PayStatus.PAYED_ADD.getCode().equals(fd.getPayStatus())) {
// 修改子单状态
financialDetailService.updatePayStatus(fd.getId(), PayStatus.REVERSING.getCode());
} }
} }
if (payMoney.compareTo(BigDecimal.ZERO) < 1) { if (payMoney.compareTo(BigDecimal.ZERO) < 1) {
logger.info("无需退款 reverseAmt={}", payMoney); logger.info("主订单[{}]无需退款 reverseAmt={}", orderMasterId, payMoney);
} }
String reverseAmt = payMoney.setScale(2, RoundingMode.DOWN).toString(); String reverseAmt = payMoney.setScale(2, RoundingMode.DOWN).toString();
JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt, RefundType.ROM); JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt, RefundType.ROM);
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status")) || if (AdapayStatusEnum.succeeded.code.equals(response.getString("status")) ||
AdapayStatusEnum.pending.code.equals(response.getString("status"))) { AdapayStatusEnum.pending.code.equals(response.getString("status"))) {
// 主订单退款 直接修改主财务单状态为退款中 // 保存reverseId
String reverseId = response.getString("id"); String reverseId = response.getString("id");
financialMaster.setPayStatus(PayStatus.REVERSING.getCode()); FinancialMaster fm2up = new FinancialMaster();
financialMaster.setReverseId(reverseId); fm2up.setId(financialMaster.getId());
financialMasterService.updateFinancialMaster(financialMaster); fm2up.setReverseId(reverseId);
financialMasterService.updateFinancialMaster(fm2up);
} else { } else {
logger.error("FM[{}]撤销支付失败: {}", financialMaster.getId(), response.toJSONString()); logger.error("主订单[{}]退款失败: {}", orderMasterId, response);
} }
} }

View File

@ -84,4 +84,6 @@ public interface FinancialMasterMapper {
* @param reverseId 撤销支付ID * @param reverseId 撤销支付ID
*/ */
void refundSucceeded(@Param("reverseId") String reverseId); void refundSucceeded(@Param("reverseId") String reverseId);
int updatePayStatus(@Param(value = "id") Long id, @Param(value = "payStatus") int payStatus);
} }

View File

@ -75,9 +75,9 @@ public interface FinancialChangeRecordService {
* 但不修改财务单的金额<br> * 但不修改财务单的金额<br>
* *
* @param deptId 公司ID * @param deptId 公司ID
* @param fcr 加价单 * @param id 加价单ID
*/ */
boolean refund(Long deptId, FinancialChangeRecord fcr); boolean refund(Long deptId, Long id);
/** /**
* 退款成功时 退款回调接口里会调用这个方法 * 退款成功时 退款回调接口里会调用这个方法

View File

@ -100,4 +100,6 @@ public interface FinancialMasterService {
FinancialMaster selectByPaymentId(String paymentId); FinancialMaster selectByPaymentId(String paymentId);
void refundSucceeded(String reverseId); void refundSucceeded(String reverseId);
int updatePayStatus(Long id, int payStatus);
} }

View File

@ -132,7 +132,11 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe
} }
@Override @Override
public boolean refund(Long deptId, FinancialChangeRecord fcr) { public boolean refund(Long deptId, Long id) {
FinancialChangeRecord fcr = selectFinancialChangeRecordById(id);
if (fcr == null) {
return false;
}
FinancialChangeRecord update = new FinancialChangeRecord(); FinancialChangeRecord update = new FinancialChangeRecord();
update.setId(fcr.getId()); update.setId(fcr.getId());
update.setPayStatus(PayStatus.REFUNDING.getCode()); update.setPayStatus(PayStatus.REFUNDING.getCode());
@ -144,7 +148,8 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe
try { try {
response = adapayService.payReverse(deptId, fcr.getPaymentId(), reverseAmt, RefundType.RCG); response = adapayService.payReverse(deptId, fcr.getPaymentId(), reverseAmt, RefundType.RCG);
} catch (BaseAdaPayException e) { } catch (BaseAdaPayException e) {
throw new RuntimeException(e); log.error("加价单退款失败: {}", e.getMessage(), e);
return false;
} }
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")) || boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")) ||
AdapayStatusEnum.pending.code.equals(response.getString("status")); AdapayStatusEnum.pending.code.equals(response.getString("status"));

View File

@ -160,6 +160,11 @@ public class FinancialMasterServiceImpl implements FinancialMasterService {
financialMasterMapper.refundSucceeded(reverseId); financialMasterMapper.refundSucceeded(reverseId);
} }
@Override
public int updatePayStatus(Long id, int payStatus) {
return financialMasterMapper.updatePayStatus(id, payStatus);
}
@Override @Override
public List<FinancialMaster> selectByOrderMasterIds(Set<Long> orderMasterIds) { public List<FinancialMaster> selectByOrderMasterIds(Set<Long> orderMasterIds) {
if (CollectionUtils.isEmpty(orderMasterIds)) { if (CollectionUtils.isEmpty(orderMasterIds)) {

View File

@ -140,6 +140,13 @@
WHERE reverse_id = #{reverseId} WHERE reverse_id = #{reverseId}
</update> </update>
<update id="updatePayStatus">
UPDATE financial_master SET
pay_status = #{payStatus} ,
update_time = NOW()
WHERE id = #{id}
</update>
<insert id="insertFinancialMaster" parameterType="com.ghy.payment.domain.FinancialMaster" useGeneratedKeys="true" keyProperty="id"> <insert id="insertFinancialMaster" parameterType="com.ghy.payment.domain.FinancialMaster" useGeneratedKeys="true" keyProperty="id">
INSERT INTO financial_master( INSERT INTO financial_master(
<if test="deptId != null">dept_id,</if> <if test="deptId != null">dept_id,</if>