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 643df426..8429e450 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 @@ -392,4 +392,29 @@ public class OrderMasterController extends BaseController { public String checkOrderMasterCodeUnique(OrderMaster orderMaster) { return orderMasterService.checkOrderMasterCodeUnique(orderMaster); } + + /** + * 消费者申请取消主订单 + * + * @param orderMasterId 主订单ID + */ + @PostMapping("/cancel") + @ResponseBody + public AjaxResult cancel(Long orderMasterId) { + orderMasterService.cancel(orderMasterId); + return AjaxResult.success(); + } + + /** + * 师傅审核取消主订单申请 + * + * @param orderMasterId 主订单ID + * @param agree 0=不同意 1=同意 + */ + @PostMapping("/cancel/agree") + @ResponseBody + public AjaxResult cancelAgree(Long orderMasterId, Integer agree) { + orderMasterService.cancelAgree(orderMasterId, agree); + return AjaxResult.success(); + } } diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java index e4c2c792..469bab51 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/AlipayController.java @@ -1,12 +1,12 @@ package com.ghy.web.controller.pay; -import com.ghy.payment.service.AdapayService; import com.ghy.common.adapay.model.PayParam; import com.ghy.common.core.controller.BaseController; import com.ghy.common.core.domain.AjaxResult; import com.ghy.order.domain.OrderMaster; import com.ghy.order.service.OrderMasterService; import com.ghy.payment.domain.FinancialMaster; +import com.ghy.payment.service.AdapayService; import com.ghy.payment.service.FinancialMasterService; import com.huifu.adapay.core.exception.BaseAdaPayException; import org.springframework.web.bind.annotation.PostMapping; @@ -50,7 +50,7 @@ public class AlipayController extends BaseController { Map map; String payMoney = fm.getPayMoney().setScale(2, BigDecimal.ROUND_UNNECESSARY).toString(); // TODO 这里需要补充商品标题和商品描述信息 - PayParam payParam = PayParam.createDelayPay(om.getCode() + "_" + System.currentTimeMillis(), "0.01", "商品标题", "商品描述信息"); + PayParam payParam = PayParam.delayPayParam(om.getCode() + "_" + System.currentTimeMillis(), "0.01", "商品标题", "商品描述信息"); try { map = adapayService.alipayQrPay(om.getDeptId(), payParam, null, null, null); } catch (BaseAdaPayException e) { diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/pay/PayController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/PayController.java index e1e3c0ee..4aa9cbf8 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/pay/PayController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/PayController.java @@ -36,16 +36,6 @@ public class PayController { @Resource private FinancialMasterService financialMasterService; - /** - * 确认支付 - * - * @param orderMasterId 主订单ID - */ - public AjaxResult confirm(Long orderMasterId) throws BaseAdaPayException { - orderMasterService.confirm(orderMasterId); - return AjaxResult.success(); - } - /** * 发起退款 * diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java b/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java index dc787a3b..aa0856bd 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/pay/WxPayController.java @@ -39,7 +39,7 @@ public class WxPayController extends BaseController { @PostMapping("drawCash") @ResponseBody - public AjaxResult drawCash(@RequestBody JSONObject object){ + public AjaxResult drawCash(@RequestBody JSONObject object) { try { // 101 123dasda D0 1.00 C7D101 Long deptId = object.getLong("deptId"); @@ -50,7 +50,7 @@ public class WxPayController extends BaseController { String remark = object.getStr("remark"); adapayService.drawCash(deptId, orderNo, cashType, cashAmt, memberId, remark, null); return AjaxResult.success("操作成功"); - }catch (Exception e){ + } catch (Exception e) { return AjaxResult.error("操作失败"); } } @@ -74,7 +74,7 @@ public class WxPayController extends BaseController { List divMembers = new ArrayList<>(); divMembers.add(new DivMember("C7D101", String.valueOf(financialMaster.getPayMoney()), true)); // TODO 订单里需要补充支付金额、tittle、简要描述、分账信息、description - PayParam payParam = new PayParam(orderMaster.getCode() + "_" + System.currentTimeMillis(), + PayParam payParam = PayParam.delayPayParam(orderMaster.getCode() + "_" + System.currentTimeMillis(), String.valueOf(financialMaster.getPayMoney()), "工圈子居家设备", "工圈子居家设备购买付费"); map = adapayService.wxLitePay(orderMaster.getDeptId(), payParam, expend, null, null); } catch (BaseAdaPayException e) { @@ -107,7 +107,7 @@ public class WxPayController extends BaseController { WxpayExpend expend = new WxpayExpend(); expend.setOpenId(openId); Map map; - PayParam payParam = new PayParam(orderMaster.getCode(), "0.01", "工圈子测试", "工圈子测试描述"); + PayParam payParam = PayParam.delayPayParam(orderMaster.getCode(), "0.01", "工圈子测试", "工圈子测试描述"); map = adapayService.wxPubPay(orderMaster.getDeptId(), payParam, expend, null, null); return AjaxResult.success(map); } catch (Exception e) { diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/model/PayParam.java b/ghy-common/src/main/java/com/ghy/common/adapay/model/PayParam.java index 67955be1..3b86f10a 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/model/PayParam.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/model/PayParam.java @@ -90,7 +90,7 @@ public class PayParam { * @param goodsDesc [必填项]商品描述信息,微信小程序和微信公众号该字段最大长度42个字符 * @return 支付参数 */ - public static PayParam createDelayPay(String orderNo, String payAmt, String goodsTittle, String goodsDesc) { + public static PayParam delayPayParam(String orderNo, String payAmt, String goodsTittle, String goodsDesc) { PayParam payParam = new PayParam(orderNo, payAmt, goodsTittle, goodsDesc); payParam.setPayMode("delay"); return payParam; diff --git a/ghy-common/src/main/java/com/ghy/common/enums/OrderStatus.java b/ghy-common/src/main/java/com/ghy/common/enums/OrderStatus.java index f244cdb3..1c037297 100644 --- a/ghy-common/src/main/java/com/ghy/common/enums/OrderStatus.java +++ b/ghy-common/src/main/java/com/ghy/common/enums/OrderStatus.java @@ -7,12 +7,16 @@ import java.util.Map; import java.util.stream.Collectors; /** - * 订单状态 + * 订单状态 * * @author clunt */ public enum OrderStatus implements IEnumType { + GOING_CANCEL(-2, "待上门时申请取消"), + SERVER_CANCEL(-3, "服务中申请取消"), + FINISH_CHECK_CANCEL(-4, "待确认时申请取消"), + RECEIVE(0, "待接单"), PLAIN(1, "待排期"), GOING(2, "待上门"), 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 b9417dfe..3d5432a4 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 @@ -83,7 +83,7 @@ public interface OrderMasterService { * * @param orderMasterId 主订单ID */ - void confirm(Long orderMasterId) throws BaseAdaPayException; + void finish(Long orderMasterId) throws BaseAdaPayException; /** * 发起提现 @@ -93,4 +93,19 @@ public interface OrderMasterService { * @param amount 提现金额 */ void drawCash(Long deptId, String memberId, String amount) throws BaseAdaPayException; + + /** + * 消费者申请取消主订单 + * + * @param orderMasterId 主订单ID + */ + void cancel(Long orderMasterId); + + /** + * 师傅同意取消主订单 + * + * @param orderMasterId 主订单ID + * @param agree 0=不同意 1=同意 + */ + void cancelAgree(Long orderMasterId, Integer agree); } 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 eb652bf0..666629d0 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 @@ -1,5 +1,6 @@ package com.ghy.order.service.impl; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.DivMember; @@ -7,6 +8,7 @@ import com.ghy.common.adapay.model.PaymentDTO; import com.ghy.common.constant.UserConstants; 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.utils.AdapayUtils; import com.ghy.order.domain.OrderMaster; @@ -77,7 +79,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { public int updateOrderMaster(OrderMaster orderMaster) throws BaseAdaPayException { if (orderMaster.getOrderStatus().equals(OrderStatus.FINISH.code())) { logger.info("订单[ID={}]完成,进入确认分账", orderMaster.getId()); - confirm(orderMaster.getId()); + finish(orderMaster.getId()); } return orderMasterMapper.updateOrderMaster(orderMaster); } @@ -125,7 +127,7 @@ public class OrderMasterServiceImpl implements OrderMasterService { @Override @Transactional(rollbackFor = Exception.class) - public void confirm(Long orderMasterId) throws BaseAdaPayException { + public void finish(Long orderMasterId) throws BaseAdaPayException { // 校验订单 OrderMaster orderMaster = selectById(orderMasterId); Assert.notNull(orderMaster, "找不到对应的订单"); @@ -168,8 +170,15 @@ public class OrderMasterServiceImpl implements OrderMasterService { break; case 3: // 分销 - memberId = AdapayUtils.getCustomerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId()); - memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add); + Long payeeId = financialDetail.getPayeeId(); + if (payeeId != null) { + memberId = AdapayUtils.getCustomerMemberId(payeeId, orderMaster.getDeptId()); + // 如果有分销人 那这笔钱就是分销人的 + memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add); + } else { + // 如果没有分销人 那这笔钱就分到平台账户 + memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add); + } break; case 4: // 退款 @@ -200,10 +209,11 @@ public class OrderMasterServiceImpl implements OrderMasterService { } } - + logger.info("订单[code={}]分账信息: {}", orderMaster.getCode(), JSON.toJSONString(divMembers)); JSONObject response = adapayService.paymentConfirm(orderMaster.getDeptId(), payment.getId(), payment.getOrderNo(), AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null); logger.info("订单[code={}]分账结果: {}", orderMaster.getCode(), response.toJSONString()); + boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); // 如果确认支付失败 这里抛出异常 Assert.isTrue(status, response.getString("error_msg")); @@ -235,4 +245,90 @@ public class OrderMasterServiceImpl implements OrderMasterService { boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); Assert.isTrue(status, response.getString("error_msg")); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancel(Long orderMasterId) { + OrderMaster orderMaster = selectById(orderMasterId); + Assert.notNull(orderMaster, "找不到对应的订单"); + switch (orderMaster.getOrderStatus()) { + case 0: // 待接单状态可直接取消 + case 1: // 待排期状态可直接取消 + updateStatus(orderMasterId, OrderStatus.CANCEL.code()); + // 发起退款 + try { + refund(orderMaster); + } catch (BaseAdaPayException e) { + logger.error("订单[code={}]退款失败", orderMaster.getCode(), e); + } + break; + case 2: // 待上门状态需要师傅同意才能取消 + updateStatus(orderMasterId, OrderStatus.GOING_CANCEL.code()); + break; + case 3: // 服务中状态需要师傅同意才能取消 + updateStatus(orderMasterId, OrderStatus.SERVER_CANCEL.code()); + break; + case 4: // 待确认状态需要师傅同意才能取消 + updateStatus(orderMasterId, OrderStatus.FINISH_CHECK_CANCEL.code()); + break; + default: // 其他状态不可取消 + throw new IllegalArgumentException("这个订单不能取消了"); + } + } + + @Override + public void cancelAgree(Long orderMasterId, Integer agree) { + OrderMaster orderMaster = selectById(orderMasterId); + Assert.notNull(orderMaster, "找不到对应的订单"); + if (Integer.valueOf(1).equals(agree)) { + // 师傅同意取消订单 + // 修改主订单状态为已取消 + updateStatus(orderMasterId, OrderStatus.CANCEL.code()); + // 发起退款 + try { + refund(orderMaster); + } catch (BaseAdaPayException e) { + logger.error("订单[code={}]退款失败", orderMaster.getCode(), e); + } + } else { + // 师傅不同意取消订单 + Integer orderStatus = orderMaster.getOrderStatus(); + // 修改主订单状态为原来的状态 + updateStatus(orderMasterId, Math.abs(orderStatus)); + } + } + + /** + * 主订单发起退款 + * + * @param orderMaster 主订单 + */ + public void refund(OrderMaster orderMaster) throws BaseAdaPayException { + FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderMaster.getId()); + // 支付状态 + Integer payStatus = financialMaster.getPayStatus(); + if (!payStatus.equals(1)) { + // 如果状态不是已支付 则不需要退款 + return; + } + List financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); + + // 主订单实付金额 - 已退款金额 = 待退款金额 + BigDecimal payMoney = financialMaster.getPayMoney(); + for (FinancialDetail fd : financialDetails) { + if (FinancialDetailType.RETURN_FEE.getCode().equals(fd.getFinancialDetailType())) { + // 如果有退款子财务单 则减去子财务单的已退款金额 + payMoney = payMoney.subtract(fd.getPayMoney()); + } + } + + if (BigDecimal.ZERO.compareTo(payMoney) > -1) { + logger.info("订单[code={}]待退款金额<=0,不需要退款", orderMaster.getCode()); + return; + } + + String refundAmt = AdapayUtils.bigDecimalToString(payMoney); + JSONObject response = adapayService.payReverse(orderMaster.getDeptId(), financialMaster.getPaymentId(), refundAmt); + logger.info("退款结果: " + response.toJSONString()); + } } 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 23919acf..7ac76ae9 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 @@ -45,7 +45,7 @@ public class PayReverseCallbackService implements CallBackService { @Override public void onResponse(JSONObject response) { logger.debug("撤销支付 Response: {}", response.toString()); - if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { + if (AdapayStatusEnum.pending.code.equals(response.getString("status"))) { String reverseId = response.getString("id"); String paymentId = response.getString("payment_id"); String reverseAmt = response.getString("reverse_amt");