This commit is contained in:
kuang.yifei@iwhalecloud.com 2022-07-22 17:55:30 +08:00
commit c92c4e7e41
9 changed files with 155 additions and 25 deletions

View File

@ -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();
}
}

View File

@ -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<String, Object> 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) {

View File

@ -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();
}
/**
* 发起退款
*

View File

@ -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<DivMember> 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<String, Object> 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) {

View File

@ -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;

View File

@ -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, "待上门"),

View File

@ -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);
}

View File

@ -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<FinancialDetail> 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());
}
}

View File

@ -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");