From a6bc860587a4144c9019b185ac837384149bbf43 Mon Sep 17 00:00:00 2001 From: Hawking Date: Tue, 18 Apr 2023 01:11:26 +0800 Subject: [PATCH 1/8] =?UTF-8?q?1.=20=E5=A4=A7=E5=B8=88=E5=82=85=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E6=8E=A5=E5=8D=95=EF=BC=8C=E5=AD=90=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E9=87=91=E9=A2=9D=E4=B8=BA0=EF=BC=9B=202.=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E9=80=80=E6=AC=BE=E8=AE=B0=E5=BD=95=E4=BB=A5=E4=BE=BF=E4=BA=8E?= =?UTF-8?q?=E6=8E=92=E6=9F=A5=E9=97=AE=E9=A2=98=EF=BC=9B=203.=20=E5=A4=A7?= =?UTF-8?q?=E5=B8=88=E5=82=85=E6=8F=90=E6=88=90=E5=8F=96=E6=B6=88=E4=BA=86?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E4=B8=BA=E8=AE=A2=E5=8D=95=E5=89=A9?= =?UTF-8?q?=E4=BD=99=E9=87=91=E9=A2=9D=E5=B1=9E=E4=BA=8E=E5=A4=A7=E5=B8=88?= =?UTF-8?q?=E5=82=85=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghy/callback/RefundCallbackService.java | 16 ++- .../web/controller/order/OrderController.java | 87 +++++++------- .../adapay/model/PayReverseCallback.java | 2 +- .../impl/AfterServiceRecordServiceImpl.java | 2 +- .../service/impl/OrderDetailServiceImpl.java | 106 ++++++++++-------- .../service/impl/OrderMasterServiceImpl.java | 18 ++- .../ghy/payment/domain/FinancialMaster.java | 8 ++ .../com/ghy/payment/domain/ReverseRecord.java | 37 ++++++ .../payment/mapper/ReverseRecordMapper.java | 8 ++ .../ghy/payment/service/AdapayService.java | 1 + .../service/FinancialChangeRecordService.java | 4 +- .../mapper/payment/ReverseRecordMapper.xml | 18 +++ 12 files changed, 207 insertions(+), 100 deletions(-) create mode 100644 ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java create mode 100644 ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java create mode 100644 ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml diff --git a/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java b/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java index b0fc3adb..0c0ecd37 100644 --- a/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java +++ b/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java @@ -2,29 +2,35 @@ package com.ghy.callback; import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.model.Event; +import com.ghy.payment.domain.ReverseRecord; +import com.ghy.payment.mapper.ReverseRecordMapper; import com.ghy.payment.service.CallBackService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import javax.annotation.Resource; + /** * 退款回调 * * @author HH 2022/5/30 */ +@Slf4j @Service("refundCallbackService") public class RefundCallbackService implements CallBackService { - private static final Logger logger = LoggerFactory.getLogger(RefundCallbackService.class); + @Resource + private ReverseRecordMapper reverseRecordMapper; @Override public void onCallback(Event event) { - logger.debug("退款 callback: {}", event.toString()); + log.debug("退款 callback: {}", event.toString()); } @Override public void onResponse(JSONObject response) { - logger.debug("退款 Response: {}", response.toString()); + log.debug("退款 Response: {}", response.toString()); + reverseRecordMapper.insert(JSONObject.toJavaObject(response, ReverseRecord.class)); } } 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 f7f4f1f5..86cd4dbb 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 @@ -40,7 +40,6 @@ import com.huifu.adapay.core.exception.BaseAdaPayException; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.time.DateUtils; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; @@ -303,33 +302,17 @@ public class OrderController extends BaseController { // 接单师傅 Worker acceptWorker = workerService.selectById(request.getWorkerId()); Assert.notNull(acceptWorker, "查询接单师傅信息失败"); - om.setAllSelfAssigned(0); + // 校验接单师傅和派单师傅是不是同一个Team - if (!om.getWorkerId().equals(request.getWorkerId())) { - fm.setServerMoney(fm.getServerMoney().subtract(request.getTotalPay())); + if (om.getWorkerId().equals(request.getWorkerId())) { + // 自己接单 子单金额=0 + request.setTotalPay(BigDecimal.ZERO); + } else { + Assert.isTrue(fm.getServerMoney().compareTo(request.getTotalPay()) < 0, "派单金额不能大于订单总金额"); boolean checkInTeam = workerService.checkInTeam(assignWorker.getWorkerId(), acceptWorker.getWorkerId()); Assert.isTrue(checkInTeam, "接单师傅不在本团队"); - } else { - // 自己接单 -- 计算剩余金额 - om.setAllSelfAssigned(1); - BigDecimal realPay = fm.getPayMoney(); - for (FinancialDetail financialDetail : financialDetailService.selectByFinancialMasterId(fm.getId())) { - if (FinancialDetailType.ORDER_FEE.getCode().equals(financialDetail.getFinancialDetailType())) { - om.setAllSelfAssigned(0); - om.setOrderStatus(OrderStatus.GOING.code()); - } - realPay = realPay.subtract(financialDetail.getPayMoney()); - } - request.setTotalPay(realPay); - fm.setServerMoney(BigDecimal.ZERO); } - // 判断是否全部派完 - if (orderMasterService.isAllAssign(om.getId())) { - om.setHasDispatchedAll(1); - } - orderMasterService.updateOrderMaster(om); - // 创建子订单 OrderDetail od = new OrderDetail(); od.setDeptId(om.getDeptId()); @@ -343,7 +326,6 @@ public class OrderController extends BaseController { od.setRevTime(om.getRevTime()); od.setExpectTimeStart(om.getExpectTimeStart()); od.setExpectTimeEnd(om.getExpectTimeEnd()); -// od.setRemark(om.getRemark()); orderDetailService.insertOrderDetail(od); // 批量生成订单商品 @@ -359,28 +341,55 @@ public class OrderController extends BaseController { orderGoodsService.insertOrderGoods(orderGoods); }); - Assert.isTrue(BigDecimal.ZERO.compareTo(request.getTotalPay()) < 0, "订单计算出错 请联系管理员"); + //为接单师傅生成子财务单 FinancialDetail fd = new FinancialDetail(fm.getDeptId(), financialDetailService.createCode(), fm.getId(), fm.getCode(), od.getId(), od.getCode(), request.getTotalPay(), FinancialDetailType.ORDER_FEE.getCode(), acceptWorker.getWorkerId(), fm.getPayType(), fm.getPayStatus(), fm.getPayTime()); financialDetailService.insertFinancialDetail(fd); - // 更新财务主单金额 - financialMasterService.updateFinancialMaster(fm); + if (BigDecimal.ZERO.equals(request.getTotalPay())) { + // 更新财务主单服务金额 + FinancialMaster fm2up = new FinancialMaster(); + fm2up.setId(fm.getId()); + fm2up.setServerMoney(fm.getServerMoney().subtract(request.getTotalPay())); + financialMasterService.updateFinancialMaster(fm2up); + } + // 保存订单操作记录 OrderBehavior orderBehavior = new OrderBehavior().setOrderMasterId(om.getId()).setOrderMasterCode(om.getCode()) .setWorkerId(assignWorker.getWorkerId()).setWorkerName(assignWorker.getName()).setBehavior(OrderBehaviorEnum.ASSIGN_ORDER); orderBehaviorService.insert(orderBehavior); + // 更新主订单 + OrderMaster om2up = new OrderMaster(); + // 判断是否全部派完 + if (orderMasterService.isAllAssign(om.getId())) { + om2up.setId(om.getId()); + Set workIds = orderDetailService.selectByOrderMasterId(om.getId()).stream().map(OrderDetail::getWorkerId).collect(Collectors.toSet()); + if (workIds.size() == 1 && workIds.contains(om.getWorkerId())) { + // 派完单 并且只有自己接单 + om2up.setHasDispatchedAll(1); + om2up.setOrderStatus(OrderStatus.GOING.code()); + } else { + // 派完单 但是有其他师傅接单 + om2up.setHasDispatchedAll(0); + om2up.setOrderStatus(OrderStatus.RECEIVE.code()); + } + } else { + // 未派完单 + om2up.setHasDispatchedAll(0); + } + orderMasterService.updateOrderMaster(om2up); + // 通知师傅新订单 try { - Map params = new HashMap<>(); + Map params = new HashMap<>(); params.put("thing1", "新订单通知"); - params.put("thing5", "收到师傅派单,请及时处理!"); + params.put("thing5", "收到师傅派单,请及时处理!"); wxMsgService.sendWxMsg(acceptWorker.getOpenId(), WxMsgEnum.ORDER_PLAN, params); - }catch (Exception e){ - e.printStackTrace(); + } catch (Exception e) { + logger.error(e.getMessage(), e); } return AjaxResult.success(); } @@ -465,13 +474,13 @@ public class OrderController extends BaseController { } // 通知师傅新订单 try { - Map params = new HashMap<>(); + Map params = new HashMap<>(); params.put("character_string22", orderMaster.getCode()); - params.put("thing19",customer.getName()); + params.put("thing19", customer.getName()); params.put("time1", com.ghy.common.utils.DateUtils.parseDateToStr("yyyy年MM月dd日 HH:mm", new Date())); params.put("thing5", "有新订单,请及时处理!"); wxMsgService.sendWxMsg(worker.getOpenId(), WxMsgEnum.NEW_ORDER, params); - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } return AjaxResult.success(orderMaster); @@ -678,14 +687,14 @@ public class OrderController extends BaseController { // 统计待确认单量 orderDetail.setOrderStatus(null); orderDetail.setWorkFinishTimeExisted(true); - orderDetail.setDrawCashStatusList(new ArrayList(){{ + orderDetail.setDrawCashStatusList(new ArrayList() {{ add(0); add(1); }}); response.setWaitSureOrderNum(orderDetailService.countOrderDetailList(orderDetail)); // 统计已完成子单量 orderDetail.setOrderStatus(OrderStatus.FINISH.code()); - orderDetail.setDrawCashStatusList(new ArrayList(){{ + orderDetail.setDrawCashStatusList(new ArrayList() {{ add(2); }}); response.setFinishedOrderNum(orderDetailService.countOrderDetailList(orderDetail)); @@ -850,7 +859,7 @@ public class OrderController extends BaseController { return AjaxResult.success(orderListResponses); } - public List getMasterAfterList(OrderMaster orderMaster) { + public List getMasterAfterList(OrderMaster orderMaster) { // 查所有售后的单 AfterServiceRecord afterServiceRecord = new AfterServiceRecord(); @@ -876,8 +885,8 @@ public class OrderController extends BaseController { StringBuilder orderMasterIds = new StringBuilder(); orderDetailList.stream().map(OrderDetail::getOrderMasterId).distinct() .collect(Collectors.toList()).forEach(id -> { - orderMasterIds.append(id).append(","); - }); + orderMasterIds.append(id).append(","); + }); String orderIds = orderMasterIds.toString(); if (StringUtils.isNotEmpty(orderIds)) { orderMaster.setOrderMasterIds(orderIds.substring(0, orderIds.length() - 1)); diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReverseCallback.java b/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReverseCallback.java index d49b7c15..c6213a6b 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReverseCallback.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/model/PayReverseCallback.java @@ -33,7 +33,7 @@ public class PayReverseCallback { private String confirmedAmt; @JSONField(name = "refunded_amt") private String refundedAmt; - @JSONField(name = "createdTime") + @JSONField(name = "created_time") private String created_time; @JSONField(name = "succeed_time") private String succeedTime; 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 affdf05e..a0869bd7 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 @@ -132,7 +132,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } if (refundMoney.compareTo(financialDetail.getPayMoney()) < 0) { // 申请退款金额 < 子单金额 - financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(afterServiceRecord.getAgreedRefund())); + financialDetail.setPayMoney(financialDetail.getPayMoney().subtract(refundMoney)); financialMaster.setPayMoney(financialMaster.getPayMoney().subtract(refundMoney)); // 更新主/子财务单金额 financialMasterService.updateFinancialMaster(financialMaster); 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 1e3e18b0..35f74814 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 @@ -28,6 +28,7 @@ import com.ghy.payment.service.FinancialChangeRecordService; import com.ghy.payment.service.FinancialDetailService; import com.ghy.payment.service.FinancialMasterService; import com.huifu.adapay.core.exception.BaseAdaPayException; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -35,7 +36,6 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; @@ -414,15 +414,18 @@ public class OrderDetailServiceImpl implements OrderDetailService { if (payment == null) { throw new BaseException("找不到支付记录"); } - List financialDetails = financialDetailService.selectListByOrderDetailId(orderDetailId); - if (CollectionUtils.isEmpty(financialDetails)) { - throw new BaseException("找不到子财务单"); - } // 子订单对应的子财务单只有一条 直接取出 - FinancialDetail financialDetail = financialDetails.get(0); + FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(orderDetailId); + if (financialDetail == null) { + throw new BaseException("FinancialDetail is null!!!"); + } if (financialDetail.getPayStatus() != 1) { throw new BaseException("订单不是“已支付”状态"); } + + // 修改子订单状态为完成 + updateStatus(orderDetailId, OrderStatus.FINISH.code()); + Long financialMasterId = financialDetail.getFinancialMasterId(); // 找到 type=平台抽成 的子财务单 用来承担手续费 List details = financialDetailService.selectByFinancialMasterIdAndType(financialMasterId, FinancialDetailType.PLATFORM_FEE.getCode()); @@ -446,51 +449,57 @@ public class OrderDetailServiceImpl implements OrderDetailService { // --------------------- 改价单分账部分 start --------------------- // 查询子订单的加价记录 List financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId)); - if (!CollectionUtils.isEmpty(financialChangeRecords)) { - ArrayList divMembers = new ArrayList<>(); + if (CollectionUtils.isNotEmpty(financialChangeRecords)) { // 改价记录只会有一条 直接取出 FinancialChangeRecord fcRecord = financialChangeRecords.get(0); - addPrice = fcRecord.getChangeMoney(); - // 待提现金额里加入改价单金额 - dtx = dtx.add(fcRecord.getChangeMoney()); - // 这里先自己承担手续费 后面再用平台抽成来补偿 - DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true); - divMembers.add(divMember); - //调用分账 - logger.info("子订单[code={}]的[改价单]发起分账", odCode); - JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(), - payment.getOrderNo() + "_" + System.currentTimeMillis(), - AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null); - if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功 - logger.info("子订单[code={}]的[改价单]分账成功", odCode); - // 这是被扣掉的手续费 按理说这里肯定大于0 - String fee_amt = response.getString("fee_amt"); - feeAmt = new BigDecimal(fee_amt); - if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(fee_amt)) { - // 当 0.00<改价单的手续费<=平台抽成金额 时 - // 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额 - fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(feeAmt)); - int i = financialDetailService.updateFinancialDetail(fdUpdate); - compensate = i > 0; - } else { - logger.warn("主订单[code={}]的平台抽成金额不足以承担子订单[code={}]的[改价单]的手续费", - orderDetail.getOrderMasterCode(), odCode); - // 平台抽成不足以承担改价单手续费了 那没办法了只能自己承担 - // 待提现金额里减去改价单手续费 - dtx = dtx.subtract(feeAmt); - } - } else { // 分账失败 - if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) { - // 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额 - // 这里有两种可能 1.可能是之前算错了手续费的旧订单 - // 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了 - // 所以直接跳过 - logger.info("子订单[code={}] 跳过[改价单]分账", odCode); - } else { - logger.error("子订单[code={}]的[改价单 paymentId={}]分账失败: {}", odCode, fcRecord.getRemark(), response.toJSONString()); - // 其它错误抛异常 - throw new IllegalArgumentException(response.getString("error_msg")); + boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus()); + boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus()); + if (paid || payedAdd) { + ArrayList divMembers = new ArrayList<>(); + addPrice = fcRecord.getChangeMoney(); + // 待提现金额里加入改价单金额 + dtx = dtx.add(fcRecord.getChangeMoney()); + // 这里先自己承担手续费 后面再用平台抽成来补偿 + DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true); + divMembers.add(divMember); + //调用分账 + logger.info("子订单[code={}]的[改价单]发起分账", odCode); + JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(), + payment.getOrderNo() + "_" + System.currentTimeMillis(), + AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null); + if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功 + logger.info("子订单[code={}]的[改价单]分账成功", odCode); + // 这是被扣掉的手续费 按理说这里肯定大于0 + String fee_amt = response.getString("fee_amt"); + feeAmt = new BigDecimal(fee_amt); + if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(fee_amt)) { + // 当 0.00<改价单的手续费<=平台抽成金额 时 + // 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额 + fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(feeAmt)); + int i = financialDetailService.updateFinancialDetail(fdUpdate); + compensate = i > 0; + } else { + logger.warn("主订单[code={}]的平台抽成金额不足以承担子订单[code={}]的[改价单]的手续费", + orderDetail.getOrderMasterCode(), odCode); + // 平台抽成不足以承担改价单手续费了 那没办法了只能自己承担 + // 待提现金额里减去改价单手续费 + dtx = dtx.subtract(feeAmt); + } + } else { // 分账失败 + if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) { + // 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额 + // 这里有两种可能 1.可能是之前算错了手续费的旧订单 + // 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了 + // 所以直接跳过 + logger.info("子订单[code={}] 跳过[改价单]分账", odCode); + } else { + logger.error("子订单[code={}]的[改价单 paymentId={}]分账失败: {}", odCode, fcRecord.getRemark(), response.toJSONString()); + // 其它错误抛异常 + throw new IllegalArgumentException(response.getString("error_msg")); + } } + } else { + addPrice = BigDecimal.ZERO; } } else { addPrice = BigDecimal.ZERO; @@ -579,7 +588,6 @@ public class OrderDetailServiceImpl implements OrderDetailService { // 修改订单状态 OrderDetail odUpdate = new OrderDetail(); odUpdate.setId(orderDetailId); - odUpdate.setOrderStatus(OrderStatus.FINISH.code()); odUpdate.setDrawCashTime(new Date()); odUpdate.setDrawCashStatus(1); // 保存提现ID 用于同步Adapay提现状态 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 abcf3f4a..ee505e78 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 @@ -182,10 +182,14 @@ public class OrderMasterServiceImpl implements OrderMasterService { // 确认支付总金额 BigDecimal confirmAmt = BigDecimal.ZERO; + // 大师傅/店铺提成=订单总金额 - 上门师傅结单金额 - 平台提成 - 订单超时罚金 - 分销金额 - 退款金额 - 订单加价 + BigDecimal bigWorkerAmt = financialMaster.getPayMoney(); + // key:memberId(分账账户ID) value:分账金额 HashMap memberMap = new HashMap<>(); for (FinancialDetail financialDetail : financialDetails) { + bigWorkerAmt = bigWorkerAmt.subtract(financialDetail.getPayMoney()); String memberId; switch (financialDetail.getFinancialDetailType()) { case 0: @@ -193,9 +197,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { break; case 1: // 大师傅/店铺提成 - memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId()); - memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add); - confirmAmt = confirmAmt.add(financialDetail.getPayMoney()); + // 没有大师傅/店铺提成了 不再考虑这个case 2023/04/17 break; case 2: // 平台提成 并且是手续费承担方 @@ -225,6 +227,14 @@ public class OrderMasterServiceImpl implements OrderMasterService { } } + List fcrList = financialChangeRecordService.selectByMasterId(orderMasterId); + for (FinancialChangeRecord fcr : fcrList) { + if (PayStatus.PAID.getCode().equals(fcr.getPayStatus()) || PayStatus.PAYED_ADD.getCode().equals(fcr.getPayStatus())) { + confirmAmt = confirmAmt.subtract(fcr.getChangeMoney()); + } + } + memberMap.put(AdapayUtils.getWorkerMemberId(orderMaster.getWorkerId(), orderMaster.getDeptId()), bigWorkerAmt); + // 分账账户 ArrayList divMembers = new ArrayList<>(); for (Map.Entry entry : memberMap.entrySet()) { @@ -447,7 +457,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { List masterGoods = orderGoodsService.selectByOrderMasterId(orderMasterId); for (OrderGoods orderGoods : masterGoods) { // 是否有未派完的子单 - if(!orderGoods.getGoodsNum().equals(orderGoods.getServerGoodsNum())){ + if (!orderGoods.getGoodsNum().equals(orderGoods.getServerGoodsNum())) { return false; } } diff --git a/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java b/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java index 16716097..dd4d23be 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java +++ b/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java @@ -3,6 +3,8 @@ package com.ghy.payment.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.ghy.common.annotation.Excel; import com.ghy.common.core.domain.BaseEntity; +import com.ghy.common.enums.PayStatus; +import com.ghy.common.enums.PayTypeEnum; import lombok.Data; import java.math.BigDecimal; @@ -45,9 +47,15 @@ public class FinancialMaster extends BaseEntity { @Excel(name = "服务金额", cellType = Excel.ColumnType.STRING) private BigDecimal serverMoney; + /** + * @see PayTypeEnum + */ @Excel(name = "支付方式,微信/支付宝/线下", cellType = Excel.ColumnType.NUMERIC) private Integer payType; + /** + * @see PayStatus + */ @Excel(name = "支付状态, 未付款/已付款", cellType = Excel.ColumnType.NUMERIC) private Integer payStatus; diff --git a/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java b/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java new file mode 100644 index 00000000..956ba370 --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java @@ -0,0 +1,37 @@ +package com.ghy.payment.domain; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +import java.util.Date; + +/** + * 退款记录 + */ +@Data +public class ReverseRecord { + private String id; + private Long deptId; + private String status; + @JSONField(name = "order_no") + private String orderNo; + @JSONField(name = "payment_id") + private String paymentId; + @JSONField(name = "reverse_amt") + private String reverseAmt; + @JSONField(name = "reversed_amt") + private String reversedAmt; + @JSONField(name = "confirmed_amt") + private String confirmedAmt; + @JSONField(name = "refunded_amt") + private String refundedAmt; + @JSONField(name = "error_code") + private String errorCode; + @JSONField(name = "error_msg") + private String errorMsg; + @JSONField(name = "error_type") + private String errorType; + @JSONField(name = "created_time") + private String createdTime; + private Date createTime; +} diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java new file mode 100644 index 00000000..e939f21d --- /dev/null +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java @@ -0,0 +1,8 @@ +package com.ghy.payment.mapper; + +import com.ghy.payment.domain.ReverseRecord; + +public interface ReverseRecordMapper { + + int insert(ReverseRecord record); +} diff --git a/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java index ecf7a2f3..edf5813f 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java +++ b/ghy-payment/src/main/java/com/ghy/payment/service/AdapayService.java @@ -543,6 +543,7 @@ public class AdapayService { reverseParams.put("notify_url", adapayProperties.getNotifyUrl()); reverseParams.put("order_no", type.code + System.currentTimeMillis()); JSONObject response = (JSONObject) PaymentReverse.create(reverseParams, deptId.toString()); + response.put("deptId", deptId); executor.execute(() -> payReverseCallbackService.onResponse(response)); return response; } 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 c44cb5e5..5b96f4b7 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 @@ -70,7 +70,9 @@ public interface FinancialChangeRecordService { int updatePayStatus(Long id, Integer payStatus); /** - * 加价单发起全额退款 + * 加价单发起全额退款
+ * 修改支付状态为 PayStatus.REFUNDING
+ * 但不修改财务单的金额
* * @param deptId 公司ID * @param fcr 加价单 diff --git a/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml b/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml new file mode 100644 index 00000000..405a76cb --- /dev/null +++ b/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml @@ -0,0 +1,18 @@ + + + + + + SELECT id, status, order_no, payment_id, reverse_amt, reversed_amt, confirmed_amt, refunded_amt, + error_code, error_msg, error_type, created_time, create_time, dept_id + FROM reverse_record + + + + INSERT INTO reverse_record(id, status, order_no, payment_id, reverse_amt, reversed_amt, confirmed_amt, refunded_amt, + error_code, error_msg, error_type, created_time, dept_id) + VALUES (#{id}, #{status}, #{orderNo}, #{paymentId}, #{reverseAmt}, #{reversedAmt}, #{confirmedAmt}, + #{refundedAmt}, #{errorCode}, #{errorMsg}, #{errorType}, #{createdTime}, #{deptId}) + + + \ No newline at end of file From 489bd945850c2ad3380cc72857e46a98d1aab2c7 Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 09:49:58 +0800 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20AfterServiceRecord.originalRefund?= =?UTF-8?q?=E7=9A=84=E5=80=BC=E6=9C=AA=E6=AD=A3=E7=A1=AE=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghy/order/service/impl/AfterServiceRecordServiceImpl.java | 1 + 1 file changed, 1 insertion(+) 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 affdf05e..ad2ecfc0 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 @@ -153,6 +153,7 @@ public class AfterServiceRecordServiceImpl implements IAfterServiceRecordService } else { // 子单全额退款 直接走取消流程 orderDetailService.cancelAgree(orderDetail.getId(), 1); + param.setOriginalRefund(financialDetail.getPayMoney()); } } param.setUpdateTime(new Date()); From 4d2dd4be6ff89d5b2acd35de52d80f96ce221032 Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 10:02:40 +0800 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=E6=B4=BE=E5=8D=95=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ghy/web/controller/order/OrderController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 86cd4dbb..02c2582a 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 @@ -348,7 +348,7 @@ public class OrderController extends BaseController { fm.getPayType(), fm.getPayStatus(), fm.getPayTime()); financialDetailService.insertFinancialDetail(fd); - if (BigDecimal.ZERO.equals(request.getTotalPay())) { + if (!BigDecimal.ZERO.equals(request.getTotalPay())) { // 更新财务主单服务金额 FinancialMaster fm2up = new FinancialMaster(); fm2up.setId(fm.getId()); From 109a7a2520c1d350d43cb1549b7d63dad2ec422d Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 10:39:22 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=86=8D=E8=B0=83=E6=95=B4=E4=B8=80?= =?UTF-8?q?=E4=B8=8B=E5=AD=90=E5=8D=95=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/order/domain/OrderDetail.java | 12 ++++++++++ .../com/ghy/order/domain/OrderMaster.java | 12 ++++++++++ .../service/impl/OrderDetailServiceImpl.java | 23 +++++++++++-------- .../financial/FinancialDetailMapper.xml | 1 + 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java index 4d8b1aac..e44921a7 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderDetail.java @@ -2,6 +2,9 @@ package com.ghy.order.domain; import com.ghy.common.annotation.Excel; import com.ghy.common.core.domain.BaseEntity; +import com.ghy.common.enums.OrderStatus; +import com.ghy.common.enums.PayStatus; +import com.ghy.common.enums.PayTypeEnum; import com.ghy.goods.domain.Goods; import com.ghy.worker.domain.Worker; import lombok.Data; @@ -46,6 +49,9 @@ public class OrderDetail extends BaseEntity { @Excel(name = "订单类型", cellType = Excel.ColumnType.NUMERIC) private Integer orderType; + /** + * @see OrderStatus + */ @Excel(name = "订单状态", cellType = Excel.ColumnType.NUMERIC) private Integer orderStatus; @@ -118,9 +124,15 @@ public class OrderDetail extends BaseEntity { */ private Date arrivalTime; + /** + * @see PayTypeEnum + */ @Excel(name = "付款类型", cellType = Excel.ColumnType.NUMERIC) private Integer payType; + /** + * @see PayStatus + */ @Excel(name = "付款状态", cellType = Excel.ColumnType.NUMERIC) private Integer payStatus; diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java index 2ba7a1a3..6c313280 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java @@ -3,6 +3,9 @@ package com.ghy.order.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.ghy.common.annotation.Excel; import com.ghy.common.core.domain.BaseEntity; +import com.ghy.common.enums.OrderStatus; +import com.ghy.common.enums.PayStatus; +import com.ghy.common.enums.PayTypeEnum; import com.ghy.payment.domain.FinancialMaster; import com.ghy.worker.domain.Worker; import lombok.Data; @@ -39,12 +42,21 @@ public class OrderMaster extends BaseEntity { @Excel(name = "订单类型", cellType = Excel.ColumnType.NUMERIC) private Integer orderType; + /** + * @see OrderStatus + */ @Excel(name = "订单状态", cellType = Excel.ColumnType.NUMERIC) private Integer orderStatus; + /** + * @see PayTypeEnum + */ @Excel(name = "付款类型", cellType = Excel.ColumnType.NUMERIC) private Integer payType; + /** + * @see PayStatus + */ @Excel(name = "付款状态", cellType = Excel.ColumnType.NUMERIC) private Integer payStatus; 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 35f74814..c52f7b21 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 @@ -260,29 +260,32 @@ public class OrderDetailServiceImpl implements OrderDetailService { public void cancel(long orderDetailId) throws BaseAdaPayException { OrderDetail orderDetail = selectById(orderDetailId); Assert.notNull(orderDetail, "找不到对应的子订单"); - + if (OrderStatus.CANCEL.code() == orderDetail.getOrderStatus()) { + logger.info("子订单[id={}]已经是取消状态了", orderDetailId); + return; + } + // 更新子订单状态 + orderDetailMapper.updateStatus(orderDetailId, OrderStatus.CANCEL.code()); // 查询出所有的子订单 就走主订单取消流程 List orderDetails = orderDetailMapper.selectByOrderMasterId(orderDetail.getOrderMasterId()); + // 发起退款 + refund(orderDetail); + // 如果除了这个子订单以外 没有其它未取消的订单 boolean allCancel = true; for (OrderDetail od : orderDetails) { - if (!od.getId().equals(orderDetailId)) { - if (!od.getOrderStatus().equals(OrderStatus.CANCEL.code())) { - allCancel = false; - } + if (!od.getOrderStatus().equals(OrderStatus.CANCEL.code())) { + allCancel = false; + break; } } // 判断主单是否全部派单 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); } /** diff --git a/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml b/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml index 05c2b4b2..b31322ed 100644 --- a/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml +++ b/ghy-payment/src/main/resources/mapper/financial/FinancialDetailMapper.xml @@ -127,6 +127,7 @@ pay_time = #{payTime}, pay_money = #{payMoney}, update_by = #{updateBy}, + reverse_id = #{reverseId}, update_time = SYSDATE() WHERE id = #{id} From e408f6503692d235961e25b7e9450a6800ea665b Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 10:44:58 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BB=A5=E4=BE=BF=E4=BA=8E=E6=8E=92=E6=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/callback/PayReverseCallbackService.java | 10 +++++++++- .../java/com/ghy/callback/RefundCallbackService.java | 8 -------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/callback/PayReverseCallbackService.java b/ghy-admin/src/main/java/com/ghy/callback/PayReverseCallbackService.java index 76945a2f..b5547837 100644 --- a/ghy-admin/src/main/java/com/ghy/callback/PayReverseCallbackService.java +++ b/ghy-admin/src/main/java/com/ghy/callback/PayReverseCallbackService.java @@ -7,6 +7,8 @@ import com.ghy.common.adapay.model.Event; import com.ghy.common.adapay.model.PayReverseCallback; import com.ghy.order.service.OrderDetailService; import com.ghy.order.service.OrderMasterService; +import com.ghy.payment.domain.ReverseRecord; +import com.ghy.payment.mapper.ReverseRecordMapper; import com.ghy.payment.service.CallBackService; import com.ghy.payment.service.FinancialChangeRecordService; import lombok.extern.slf4j.Slf4j; @@ -24,6 +26,7 @@ public class PayReverseCallbackService implements CallBackService { private OrderMasterService orderMasterService; private OrderDetailService orderDetailService; + private ReverseRecordMapper reverseRecordMapper; private FinancialChangeRecordService financialChangeRecordService; @Override @@ -55,7 +58,7 @@ public class PayReverseCallbackService implements CallBackService { @Override public void onResponse(JSONObject response) { - + reverseRecordMapper.insert(JSONObject.toJavaObject(response, ReverseRecord.class)); } @Autowired @@ -72,4 +75,9 @@ public class PayReverseCallbackService implements CallBackService { public void setFinancialChangeRecordService(FinancialChangeRecordService financialChangeRecordService) { this.financialChangeRecordService = financialChangeRecordService; } + + @Autowired + public void setReverseRecordMapper(ReverseRecordMapper reverseRecordMapper) { + this.reverseRecordMapper = reverseRecordMapper; + } } diff --git a/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java b/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java index 0c0ecd37..898b7dfd 100644 --- a/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java +++ b/ghy-admin/src/main/java/com/ghy/callback/RefundCallbackService.java @@ -2,14 +2,10 @@ package com.ghy.callback; import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.model.Event; -import com.ghy.payment.domain.ReverseRecord; -import com.ghy.payment.mapper.ReverseRecordMapper; import com.ghy.payment.service.CallBackService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.annotation.Resource; - /** * 退款回调 * @@ -19,9 +15,6 @@ import javax.annotation.Resource; @Service("refundCallbackService") public class RefundCallbackService implements CallBackService { - @Resource - private ReverseRecordMapper reverseRecordMapper; - @Override public void onCallback(Event event) { log.debug("退款 callback: {}", event.toString()); @@ -30,7 +23,6 @@ public class RefundCallbackService implements CallBackService { @Override public void onResponse(JSONObject response) { log.debug("退款 Response: {}", response.toString()); - reverseRecordMapper.insert(JSONObject.toJavaObject(response, ReverseRecord.class)); } } From d4cd85c72b9b6ac5d37f2f280851cb1d371eae3a Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 11:06:45 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BF=9D=E5=AD=98=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BB=A5=E4=BE=BF=E4=BA=8E=E6=8E=92=E6=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghy/payment/domain/FinancialDetail.java | 12 +++++++-- .../ghy/payment/domain/FinancialMaster.java | 4 +-- .../com/ghy/payment/domain/ReverseRecord.java | 12 +++++++++ .../payment/mapper/ReverseRecordMapper.java | 20 ++++++++++++++ .../mapper/payment/ReverseRecordMapper.xml | 27 +++++++++++++++++++ 5 files changed, 71 insertions(+), 4 deletions(-) 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 871424f9..7b01741f 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 @@ -3,6 +3,8 @@ package com.ghy.payment.domain; import com.ghy.common.annotation.Excel; import com.ghy.common.core.domain.BaseEntity; import com.ghy.common.enums.FinancialDetailType; +import com.ghy.common.enums.PayStatus; +import com.ghy.common.enums.PayTypeEnum; import lombok.Data; import lombok.EqualsAndHashCode; @@ -72,10 +74,16 @@ public class FinancialDetail extends BaseEntity { @Excel(name = "Adapay撤销支付或退款ID", cellType = Excel.ColumnType.STRING) private String reverseId; - @Excel(name = "支付方式,微信/支付宝/线下", cellType = Excel.ColumnType.NUMERIC) + /** + * @see PayTypeEnum + */ + @Excel(name = "支付方式", cellType = Excel.ColumnType.NUMERIC) private Integer payType; - @Excel(name = "支付状态, 0未付款/1已付款/2已取消/3已退款", cellType = Excel.ColumnType.NUMERIC) + /** + * @see PayStatus + */ + @Excel(name = "支付状态", cellType = Excel.ColumnType.NUMERIC) private Integer payStatus; @Excel(name = "付款时间", cellType = Excel.ColumnType.STRING) diff --git a/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java b/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java index dd4d23be..34aa858c 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java +++ b/ghy-payment/src/main/java/com/ghy/payment/domain/FinancialMaster.java @@ -50,13 +50,13 @@ public class FinancialMaster extends BaseEntity { /** * @see PayTypeEnum */ - @Excel(name = "支付方式,微信/支付宝/线下", cellType = Excel.ColumnType.NUMERIC) + @Excel(name = "支付方式", cellType = Excel.ColumnType.NUMERIC) private Integer payType; /** * @see PayStatus */ - @Excel(name = "支付状态, 未付款/已付款", cellType = Excel.ColumnType.NUMERIC) + @Excel(name = "支付状态", cellType = Excel.ColumnType.NUMERIC) private Integer payStatus; @Excel(name = "付款时间", cellType = Excel.ColumnType.STRING) diff --git a/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java b/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java index 956ba370..ec19a2be 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java +++ b/ghy-payment/src/main/java/com/ghy/payment/domain/ReverseRecord.java @@ -17,12 +17,24 @@ public class ReverseRecord { private String orderNo; @JSONField(name = "payment_id") private String paymentId; + /** + * 本次撤销金额 + */ @JSONField(name = "reverse_amt") private String reverseAmt; + /** + * 原支付对象已撤销金额,包括已撤销完成金额和撤销处理中的金额 + */ @JSONField(name = "reversed_amt") private String reversedAmt; + /** + * 当前支付对象已确认金额 + */ @JSONField(name = "confirmed_amt") private String confirmedAmt; + /** + * 当前支付确认对象已退款金额,包括已退款完成金额和退款处理中的金额 + */ @JSONField(name = "refunded_amt") private String refundedAmt; @JSONField(name = "error_code") diff --git a/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java b/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java index e939f21d..d1ebdf17 100644 --- a/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java +++ b/ghy-payment/src/main/java/com/ghy/payment/mapper/ReverseRecordMapper.java @@ -2,7 +2,27 @@ package com.ghy.payment.mapper; import com.ghy.payment.domain.ReverseRecord; +/** + * 退款记录Mapper + * + * @author HH + * @date 2023/4/18 + */ public interface ReverseRecordMapper { + /** + * 全字段insert + * + * @param record 退款记录 + * @return Affected rows + */ int insert(ReverseRecord record); + + /** + * 全字段update + * + * @param record 退款记录 + * @return Affected rows + */ + int update(ReverseRecord record); } diff --git a/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml b/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml index 405a76cb..3ab6c5c0 100644 --- a/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml +++ b/ghy-payment/src/main/resources/mapper/payment/ReverseRecordMapper.xml @@ -2,6 +2,23 @@ + + + + + + + + + + + + + + + + + SELECT id, status, order_no, payment_id, reverse_amt, reversed_amt, confirmed_amt, refunded_amt, error_code, error_msg, error_type, created_time, create_time, dept_id @@ -15,4 +32,14 @@ #{refundedAmt}, #{errorCode}, #{errorMsg}, #{errorType}, #{createdTime}, #{deptId}) + + UPDATE reverse_record + SET status = #{status}, order_no = #{orderNo}, payment_id = #{paymentId}, + reverse_amt = #{reverseAmt}, reversed_amt = #{reversedAmt}, + confirmed_amt = #{confirmedAmt}, refunded_amt = #{refundedAmt}, + error_code = #{errorCode}, error_msg = #{errorMsg}, error_type = #{errorType}, + created_time = #{createdTime}, dept_id = #{deptId} + WHERE id = #{id} + + \ No newline at end of file From 4e253e37a6c2acaab6f80e25b25aa3bafe0845d6 Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 13:03:18 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=97=A5=E5=BF=97=E4=BB=A5=E4=BE=BF=E6=8E=92?= =?UTF-8?q?=E6=9F=A5=E9=97=AE=E9=A2=98=EF=BC=9B=E5=85=B3=E9=97=ADmybatis?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/AfterServiceRecordController.java | 58 ++++++++----------- .../order/OrderDetailController.java | 6 +- .../order/OrderMasterController.java | 5 +- .../main/resources/mybatis/mybatis-config.xml | 2 +- .../service/impl/OrderDetailServiceImpl.java | 20 ++----- 5 files changed, 38 insertions(+), 53 deletions(-) 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 8133cecc..c89c0c11 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 @@ -1,22 +1,22 @@ package com.ghy.web.controller.order; -import java.util.List; -import java.util.stream.Collectors; - +import com.ghy.common.annotation.Log; +import com.ghy.common.core.controller.BaseController; +import com.ghy.common.core.domain.AjaxResult; +import com.ghy.common.core.page.TableDataInfo; +import com.ghy.common.enums.BusinessType; +import com.ghy.common.utils.poi.ExcelUtil; +import com.ghy.order.domain.AfterServiceRecord; +import com.ghy.order.service.IAfterServiceRecordService; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; -import com.ghy.common.annotation.Log; -import com.ghy.common.enums.BusinessType; -import com.ghy.order.domain.AfterServiceRecord; -import com.ghy.order.service.IAfterServiceRecordService; -import com.ghy.common.core.controller.BaseController; -import com.ghy.common.core.domain.AjaxResult; -import com.ghy.common.utils.poi.ExcelUtil; -import com.ghy.common.core.page.TableDataInfo; + +import java.util.List; +import java.util.stream.Collectors; /** * 售后记录Controller @@ -26,8 +26,7 @@ import com.ghy.common.core.page.TableDataInfo; */ @Controller @RequestMapping("/worker/record") -public class AfterServiceRecordController extends BaseController -{ +public class AfterServiceRecordController extends BaseController { private String prefix = "worker/record"; @Autowired @@ -35,14 +34,13 @@ public class AfterServiceRecordController extends BaseController @RequiresPermissions("worker:record:view") @GetMapping() - public String record() - { + public String record() { return prefix + "/record"; } @PostMapping("/all/list") @ResponseBody - public TableDataInfo allList(AfterServiceRecord afterServiceRecord){ + public TableDataInfo allList(AfterServiceRecord afterServiceRecord) { List list = afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); List orderDetailIds = list.stream().map(AfterServiceRecord::getOrderDetailId).collect(Collectors.toList()); @@ -57,8 +55,7 @@ public class AfterServiceRecordController extends BaseController @RequiresPermissions("worker:record:list") @PostMapping("/list") @ResponseBody - public TableDataInfo list(AfterServiceRecord afterServiceRecord) - { + public TableDataInfo list(AfterServiceRecord afterServiceRecord) { startPage(); List list = afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); return getDataTable(list); @@ -69,8 +66,7 @@ public class AfterServiceRecordController extends BaseController */ @PostMapping("/app/list") @ResponseBody - public TableDataInfo appList(@RequestBody AfterServiceRecord afterServiceRecord) - { + public TableDataInfo appList(@RequestBody AfterServiceRecord afterServiceRecord) { startPage(); List list = afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); return getDataTable(list); @@ -84,8 +80,7 @@ public class AfterServiceRecordController extends BaseController @Log(title = "售后记录", businessType = BusinessType.EXPORT) @PostMapping("/export") @ResponseBody - public AjaxResult export(AfterServiceRecord afterServiceRecord) - { + public AjaxResult export(AfterServiceRecord afterServiceRecord) { List list = afterServiceRecordService.selectAfterServiceRecordList(afterServiceRecord); ExcelUtil util = new ExcelUtil(AfterServiceRecord.class); return util.exportExcel(list, "售后记录数据"); @@ -95,8 +90,7 @@ public class AfterServiceRecordController extends BaseController * 新增售后记录 */ @GetMapping("/add") - public String add() - { + public String add() { return prefix + "/add"; } @@ -106,8 +100,8 @@ public class AfterServiceRecordController extends BaseController @Log(title = "售后记录", businessType = BusinessType.INSERT) @PostMapping("/add") @ResponseBody - public AjaxResult addSave(@RequestBody AfterServiceRecord afterServiceRecord) - { + public AjaxResult addSave(@RequestBody AfterServiceRecord afterServiceRecord) { + logger.info("新增售后记录:{}", afterServiceRecord); return toAjax(afterServiceRecordService.insertAfterServiceRecord(afterServiceRecord)); } @@ -116,8 +110,7 @@ public class AfterServiceRecordController extends BaseController */ @RequiresPermissions("worker:record:edit") @GetMapping("/edit/{id}") - public String edit(@PathVariable("id") String id, ModelMap mmap) - { + public String edit(@PathVariable("id") String id, ModelMap mmap) { AfterServiceRecord afterServiceRecord = afterServiceRecordService.selectAfterServiceRecordById(id); mmap.put("afterServiceRecord", afterServiceRecord); return prefix + "/edit"; @@ -129,8 +122,8 @@ public class AfterServiceRecordController extends BaseController @Log(title = "售后记录", businessType = BusinessType.UPDATE) @PostMapping("/edit") @ResponseBody - public AjaxResult editSave(@RequestBody AfterServiceRecord afterServiceRecord) - { + public AjaxResult editSave(@RequestBody AfterServiceRecord afterServiceRecord) { + logger.info("修改售后记录:{}", afterServiceRecord); try { return toAjax(afterServiceRecordService.updateAfterServiceRecord(afterServiceRecord)); } catch (Exception exception) { @@ -144,10 +137,9 @@ public class AfterServiceRecordController extends BaseController */ // @RequiresPermissions("worker:record:remove") @Log(title = "售后记录", businessType = BusinessType.DELETE) - @PostMapping( "/remove") + @PostMapping("/remove") @ResponseBody - public AjaxResult remove(String ids) - { + public AjaxResult remove(String ids) { return toAjax(afterServiceRecordService.deleteAfterServiceRecordByIds(ids)); } } 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 fd09497b..17e37f75 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 @@ -723,6 +723,7 @@ public class OrderDetailController extends BaseController { @PostMapping("/finish") @ResponseBody public AjaxResult finish(Long orderDetailId) { + logger.info("消费者确认完成子订单,orderDetailId={}", orderDetailId); try { orderDetailService.finish(orderDetailId); } catch (BaseAdaPayException e) { @@ -740,6 +741,7 @@ public class OrderDetailController extends BaseController { @PostMapping("/cancel") @ResponseBody public AjaxResult applyForCancel(Long orderDetailId) throws BaseAdaPayException { + logger.info("消费者申请取消子订单,orderDetailId={}", orderDetailId); orderDetailService.applyForCancel(orderDetailId); return AjaxResult.success(); } @@ -753,6 +755,7 @@ public class OrderDetailController extends BaseController { @PostMapping("/cancel/agree") @ResponseBody public AjaxResult cancelAgree(Long orderDetailId, Integer agree) throws BaseAdaPayException { + logger.info("师傅审核取消子订单申请,orderDetailId={},agree={}", orderDetailId, agree); orderDetailService.cancelAgree(orderDetailId, agree); return AjaxResult.success(); } @@ -765,7 +768,8 @@ public class OrderDetailController extends BaseController { @PostMapping("/app/applyFinishOrder") @ResponseBody @Transactional(rollbackFor = Exception.class) - public AjaxResult applyFinishOrder(@RequestBody OrderProcessRequest request) throws Exception { + public AjaxResult applyFinishOrder(@RequestBody OrderProcessRequest request) { + logger.info("师傅发起完单,orderDetailId={}", request.getOrderDetailId()); // 判断工单状态是否为服务中以及是否已支付 OrderDetail orderDetail = orderDetailService.selectById(request.getOrderDetailId()); OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId()); diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java index 40355df3..302192ca 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderMasterController.java @@ -734,8 +734,8 @@ public class OrderMasterController extends BaseController { */ @PostMapping("/cancel") @ResponseBody - public AjaxResult cancel(Long orderMasterId) throws BaseAdaPayException { - // 校验 + public AjaxResult applyForCancel(Long orderMasterId) throws BaseAdaPayException { + logger.info("消费者申请取消主订单,orderMasterId={}", orderMasterId); List orderDetails = orderDetailService.selectByOrderMasterId(orderMasterId); for (OrderDetail detail : orderDetails) { if (detail.getOrderStatus() != 6) { @@ -755,6 +755,7 @@ public class OrderMasterController extends BaseController { @PostMapping("/cancel/agree") @ResponseBody public AjaxResult cancelAgree(Long orderMasterId, Integer agree) { + logger.info("师傅审核取消主订单申请,orderMasterId={}, agree={}", orderMasterId, agree); orderMasterService.cancelAgree(orderMasterId, agree); return AjaxResult.success(); } diff --git a/ghy-admin/src/main/resources/mybatis/mybatis-config.xml b/ghy-admin/src/main/resources/mybatis/mybatis-config.xml index ac47c038..837a9c0f 100644 --- a/ghy-admin/src/main/resources/mybatis/mybatis-config.xml +++ b/ghy-admin/src/main/resources/mybatis/mybatis-config.xml @@ -12,7 +12,7 @@ PUBLIC "-//mybatis.org//DTD Config 3.0//EN" - + 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 c52f7b21..552b76fd 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 @@ -216,22 +216,6 @@ public class OrderDetailServiceImpl implements OrderDetailService { 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.applyForCancel(orderDetail.getOrderMasterId()); - return; - } - switch (orderDetail.getOrderStatus()) { case 0: case 1: // 待接单和待排期状态可直接取消 @@ -239,12 +223,15 @@ public class OrderDetailServiceImpl implements OrderDetailService { break; case 2: // 待上门状态需要师傅同意才能取消 orderDetailMapper.updateStatus(orderDetailId, OrderStatus.GOING_CANCEL.code()); + logger.info("Set OrderDetail[{}].orderStatus = {}", orderDetailId, OrderStatus.GOING_CANCEL.code()); break; case 3: // 服务中状态需要师傅同意才能取消 orderDetailMapper.updateStatus(orderDetailId, OrderStatus.SERVER_CANCEL.code()); + logger.info("Set OrderDetail[{}].orderStatus = {}", orderDetailId, OrderStatus.SERVER_CANCEL.code()); break; case 4: // 待确认状态需要师傅同意才能取消 orderDetailMapper.updateStatus(orderDetailId, OrderStatus.FINISH_CHECK_CANCEL.code()); + logger.info("Set OrderDetail[{}].orderStatus = {}", orderDetailId, OrderStatus.FINISH_CHECK_CANCEL.code()); break; default: // 其他状态不可取消 throw new IllegalArgumentException("这个子订单不能取消了"); @@ -266,6 +253,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { } // 更新子订单状态 orderDetailMapper.updateStatus(orderDetailId, OrderStatus.CANCEL.code()); + logger.info("Set OrderDetail[{}].orderStatus = {}", orderDetailId, OrderStatus.CANCEL.code()); // 查询出所有的子订单 就走主订单取消流程 List orderDetails = orderDetailMapper.selectByOrderMasterId(orderDetail.getOrderMasterId()); // 发起退款 From 0f34e80746542df29d2090963874a70fc69de65c Mon Sep 17 00:00:00 2001 From: HH Date: Tue, 18 Apr 2023 13:26:00 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E5=B7=B2=E5=8F=96=E6=B6=88/=E5=B7=B2?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=9A=84=E8=AE=A2=E5=8D=95=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E5=86=8D=E5=8F=96=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ghy/order/service/impl/OrderDetailServiceImpl.java | 4 ++-- .../com/ghy/order/service/impl/OrderMasterServiceImpl.java | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) 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 552b76fd..d27cffff 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 @@ -247,8 +247,8 @@ public class OrderDetailServiceImpl implements OrderDetailService { public void cancel(long orderDetailId) throws BaseAdaPayException { OrderDetail orderDetail = selectById(orderDetailId); Assert.notNull(orderDetail, "找不到对应的子订单"); - if (OrderStatus.CANCEL.code() == orderDetail.getOrderStatus()) { - logger.info("子订单[id={}]已经是取消状态了", orderDetailId); + if (OrderStatus.FINISH.code() == orderDetail.getOrderStatus() || OrderStatus.CANCEL.code() == orderDetail.getOrderStatus()) { + logger.info("子订单[id={}]状态不正确,orderStatus={}", orderDetailId, orderDetail.getOrderStatus()); return; } // 更新子订单状态 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 ee505e78..da1e4bfa 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 @@ -332,6 +332,10 @@ public class OrderMasterServiceImpl implements OrderMasterService { Assert.notNull(orderMaster, "找不到对应的订单"); if (Integer.valueOf(1).equals(agree)) { // 师傅同意取消订单 + if (OrderStatus.FINISH.code() == orderMaster.getOrderStatus() || OrderStatus.CANCEL.code() == orderMaster.getOrderStatus()) { + logger.info("订单[id={}]状态不正确,orderStatus={}", orderMasterId, orderMaster.getOrderStatus()); + return; + } // 把主订单状态设置为已取消 updateStatus(orderMasterId, OrderStatus.CANCEL.code()); // 把所有子订单状态设置为已取消