diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java index f5711442..e85a6cad 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/AfterServiceRecordController.java @@ -108,7 +108,7 @@ public class AfterServiceRecordController extends BaseController { public AjaxResult addSave(@RequestBody AfterServiceRecord afterServiceRecord) { logger.info("新增售后记录:{}", afterServiceRecord); OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); - if(orderDetail.getDrawCashTime() != null){ + if (orderDetail.getDrawCashTime() != null) { return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!"); } return toAjax(afterServiceRecordService.insertAfterServiceRecord(afterServiceRecord)); @@ -134,10 +134,6 @@ public class AfterServiceRecordController extends BaseController { public AjaxResult editSave(@RequestBody AfterServiceRecord afterServiceRecord) { logger.info("修改售后记录:{}", afterServiceRecord); try { - OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); - if(orderDetail.getDrawCashTime() != null){ - return AjaxResult.error("已发起分账子单,请联系师傅处理线下售后!"); - } return toAjax(afterServiceRecordService.updateAfterServiceRecord(afterServiceRecord)); } catch (Exception exception) { logger.error(ExceptionUtils.getStackTrace(exception)); diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java index 5ca8ad81..9474f74b 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java @@ -292,6 +292,7 @@ public class OrderController extends BaseController { @ResponseBody @Transactional(rollbackFor = Exception.class) public AjaxResult assign(@RequestBody AppOrderAssignRequest request) throws BaseAdaPayException { + logger.info("分配订单请求参数:{}", request); OrderMaster om = orderMasterService.selectById(request.getOrderMasterId()); Assert.notNull(om, "订单不存在"); FinancialMaster fm = financialMasterService.selectByOrderMasterId(om.getId()); @@ -689,7 +690,7 @@ public class OrderController extends BaseController { response.setServingOrderNum(orderDetailService.countOrderDetailList(orderDetail)); // 统计待确认单量 orderDetail.setOrderStatus(null); - orderDetail.setOrderStatusList(new ArrayList(){{ + orderDetail.setOrderStatusList(new ArrayList() {{ add(4); add(5); }}); diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java index bbd842bd..6772f803 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/AfterServiceRecordServiceImpl.java @@ -6,6 +6,7 @@ import com.ghy.common.core.text.Convert; import com.ghy.common.enums.PayStatus; import com.ghy.common.enums.RefundType; import com.ghy.common.exception.base.BaseException; +import com.ghy.common.utils.AdapayUtils; import com.ghy.common.utils.ObjectUtils; import com.ghy.order.domain.AfterServiceImgs; import com.ghy.order.domain.AfterServiceRecord; @@ -140,6 +141,8 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService private int agreeRefund(AfterServiceRecord afterServiceRecord) throws BaseAdaPayException { OrderDetail orderDetail = orderDetailService.selectById(afterServiceRecord.getOrderDetailId()); Assert.notNull(orderDetail, "子单不存在!"); + // DrawCashTime不为空说明已经发起过分账 + Assert.isTrue(orderDetail.getDrawCashTime() == null, "子单已发起分账,请联系师傅处理线下售后!"); FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(afterServiceRecord.getOrderDetailId()); Assert.notNull(financialDetail, "财务子单不存在!"); OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId()); @@ -155,34 +158,84 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } else { refundMoney = afterServiceRecord.getRefund(); } - if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) { - // 申请退款金额 < 子单金额 - afterServiceRecord.setOriginalRefund(refundMoney); - financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney)); - financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney)); - // 更新主/子财务单金额 - financialMasterService.updateFinancialMaster(financialMaster); - financialDetailService.updateFinancialDetail(financialDetail); - // 发起支付撤销 - JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), - String.valueOf(refundMoney), 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("发起退款失败"); + + // 是不是大师傅的子单 + boolean isMaster = orderMaster.getWorkerId().equals(orderDetail.getWorkerId()); + if (isMaster) { + // 如果这是大师傅的子单 退款金额最大可以等于主单服务金额 + // 判断退款金额 >= 主单服务金额 + boolean refundAll = refundMoney.compareTo(financialMaster.getServerMoney()) > -1; + List orderDetails = orderDetailService.selectByOrderMasterId(orderMaster.getId()); + // 判断是否有派单给子师傅 + boolean noneSubWorker = true; + for (OrderDetail od : orderDetails) { + if (!orderMaster.getWorkerId().equals(od.getWorkerId())) { + noneSubWorker = false; + break; } } + 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 { - // 子单全额退款 直接走取消流程 - orderDetailService.cancelAgree(orderDetail.getId(), 1); - afterServiceRecord.setOriginalRefund(financialDetail.getPayMoney()); + // 是子师傅的子单 退款金额最大可以等于子单的派单金额 + if (refundMoney.compareTo(financialDetail.getPayMoney()) > -1) { + // 子单全额退款 直接走取消流程 + 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()); 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("发起退款失败"); + } + } + } + /** * 批量删除售后记录 * diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java index d27cffff..ca36098b 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java @@ -303,7 +303,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { // 先把这个子单的加价单全退了 for (FinancialChangeRecord fcr : fcrList) { 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()); detailMoney = detailMoney.subtract(fcr.getChangeMoney()); diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index 9396739f..91551444 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -311,7 +311,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { orderDetailService.updateByOrderMasterId(update); // 发起退款 -- 如果是未付款的单,不需要退款 FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMasterId); - if(PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())){ + if (PayStatus.PAID.getCode().equals(financialMaster.getPayStatus())) { refund(orderMaster); } break; @@ -381,14 +381,12 @@ public class OrderMasterServiceImpl implements OrderMasterService { Assert.isTrue(paid, "订单未支付"); Assert.hasText(financialMaster.getPaymentId(), "找不到订单的支付记录,请联系管理员"); - // 改主订单的订单状态和支付状态 - updateStatus(orderMasterId, OrderStatus.CANCEL.code()); + // 改主订单的支付状态 updatePayStatus(orderMasterId, PayStatus.REFUND.getCode()); - // 改子订单的订单状态和支付状态 + // 改子订单的支付状态 OrderDetail odUpdate = new OrderDetail(); odUpdate.setOrderMasterId(orderMasterId); odUpdate.setPayStatus(PayStatus.REFUND.getCode()); - odUpdate.setOrderStatus(OrderStatus.CANCEL.code()); orderDetailService.updateByOrderMasterId(odUpdate); // 主订单金额=订单原价+加价 @@ -396,40 +394,37 @@ public class OrderMasterServiceImpl implements OrderMasterService { List fcrList = financialChangeRecordService.selectByMasterId(orderMasterId); for (FinancialChangeRecord fcr : fcrList) { // 把已支付的加价单退了 并从主单金额里减去 - if (PayStatus.PAID.getCode().equals(fcr.getPayStatus())) { - financialChangeRecordService.refund(orderMaster.getDeptId(), fcr); + if (financialChangeRecordService.refund(orderMaster.getDeptId(), fcr.getId())) { payMoney = payMoney.subtract(fcr.getChangeMoney()); } } + + // 修改主财务单状态 + financialMasterService.updatePayStatus(financialMaster.getId(), PayStatus.REVERSING.getCode()); + // 修改子财务单状态 List fdList = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); for (FinancialDetail fd : fdList) { - // 如果有已退款或正在退款的子财务单 从主单金额里减去 - if (PayStatus.REFUND.getCode().equals(fd.getPayStatus()) || - 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 (PayStatus.PAID.getCode().equals(fd.getPayStatus())) { + financialDetailService.updatePayStatus(fd.getId(), PayStatus.REFUND.getCode()); } } if (payMoney.compareTo(BigDecimal.ZERO) < 1) { - logger.info("无需退款 reverseAmt={}", payMoney); + logger.info("主订单[{}]无需退款 reverseAmt={}", orderMasterId, payMoney); } String reverseAmt = payMoney.setScale(2, RoundingMode.DOWN).toString(); JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), reverseAmt, RefundType.ROM); if (AdapayStatusEnum.succeeded.code.equals(response.getString("status")) || AdapayStatusEnum.pending.code.equals(response.getString("status"))) { - // 主订单退款 直接修改主财务单状态为退款中 + // 保存reverseId String reverseId = response.getString("id"); - financialMaster.setPayStatus(PayStatus.REVERSING.getCode()); - financialMaster.setReverseId(reverseId); - financialMasterService.updateFinancialMaster(financialMaster); + FinancialMaster fm2up = new FinancialMaster(); + fm2up.setId(financialMaster.getId()); + fm2up.setReverseId(reverseId); + financialMasterService.updateFinancialMaster(fm2up); } else { - logger.error("FM[{}]撤销支付失败: {}", financialMaster.getId(), response.toJSONString()); + logger.error("主订单[{}]退款失败: {}", orderMasterId, response); } } diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialMasterMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialMasterMapper.java index 3234f01f..0cca9271 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialMasterMapper.java +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialMasterMapper.java @@ -84,4 +84,6 @@ public interface FinancialMasterMapper { * @param reverseId 撤销支付ID */ void refundSucceeded(@Param("reverseId") String reverseId); + + int updatePayStatus(@Param(value = "id") Long id, @Param(value = "payStatus") int payStatus); } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialChangeRecordService.java b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialChangeRecordService.java index 5b96f4b7..53e2f45d 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialChangeRecordService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialChangeRecordService.java @@ -75,9 +75,9 @@ public interface FinancialChangeRecordService { * 但不修改财务单的金额
* * @param deptId 公司ID - * @param fcr 加价单 + * @param id 加价单ID */ - boolean refund(Long deptId, FinancialChangeRecord fcr); + boolean refund(Long deptId, Long id); /** * 退款成功时 退款回调接口里会调用这个方法 diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java index 4393a53d..a3206245 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialMasterService.java @@ -100,4 +100,6 @@ public interface FinancialMasterService { FinancialMaster selectByPaymentId(String paymentId); void refundSucceeded(String reverseId); + + int updatePayStatus(Long id, int payStatus); } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialChangeRecordServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialChangeRecordServiceImpl.java index 5da93419..cbec6439 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialChangeRecordServiceImpl.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialChangeRecordServiceImpl.java @@ -132,7 +132,11 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe } @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(); update.setId(fcr.getId()); update.setPayStatus(PayStatus.REFUNDING.getCode()); @@ -144,7 +148,8 @@ public class FinancialChangeRecordServiceImpl implements FinancialChangeRecordSe try { response = adapayService.payReverse(deptId, fcr.getPaymentId(), reverseAmt, RefundType.RCG); } catch (BaseAdaPayException e) { - throw new RuntimeException(e); + log.error("加价单退款失败: {}", e.getMessage(), e); + return false; } boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")) || AdapayStatusEnum.pending.code.equals(response.getString("status")); diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java index 95b0b9d4..e15ba468 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialMasterServiceImpl.java @@ -160,6 +160,11 @@ public class FinancialMasterServiceImpl implements FinancialMasterService { financialMasterMapper.refundSucceeded(reverseId); } + @Override + public int updatePayStatus(Long id, int payStatus) { + return financialMasterMapper.updatePayStatus(id, payStatus); + } + @Override public List selectByOrderMasterIds(Set orderMasterIds) { if (CollectionUtils.isEmpty(orderMasterIds)) { diff --git a/ghy-payment/src/main/resources/mapper/financial/FinancialMasterMapper.xml b/ghy-payment/src/main/resources/mapper/financial/FinancialMasterMapper.xml index e3967394..eef76ed5 100644 --- a/ghy-payment/src/main/resources/mapper/financial/FinancialMasterMapper.xml +++ b/ghy-payment/src/main/resources/mapper/financial/FinancialMasterMapper.xml @@ -140,6 +140,13 @@ WHERE reverse_id = #{reverseId} + + UPDATE financial_master SET + pay_status = #{payStatus} , + update_time = NOW() + WHERE id = #{id} + + INSERT INTO financial_master( dept_id,