From cb5b49ee357913032080e8d8d41cd0d6ba13771e Mon Sep 17 00:00:00 2001 From: HH Date: Fri, 22 Jul 2022 22:25:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=90=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E8=B5=B7=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/OrderDetailController.java | 40 ++++- .../java/com/ghy/common/enums/PayStatus.java | 3 +- .../ghy/order/mapper/OrderDetailMapper.java | 17 +- .../ghy/order/service/OrderDetailService.java | 22 +++ .../ghy/order/service/OrderMasterService.java | 9 -- .../service/impl/OrderDetailServiceImpl.java | 151 ++++++++++++++++-- .../service/impl/OrderMasterServiceImpl.java | 62 +++++-- .../mapper/order/OrderDetailMapper.xml | 16 ++ .../ghy/payment/domain/FinancialDetail.java | 4 +- .../payment/mapper/FinancialDetailMapper.java | 8 + .../service/FinancialDetailService.java | 8 + .../impl/FinancialDetailServiceImpl.java | 5 + .../impl/PayReverseCallbackService.java | 2 +- .../financial/FinancialDetailMapper.xml | 15 +- 14 files changed, 317 insertions(+), 45 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java index eada63d7..4cce7371 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderDetailController.java @@ -23,7 +23,6 @@ import com.ghy.order.service.OrderDetailService; import com.ghy.order.service.OrderGoodsService; import com.ghy.order.service.OrderMasterService; import com.ghy.payment.domain.FinancialDetail; -import com.ghy.payment.domain.FinancialMaster; import com.ghy.payment.service.FinancialDetailService; import com.ghy.system.domain.SysArea; import com.ghy.system.service.ISysAreaService; @@ -80,7 +79,7 @@ public class OrderDetailController extends BaseController { return prefix; } -// @RequiresPermissions("order:detail:list") + // @RequiresPermissions("order:detail:list") @PostMapping("/list") @ResponseBody public TableDataInfo list(OrderDetail orderDetail) { @@ -91,7 +90,7 @@ public class OrderDetailController extends BaseController { @PostMapping("/app/detail") @ResponseBody - public AjaxResult appDetail(@RequestBody OrderDetail request){ + public AjaxResult appDetail(@RequestBody OrderDetail request) { try { // 子单信息 OrderDetail detail = orderDetailService.selectById(request.getId()); @@ -123,7 +122,7 @@ public class OrderDetailController extends BaseController { SysArea sysArea = sysAreaService.selectById(customerAddress.getCountryId()); String completeAddress = sysArea.getMergerName().replaceAll(",", "") + customerAddress.getAddress(); - for(OrderGoods orderGoods : orderStandardList){ + for (OrderGoods orderGoods : orderStandardList) { OrderStandard orderStandard = new OrderStandard(); orderStandard.setStandardName(orderGoods.getGoodsName()); orderStandard.setStandardNum(orderGoods.getGoodsNum()); @@ -161,7 +160,7 @@ public class OrderDetailController extends BaseController { orderListResponse.setCustomerRemark(orderMaster.getRemark()); return AjaxResult.success(orderListResponse); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); logger.error(ExceptionUtil.getExceptionMessage(e)); return AjaxResult.error(); @@ -170,12 +169,12 @@ public class OrderDetailController extends BaseController { @PostMapping("/app/list") @ResponseBody - public TableDataInfo appList(@RequestBody OrderDetail orderDetail){ + public TableDataInfo appList(@RequestBody OrderDetail orderDetail) { startPage(); List orderListResponses = new ArrayList<>(); List list = orderDetailService.selectOrderDetailList(orderDetail); - list.forEach(detail->{ + list.forEach(detail -> { // 主单信息 OrderMaster orderMaster = orderMasterService.selectById(detail.getOrderMasterId()); @@ -205,7 +204,7 @@ public class OrderDetailController extends BaseController { SysArea sysArea = sysAreaService.selectById(customerAddress.getCountryId()); String completeAddress = sysArea.getMergerName().replaceAll(",", "") + customerAddress.getAddress(); - for(OrderGoods orderGoods : orderStandardList){ + for (OrderGoods orderGoods : orderStandardList) { OrderStandard orderStandard = new OrderStandard(); orderStandard.setStandardName(orderGoods.getGoodsName()); orderStandard.setStandardNum(orderGoods.getGoodsNum()); @@ -313,4 +312,29 @@ public class OrderDetailController extends BaseController { public String checkOrderDetailCodeUnique(OrderDetail orderDetail) { return orderDetailService.checkOrderDetailCodeUnique(orderDetail); } + + /** + * 消费者申请取消子订单 + * + * @param orderDetailId 子订单ID + */ + @PostMapping("/cancel") + @ResponseBody + public AjaxResult cancel(Long orderDetailId) { + orderDetailService.cancel(orderDetailId); + return AjaxResult.success(); + } + + /** + * 师傅审核取消子订单申请 + * + * @param orderDetailId 子订单ID + * @param agree 0=不同意 1=同意 + */ + @PostMapping("/cancel/agree") + @ResponseBody + public AjaxResult cancelAgree(Long orderDetailId, Integer agree) { + orderDetailService.cancelAgree(orderDetailId, agree); + return AjaxResult.success(); + } } diff --git a/ghy-common/src/main/java/com/ghy/common/enums/PayStatus.java b/ghy-common/src/main/java/com/ghy/common/enums/PayStatus.java index 978fb023..3fcd81ed 100644 --- a/ghy-common/src/main/java/com/ghy/common/enums/PayStatus.java +++ b/ghy-common/src/main/java/com/ghy/common/enums/PayStatus.java @@ -8,7 +8,8 @@ public enum PayStatus { WAIT_PAY(0, "待支付"), PAID(1, "已支付"), - CANCEL(2, "已取消"); + CANCEL(2, "已取消"), + REFUND(3, "已退款"); private final Integer code; private final String desc; diff --git a/ghy-order/src/main/java/com/ghy/order/mapper/OrderDetailMapper.java b/ghy-order/src/main/java/com/ghy/order/mapper/OrderDetailMapper.java index 3adead48..ee2243f6 100644 --- a/ghy-order/src/main/java/com/ghy/order/mapper/OrderDetailMapper.java +++ b/ghy-order/src/main/java/com/ghy/order/mapper/OrderDetailMapper.java @@ -1,7 +1,6 @@ package com.ghy.order.mapper; import com.ghy.order.domain.OrderDetail; -import com.ghy.order.domain.OrderGoods; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -64,4 +63,20 @@ public interface OrderDetailMapper { * @return OrderDetail实体集合信息。 */ List getByOrderIdList(@Param("orderIdList") List orderIdList); + + /** + * 更新子订单状态 + * + * @param orderDetailId 子订单ID + * @param orderStatus 状态码 + */ + int updateStatus(@Param("id") Long orderDetailId, @Param("orderStatus") int orderStatus); + + /** + * 通过主订单ID批量更新子订单 + * 可更新字段: orderStatus + * + * @param orderDetail 子订单 + */ + int updateByOrderMasterId(OrderDetail orderDetail); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/OrderDetailService.java b/ghy-order/src/main/java/com/ghy/order/service/OrderDetailService.java index 1a649b74..72ab7a8e 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/OrderDetailService.java +++ b/ghy-order/src/main/java/com/ghy/order/service/OrderDetailService.java @@ -70,4 +70,26 @@ public interface OrderDetailService { */ Map> byOrderIdInMap(List orderIdList); + /** + * 消费者申请取消子订单 + * + * @param orderDetailId 子订单ID + */ + void cancel(Long orderDetailId); + + /** + * 师傅审核取消子订单申请 + * + * @param orderDetailId 子订单ID + * @param agree 0=不同意 1=同意 + */ + void cancelAgree(Long orderDetailId, Integer agree); + + /** + * 通过主订单ID批量更新子订单 + * 可更新字段: orderStatus + * + * @param orderDetail 子订单 + */ + void updateByOrderMasterId(OrderDetail orderDetail); } diff --git a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java index 3d5432a4..3d435eaa 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java +++ b/ghy-order/src/main/java/com/ghy/order/service/OrderMasterService.java @@ -85,15 +85,6 @@ public interface OrderMasterService { */ void finish(Long orderMasterId) throws BaseAdaPayException; - /** - * 发起提现 - * - * @param deptId 公司ID - * @param memberId Adapay实名账户ID - * @param amount 提现金额 - */ - void drawCash(Long deptId, String memberId, String amount) throws BaseAdaPayException; - /** * 消费者申请取消主订单 * 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 9ac184f6..97561861 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 @@ -1,16 +1,32 @@ package com.ghy.order.service.impl; +import com.alibaba.fastjson.JSONObject; +import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.constant.UserConstants; import com.ghy.common.core.text.Convert; import com.ghy.common.enums.OrderStatus; +import com.ghy.common.enums.PayStatus; +import com.ghy.common.utils.AdapayUtils; import com.ghy.order.domain.OrderDetail; import com.ghy.order.domain.OrderMaster; import com.ghy.order.mapper.OrderDetailMapper; import com.ghy.order.mapper.OrderMasterMapper; import com.ghy.order.service.OrderDetailService; +import com.ghy.order.service.OrderMasterService; +import com.ghy.payment.domain.FinancialDetail; +import com.ghy.payment.domain.FinancialMaster; +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.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; @@ -21,11 +37,12 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import static java.time.temporal.ChronoField.*; -import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; @Service public class OrderDetailServiceImpl implements OrderDetailService { + private static final Logger logger = LoggerFactory.getLogger(OrderDetailServiceImpl.class); + private static final AtomicLong INDEX = new AtomicLong(1L); public static final DateTimeFormatter MINI_FORMATTER = new DateTimeFormatterBuilder() @@ -35,9 +52,16 @@ public class OrderDetailServiceImpl implements OrderDetailService { @Resource private OrderDetailMapper orderDetailMapper; - @Resource private OrderMasterMapper orderMasterMapper; + @Resource + private AdapayService adapayService; + @Resource + private OrderMasterService orderMasterService; + @Resource + private FinancialMasterService financialMasterService; + @Resource + private FinancialDetailService financialDetailService; @Override public int insertOrderDetail(OrderDetail orderDetail) { @@ -46,7 +70,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { @Override public int updateOrderDetail(OrderDetail orderDetail) { - if(orderDetail.getOrderStatus() == null){ + if (orderDetail.getOrderStatus() == null) { return orderDetailMapper.updateOrderDetail(orderDetail); } int orderStatus = orderDetail.getOrderStatus(); @@ -60,9 +84,9 @@ public class OrderDetailServiceImpl implements OrderDetailService { flag = false; } } - if(flag){ + if (flag) { OrderMaster orderMaster = orderMasterMapper.selectById(detailInfo.getOrderMasterId()); - if(orderMaster.getOrderStatus() != OrderStatus.PLAIN.code()){ + if (orderMaster.getOrderStatus() != OrderStatus.PLAIN.code()) { orderMaster.setOrderStatus(orderStatus); orderMasterMapper.updateOrderMaster(orderMaster); } @@ -111,16 +135,16 @@ public class OrderDetailServiceImpl implements OrderDetailService { @Override public Map> byOrderIdInMap(List orderIdList) { Map> longByOrderDetailListMap = new HashMap<>(); - if(orderIdList != null && orderIdList.size() > 0){ + if (orderIdList != null && orderIdList.size() > 0) { List orderDetailList = orderDetailMapper.getByOrderIdList(orderIdList); - if(orderDetailList != null && orderDetailList.size() > 0){ - for(OrderDetail orderDetail : orderDetailList){ + if (orderDetailList != null && orderDetailList.size() > 0) { + for (OrderDetail orderDetail : orderDetailList) { List orderDetailListByMapCrw = longByOrderDetailListMap.get(orderDetail.getOrderMasterId()); - if(orderDetailListByMapCrw != null && orderDetailListByMapCrw.size() > 0){ + if (orderDetailListByMapCrw != null && orderDetailListByMapCrw.size() > 0) { List orderDetailListByMapNew = new ArrayList<>(); orderDetailListByMapNew.add(orderDetail); longByOrderDetailListMap.put(orderDetail.getOrderMasterId(), orderDetailListByMapNew); - }else { + } else { List orderDetailListByMapNew = new ArrayList<>(); orderDetailListByMapNew.add(orderDetail); longByOrderDetailListMap.put(orderDetail.getOrderMasterId(), orderDetailListByMapNew); @@ -131,4 +155,111 @@ public class OrderDetailServiceImpl implements OrderDetailService { return longByOrderDetailListMap; } + @Override + @Transactional(rollbackFor = Exception.class) + public void cancel(Long orderDetailId) { + OrderDetail orderDetail = selectById(orderDetailId); + Assert.notNull(orderDetail, "找不到对应的子订单"); + + // 查询出所有的子订单 如果除了这个子订单以外 没有其它未取消的订单 就走主订单取消流程 + List 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; + } + } + } + if (allCancel) { + logger.info("主订单[id={}]下所有的子订单都被取消 直接进入主订单取消流程", orderDetail.getOrderMasterId()); + orderMasterService.cancel(orderDetail.getOrderMasterId()); + return; + } + + switch (orderDetail.getOrderStatus()) { + case 0: + case 1: // 待接单和待排期状态可直接取消 + updateStatus(orderDetailId, OrderStatus.CANCEL.code()); + // 发起退款 + try { + refund(orderDetail); + } catch (BaseAdaPayException e) { + logger.error("子订单[code={}]退款失败", orderDetail.getCode(), e); + } + break; + case 2: // 待上门状态需要师傅同意才能取消 + updateStatus(orderDetailId, OrderStatus.GOING_CANCEL.code()); + break; + case 3: // 服务中状态需要师傅同意才能取消 + updateStatus(orderDetailId, OrderStatus.SERVER_CANCEL.code()); + break; + case 4: // 待确认状态需要师傅同意才能取消 + updateStatus(orderDetailId, OrderStatus.FINISH_CHECK_CANCEL.code()); + break; + default: // 其他状态不可取消 + throw new IllegalArgumentException("这个子订单不能取消了"); + } + } + + private void refund(OrderDetail orderDetail) throws BaseAdaPayException { + FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(orderDetail.getId()); + BigDecimal payMoney = financialDetail.getPayMoney(); + + // 把子订单对应的子财务单状态更新为已退款 + FinancialDetail update = new FinancialDetail(); + update.setId(financialDetail.getId()); + update.setPayStatus(PayStatus.REFUND.getCode()); + financialDetailService.updateFinancialDetail(update); + + if (BigDecimal.ZERO.compareTo(payMoney) > -1) { + logger.info("子订单[code={}]待退款金额<=0,不需要退款", orderDetail.getCode()); + return; + } + + // 发起退款 + OrderMaster orderMaster = orderMasterMapper.selectById(orderDetail.getOrderMasterId()); + FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMaster.getId()); + String refundAmt = AdapayUtils.bigDecimalToString(payMoney); + JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), refundAmt); + 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("子订单[code={}]退款成功", orderDetail.getCode()); + } + + private void updateStatus(Long orderDetailId, int orderStatus) { + orderDetailMapper.updateStatus(orderDetailId, orderStatus); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelAgree(Long orderDetailId, Integer agree) { + OrderDetail orderDetail = selectById(orderDetailId); + Assert.notNull(orderDetail, "找不到对应的子订单"); + if (Integer.valueOf(1).equals(agree)) { + // 师傅同意取消订单 + // 修改主订单状态为已取消 + updateStatus(orderDetailId, OrderStatus.CANCEL.code()); + // 发起退款 + try { + refund(orderDetail); + } catch (BaseAdaPayException e) { + logger.error("子订单[code={}]退款失败", orderDetail.getCode(), e); + } + } else { + // 师傅不同意取消订单 + Integer orderStatus = orderDetail.getOrderStatus(); + // 修改主订单状态为原来的状态 + updateStatus(orderDetailId, Math.abs(orderStatus)); + } + } + + @Override + public void updateByOrderMasterId(OrderDetail orderDetail) { + orderDetailMapper.updateByOrderMasterId(orderDetail); + } + } 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 666629d0..fea63bae 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 @@ -10,10 +10,13 @@ import com.ghy.common.core.text.Convert; import com.ghy.common.enums.AdapayOrderType; import com.ghy.common.enums.FinancialDetailType; import com.ghy.common.enums.OrderStatus; +import com.ghy.common.enums.PayStatus; import com.ghy.common.utils.AdapayUtils; +import com.ghy.order.domain.OrderDetail; 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.OrderMasterService; import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; @@ -51,6 +54,8 @@ public class OrderMasterServiceImpl implements OrderMasterService { @Resource private OrderMasterMapper orderMasterMapper; @Resource + private OrderDetailService orderDetailService; + @Resource private FinancialMasterService financialMasterService; @Resource private FinancialDetailService financialDetailService; @@ -121,8 +126,8 @@ public class OrderMasterServiceImpl implements OrderMasterService { } @Override - public int updateStatus(Long orderMasterId, int status) { - return orderMasterMapper.updateStatus(orderMasterId, status); + public int updateStatus(Long orderMasterId, int orderStatus) { + return orderMasterMapper.updateStatus(orderMasterId, orderStatus); } @Override @@ -158,7 +163,12 @@ public class OrderMasterServiceImpl implements OrderMasterService { String memberId; switch (financialDetail.getFinancialDetailType()) { case 0: - // 上门师傅结单 分账同下 + // 上门师傅结单 要判断一下这个单是否已退款 + if (financialDetail.getPayStatus().equals(PayStatus.REFUND.getCode())) { + memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId()); + memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add); + } + break; case 1: // 大师傅/店铺提成 memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId()); @@ -214,7 +224,8 @@ public class OrderMasterServiceImpl implements OrderMasterService { AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null); logger.info("订单[code={}]分账结果: {}", orderMaster.getCode(), response.toJSONString()); - boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); + boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) || + AdapayStatusEnum.succeeded.code.equals(response.getString("status")); // 如果确认支付失败 这里抛出异常 Assert.isTrue(status, response.getString("error_msg")); @@ -238,12 +249,16 @@ public class OrderMasterServiceImpl implements OrderMasterService { * @param memberId Adapay实名账户ID * @param amount 提现金额 */ - public void drawCash(Long deptId, String memberId, String amount) throws BaseAdaPayException { + private void drawCash(Long deptId, String memberId, String amount) throws BaseAdaPayException { String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH); JSONObject response = adapayService.drawCash(deptId, orderNo, "T1", amount, memberId, "订单结算", null); - boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); - Assert.isTrue(status, response.getString("error_msg")); + boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) || + AdapayStatusEnum.succeeded.code.equals(response.getString("status")); + if (!status) { + //如果提现失败 把信息记录到error日志里 + logger.error("提现失败: deptId={}, memberId={}, amount={}, 失败原因:{}", deptId, memberId, amount, response.getString("error_msg")); + } } @Override @@ -254,7 +269,13 @@ public class OrderMasterServiceImpl implements OrderMasterService { switch (orderMaster.getOrderStatus()) { case 0: // 待接单状态可直接取消 case 1: // 待排期状态可直接取消 + // 把主订单状态设置为已取消 updateStatus(orderMasterId, OrderStatus.CANCEL.code()); + // 把所有子订单状态设置为已取消 + OrderDetail update = new OrderDetail(); + update.setOrderMasterId(orderMasterId); + update.setOrderStatus(OrderStatus.CANCEL.code()); + orderDetailService.updateByOrderMasterId(update); // 发起退款 try { refund(orderMaster); @@ -282,8 +303,13 @@ public class OrderMasterServiceImpl implements OrderMasterService { Assert.notNull(orderMaster, "找不到对应的订单"); if (Integer.valueOf(1).equals(agree)) { // 师傅同意取消订单 - // 修改主订单状态为已取消 + // 把主订单状态设置为已取消 updateStatus(orderMasterId, OrderStatus.CANCEL.code()); + // 把所有子订单状态设置为已取消 + OrderDetail update = new OrderDetail(); + update.setOrderMasterId(orderMasterId); + update.setOrderStatus(OrderStatus.CANCEL.code()); + orderDetailService.updateByOrderMasterId(update); // 发起退款 try { refund(orderMaster); @@ -303,7 +329,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { * * @param orderMaster 主订单 */ - public void refund(OrderMaster orderMaster) throws BaseAdaPayException { + private void refund(OrderMaster orderMaster) throws BaseAdaPayException { FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMaster.getId()); // 支付状态 Integer payStatus = financialMaster.getPayStatus(); @@ -327,8 +353,24 @@ public class OrderMasterServiceImpl implements OrderMasterService { return; } + // 把主财务单状态设置为已退款 + FinancialMaster fmUpdate = new FinancialMaster(); + fmUpdate.setId(financialMaster.getId()); + fmUpdate.setPayStatus(PayStatus.REFUND.getCode()); + financialMasterService.updateFinancialMaster(fmUpdate); + // 把所有子财务单状态设置为已退款 + FinancialDetail fdUpdate = new FinancialDetail(); + fdUpdate.setFinancialMasterId(financialMaster.getId()); + fdUpdate.setPayStatus(PayStatus.REFUND.getCode()); + financialDetailService.updateByFinancialMasterId(fdUpdate); + String refundAmt = AdapayUtils.bigDecimalToString(payMoney); JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), refundAmt); - logger.info("退款结果: " + response.toJSONString()); + 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("订单[code={}]退款成功", orderMaster.getCode()); } } diff --git a/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml index 0f60e694..dc82d165 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderDetailMapper.xml @@ -155,6 +155,22 @@ WHERE id = #{id} + + UPDATE order_detail + SET order_status = #{orderStatus}, + update_time = SYSDATE() + WHERE id = #{id} + + + + UPDATE order_detail + + order_status = #{orderStatus}, + update_time = SYSDATE() + + WHERE order_master_id = #{orderMasterId} + + INSERT INTO order_detail( code, diff --git a/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialDetail.java b/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialDetail.java index ad1a3b0b..36089407 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialDetail.java +++ b/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialDetail.java @@ -67,7 +67,7 @@ public class FinancialDetail extends BaseEntity { @Excel(name = "支付方式,微信/支付宝/线下", cellType = Excel.ColumnType.NUMERIC) private Integer payType; - @Excel(name = "支付状态, 未付款/已付款", cellType = Excel.ColumnType.NUMERIC) + @Excel(name = "支付状态, 0未付款/1已付款/2已取消/3已退款", cellType = Excel.ColumnType.NUMERIC) private Integer payStatus; @Excel(name = "付款时间", cellType = Excel.ColumnType.STRING) @@ -77,8 +77,6 @@ public class FinancialDetail extends BaseEntity { private String endTime; - - public FinancialDetail() { } diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialDetailMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialDetailMapper.java index 1dec4a3a..a067c567 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialDetailMapper.java +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/FinancialDetailMapper.java @@ -82,4 +82,12 @@ public interface FinancialDetailMapper { * @param reverseId 撤销支付ID */ void payReverseSucceeded(String reverseId); + + /** + * 通过主财务单ID批量更新子财务单 + * 可更新字段: payType, payStatus, payTime + * + * @param financialDetail 子财务单 + */ + void updateByFinancialMasterId(FinancialDetail financialDetail); } \ No newline at end of file diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java index 100127a0..3be3713f 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/FinancialDetailService.java @@ -89,4 +89,12 @@ public interface FinancialDetailService { * @param reverseId 撤销支付ID */ void payReverseSucceeded(String reverseId); + + /** + * 通过主财务单ID批量更新子财务单 + * 可更新字段: payType, payStatus, payTime + * + * @param financialDetail 子财务单 + */ + void updateByFinancialMasterId(FinancialDetail financialDetail); } diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java index 792e66ee..ec2c64f3 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/FinancialDetailServiceImpl.java @@ -114,6 +114,11 @@ public class FinancialDetailServiceImpl implements FinancialDetailService { financialDetailMapper.payReverseSucceeded(reverseId); } + @Override + public void updateByFinancialMasterId(FinancialDetail financialDetail) { + financialDetailMapper.updateByFinancialMasterId(financialDetail); + } + @Override public Map byOrderIdInMap(List orderIdList) { Map longFinancialDetailHashMap = new HashMap<>(); diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java index 7ac76ae9..45dbc877 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/impl/PayReverseCallbackService.java @@ -37,7 +37,7 @@ public class PayReverseCallbackService implements CallBackService { logger.debug("撤销支付 callback: {}", event); PayReverseCallback callback = JSON.parseObject(event.getData(), PayReverseCallback.class); if (AdapayStatusEnum.succeeded.code.equals(callback.getStatus())) { - // 将子财务单支付状态设置为1 表示退款成功 + // 将子财务单支付状态设置为3 表示退款成功 financialDetailService.payReverseSucceeded(callback.getId()); } } diff --git a/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml b/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml index 445306ec..7baa294c 100644 --- a/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml +++ b/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml @@ -108,10 +108,21 @@ UPDATE financial_detail SET - pay_status = 1 + pay_status = 3 WHERE reverse_id = #{reverseId} - + + + UPDATE financial_detail + + pay_type = #{payType}, + pay_status = #{payStatus}, + pay_time = #{payTime}, + update_time = SYSDATE() + + WHERE financial_master_id = #{financialMasterId} + +