From 2889674eed1ac3c9c1691e8ce15016be422a59fe Mon Sep 17 00:00:00 2001 From: "kuang.yife" Date: Mon, 17 Apr 2023 11:04:22 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=9C=89=E5=AD=90?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E3=80=82=E6=8F=90=E7=A4=BA=EF=BC=9A=E9=80=80?= =?UTF-8?q?=E5=8D=95=E8=AF=B7=E5=85=A5=E8=AF=A6=E6=83=85=E5=86=85=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ghy/web/controller/order/OrderMasterController.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 c4d0ae4a..40355df3 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 @@ -735,6 +735,13 @@ public class OrderMasterController extends BaseController { @PostMapping("/cancel") @ResponseBody public AjaxResult cancel(Long orderMasterId) throws BaseAdaPayException { + // 校验 + List orderDetails = orderDetailService.selectByOrderMasterId(orderMasterId); + for (OrderDetail detail : orderDetails) { + if (detail.getOrderStatus() != 6) { + return AjaxResult.error("退单请入详情内操作!"); + } + } orderMasterService.applyForCancel(orderMasterId); return AjaxResult.success(); } From fc6d56dd70a6b8334595aaf2302dd77e88ed6c04 Mon Sep 17 00:00:00 2001 From: "kuang.yife" Date: Mon, 17 Apr 2023 19:29:19 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E5=AE=8C=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB?= =?UTF-8?q?=E8=BE=91=20+=20=E4=B8=BB=E5=8D=95=E7=8A=B6=E6=80=81=E9=9A=8F?= =?UTF-8?q?=E5=8A=A8=E6=9B=B4=E6=96=B0bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../order/service/impl/OrderDetailServiceImpl.java | 4 +++- .../order/service/impl/OrderMasterServiceImpl.java | 13 +++++++------ 2 files changed, 10 insertions(+), 7 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 8fd59a0a..1e3e18b0 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 @@ -137,7 +137,9 @@ public class OrderDetailServiceImpl implements OrderDetailService { break; } } - if (flag) { + // 判断主单是否全部派单 + boolean allAssign = orderMasterService.isAllAssign(detailInfo.getOrderMasterId()); + if (flag && allAssign) { OrderMaster orderMaster = orderMasterMapper.selectById(detailInfo.getOrderMasterId()); if (ObjectUtils.isEmpty(orderDetail.getExpectTimeStart())) { orderMaster.setOrderStatus(orderStatus); 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 8e4d7164..abcf3f4a 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 @@ -445,11 +445,12 @@ public class OrderMasterServiceImpl implements OrderMasterService { Assert.notNull(orderMaster, "OrderMaster is null!!!"); // 先判断主订单是否派完单 List masterGoods = orderGoodsService.selectByOrderMasterId(orderMasterId); - long masterCount = masterGoods.stream().mapToInt(OrderGoods::getGoodsNum).sum(); - long detailCount = orderDetailService.selectByOrderMasterId(orderMasterId).stream().mapToInt(x -> { - List detailGoods = orderGoodsService.selectByOrderDetailId(x.getId()); - return detailGoods.stream().mapToInt(OrderGoods::getGoodsNum).sum(); - }).sum(); - return masterCount == detailCount; + for (OrderGoods orderGoods : masterGoods) { + // 是否有未派完的子单 + if(!orderGoods.getGoodsNum().equals(orderGoods.getServerGoodsNum())){ + return false; + } + } + return true; } } From a6bc860587a4144c9019b185ac837384149bbf43 Mon Sep 17 00:00:00 2001 From: Hawking Date: Tue, 18 Apr 2023 01:11:26 +0800 Subject: [PATCH 3/3] =?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