From f32281f51c07f0bfc7cb5bb08d1e7ca2f1ace743 Mon Sep 17 00:00:00 2001 From: "Stormeye.Wu" Date: Mon, 3 Sep 2018 18:00:31 +0800 Subject: [PATCH] =?UTF-8?q?[=E9=80=80=E6=AC=BE=E9=80=80=E5=88=B8][?= =?UTF-8?q?=E4=BF=AE=E6=94=B9]:=E9=80=80=E6=AC=BE=E9=80=80=E5=88=B8?= =?UTF-8?q?=E4=BF=AE=E6=94=B9,=E6=94=BE=E5=88=B0=E4=B8=80=E8=B5=B7?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81B/Admin/Auto/=E8=87=AA=E5=B7=B1?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WxCouponOrderController.java | 29 ---- .../controller/WxRefundOrderController.java | 58 ++------ .../controller/WxCouponOrderController.java | 28 ---- .../java/com/simple/common/ErrorCode.java | 1 + .../java/com/simple/enums/EnumRefundWay.java | 37 +++++ .../simple/service/WxCouponOrderService.java | 9 -- .../simple/service/WxRefundOrderService.java | 9 +- .../impl/WxCouponOrderServiceImpl.java | 61 +------- .../impl/WxRefundOrderServiceImpl.java | 140 +++++++++++++++--- 9 files changed, 175 insertions(+), 197 deletions(-) create mode 100644 mallinkService/src/main/java/com/simple/enums/EnumRefundWay.java diff --git a/mallinkBApi/src/main/java/com/simple/controller/WxCouponOrderController.java b/mallinkBApi/src/main/java/com/simple/controller/WxCouponOrderController.java index 3b0ea89ee..234a58173 100644 --- a/mallinkBApi/src/main/java/com/simple/controller/WxCouponOrderController.java +++ b/mallinkBApi/src/main/java/com/simple/controller/WxCouponOrderController.java @@ -130,35 +130,6 @@ public class WxCouponOrderController extends BaseController { } } - @ApiOperation(value = "退券接口", notes = "{\"couponOrderId\":\"string\"}") - @PostMapping("refund") - public ResultData refund(@RequestBody Map paramMap) { - logger.info(paramMap.toString()); - String couponOrderIdStr = paramMap.get("couponOrderId"); - if (StringUtils.isBlank(couponOrderIdStr)) { - logger.error("couponOrderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - Long couponOrderId = 0L; - try { - couponOrderId = Long.valueOf(couponOrderIdStr); - } catch (NumberFormatException e) { - logger.error("couponOrderId参数不正确: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); - } - try { - ResultData rd = wxCouponOrderService.refund(couponOrderId, getUser().getId()); - return rd; - } catch (MallinkException e) { - logger.error("退券异常: " + e.getMessage()); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error("退券异常: " + e.getMessage()); - return new ResultData(ErrorCode.REFUND_ORDER_ERROR, e.getMessage()); - } - } - - @ApiOperation(value = "根据couponOrderId查询接口", notes = "{\"couponOrderId\":\"string\"}") @PostMapping("/findById") public ResultData findById(@RequestBody Map paramMap) { diff --git a/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java b/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java index fc9b9f350..22481f9a1 100644 --- a/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java +++ b/mallinkBApi/src/main/java/com/simple/controller/WxRefundOrderController.java @@ -8,6 +8,7 @@ import com.simple.config.PayProperty; import com.simple.domain.po.*; import com.simple.enums.EnumPayStatus; import com.simple.enums.EnumPayWay; +import com.simple.enums.EnumRefundWay; import com.simple.exception.MallinkException; import com.simple.service.*; import io.swagger.annotations.Api; @@ -42,68 +43,29 @@ public class WxRefundOrderController extends BaseController { @Autowired private WxRefundOrderService wxRefundOrderService; - @ApiOperation(value = "发起退款", notes = "{\"orderId\":\"string\"}") + @ApiOperation(value = "退券退款", notes = "{\"couponOrderId\":\"string\"}") @PostMapping("/create") public ResultData create(@RequestBody Map paramMap) { - // couponOrder发起退款 - logger.info("/api/refund/create" + paramMap.toString()); //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); - String orderIdStr = paramMap.get("orderId"); - if (StringUtils.isBlank(orderIdStr)) { - logger.error("orderId不能为空: " + paramMap.toString()); + logger.info(paramMap.toString()); + String couponOrderIdStr = paramMap.get("couponOrderId"); + if (StringUtils.isBlank(couponOrderIdStr)) { + logger.error("couponOrderId不能为空: " + paramMap.toString()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } - Long orderId = 0L; + Long couponOrderId = 0L; try { - orderId = Long.valueOf(orderIdStr); + couponOrderId = Long.valueOf(couponOrderIdStr); } catch (NumberFormatException e) { - logger.error("orderId参数不正确: " + paramMap.toString()); + logger.error("couponOrderId参数不正确: " + paramMap.toString()); return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); } - WxOrder order = null; - try { - order = wxOrderService.getById(orderId); - } catch (Exception e) { - logger.error("订单不存在: " + orderIdStr); - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND.getCode(), "订单不存在: " + orderIdStr); - } - if (order == null) { - logger.error("订单不存在: " + orderIdStr); - return new ResultData(ErrorCode.ORDER_IS_NOT_FIND.getCode(), "订单不存在: " + orderIdStr); - } - if (order.getPayment() <= 0) { - logger.error("订单支付金额小于等于0: " + order.toString()); - throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_ZERO); - } - - WxPayOrder payOrderQ = new WxPayOrder(); - payOrderQ.setCUserId(order.getCUserId()); - payOrderQ.setOrderId(orderId); - payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); - - WxPayOrder payOrder = null; - - try { - payOrder = wxPayOrderService.getByObj(payOrderQ); - } catch (Exception e) { - logger.error("支付订单不存在(payOrder不存在)"); - return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); - } - if (payOrder == null) { - logger.error("支付订单不存在(payOrder不存在)"); - return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); - } - - WxRefundOrder refundOrderQ = new WxRefundOrder(); - refundOrderQ.setPayOrderNo(String.valueOf(payOrder.getId())); - refundOrderQ.setOrderId(orderId); - WxMerchantBUser bUser = getUser(); WxAppinfo appinfo = getAppInfo(bUser.getAppId()); try { - wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, refundOrderQ, payOrder, EnumPayWay.PAY_WAY_WEAPP); + wxRefundOrderService.createRefundOrder(payProperty.isReal(), appinfo, couponOrderId, EnumRefundWay.B, bUser.getId()); return new ResultData(); } catch (MallinkException e) { logger.error(e.getMessage()); diff --git a/mallinkCApi/src/main/java/com/simple/controller/WxCouponOrderController.java b/mallinkCApi/src/main/java/com/simple/controller/WxCouponOrderController.java index 28dd66ae3..86995705e 100644 --- a/mallinkCApi/src/main/java/com/simple/controller/WxCouponOrderController.java +++ b/mallinkCApi/src/main/java/com/simple/controller/WxCouponOrderController.java @@ -31,34 +31,6 @@ public class WxCouponOrderController extends BaseController { @Autowired private WxCouponOrderService wxCouponOrderService; - @ApiOperation(value = "退券接口", notes = "{\"couponOrderId\":\"string\"}") - @PostMapping("refund") - public ResultData refund(@RequestBody Map paramMap) { - logger.info(paramMap.toString()); - String couponOrderIdStr = paramMap.get("couponOrderId"); - if (StringUtils.isBlank(couponOrderIdStr)) { - logger.error("couponOrderId不能为空: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponOrderId不能为空"); - } - Long couponOrderId = 0L; - try { - couponOrderId = Long.valueOf(couponOrderIdStr); - } catch (NumberFormatException e) { - logger.error("couponOrderId参数不正确: " + paramMap.toString()); - return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "couponOrderId参数不正确"); - } - try { - ResultData rd = wxCouponOrderService.refund(couponOrderId, getUser().getId()); - return rd; - } catch (MallinkException e) { - logger.error("退券异常: " + e.getMessage()); - return new ResultData(e.getErrorCode(), e.getMessage()); - } catch (Exception e) { - logger.error("退券异常: " + e.getMessage()); - return new ResultData(ErrorCode.REFUND_ORDER_ERROR, e.getMessage()); - } - } - @ApiOperation("券包分页列表接口") @GetMapping("list") @ApiImplicitParams({ diff --git a/mallinkService/src/main/java/com/simple/common/ErrorCode.java b/mallinkService/src/main/java/com/simple/common/ErrorCode.java index b66a68d66..6b48b6cb6 100644 --- a/mallinkService/src/main/java/com/simple/common/ErrorCode.java +++ b/mallinkService/src/main/java/com/simple/common/ErrorCode.java @@ -113,6 +113,7 @@ public enum ErrorCode{ COUPON_ORDER_IS_USED(4001, "卡券已核销"), COUPON_ORDER_IS_OVER_TIME(4002, "卡券已过期"), COUPON_ORDER_IS_INVALID(4003, "卡券已经作废"), + COUPON_ORDER_BUSER_IS_NULL(4004, "卡券B端用户不存在"), /** diff --git a/mallinkService/src/main/java/com/simple/enums/EnumRefundWay.java b/mallinkService/src/main/java/com/simple/enums/EnumRefundWay.java new file mode 100644 index 000000000..8b8c91bf7 --- /dev/null +++ b/mallinkService/src/main/java/com/simple/enums/EnumRefundWay.java @@ -0,0 +1,37 @@ +package com.simple.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumRefundWay { + + B(0, "B端小程序"), + ADMIN(1, "WEB端小程序"), + C(2, "C端小程序"), + AUTO(3, "自动退款"); + + public static EnumRefundWay getEnum(Integer code) { + for (EnumRefundWay value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumRefundWay(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/simple/service/WxCouponOrderService.java b/mallinkService/src/main/java/com/simple/service/WxCouponOrderService.java index 64d5e077a..59a66cd60 100644 --- a/mallinkService/src/main/java/com/simple/service/WxCouponOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxCouponOrderService.java @@ -62,15 +62,6 @@ public interface WxCouponOrderService { */ ResultData verify(Long couponOrderId, Long bUserId); - /** - * 根据主键couponOrderId(券码)退券(款) - * - * @param couponOrderId - * @param bUserId 退券(款)人(登录用户) - */ - ResultData refund(Long couponOrderId, Long bUserId); - - /** * 根据日期 b用户查券list * diff --git a/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java b/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java index 48c4f7259..68a3b2299 100644 --- a/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java +++ b/mallinkService/src/main/java/com/simple/service/WxRefundOrderService.java @@ -7,6 +7,7 @@ import com.simple.domain.po.WxAppinfo; import com.simple.domain.po.WxPayOrder; import com.simple.domain.po.WxRefundOrder; import com.simple.enums.EnumPayWay; +import com.simple.enums.EnumRefundWay; public interface WxRefundOrderService { @@ -14,12 +15,12 @@ public interface WxRefundOrderService { * 创建退款订单 * @param isReal * @param appInfo - * @param record 退款订单请求 - * @param payOrder 支付订单 - * @param payWay + * @param couponOrderId 券包Id + * @param refundWay 退款来源 + * @param bUserId b端退款Id,auto,admin,self可为null * @return */ - ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, WxRefundOrder record, WxPayOrder payOrder, EnumPayWay payWay); + ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, Long couponOrderId, EnumRefundWay refundWay, Long bUserId); /** * 退款订单查询 diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxCouponOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxCouponOrderServiceImpl.java index 59ad3d7f0..fc7db503a 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxCouponOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxCouponOrderServiceImpl.java @@ -12,6 +12,7 @@ import com.simple.domain.vo.CUserDateAmountVo; import com.simple.domain.vo.WxCouponOrderBVo; import com.simple.domain.vo.WxCouponOrderCVo; import com.simple.enums.EnumCouponOrderStatus; +import com.simple.enums.EnumRefundStatus; import com.simple.exception.MallinkException; import com.simple.mapper.*; import com.simple.service.WxCouponOrderService; @@ -57,8 +58,6 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); } - - @Override public WxCouponOrder getById(Long id) { return wxCouponOrderMapper.selectByPrimaryKey(id); @@ -320,66 +319,8 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); } return new ResultData(wxCouponOrder); - - - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) - public ResultData refund(Long couponOrderId, Long bUserId) { - - WxCouponOrder wxCouponOrder = wxCouponOrderMapper.selectByPrimaryKey(couponOrderId); - if(wxCouponOrder == null){ - logger.error("券ID不存在:"+ couponOrderId); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); - } - - WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(wxCouponOrder.getOrderId()); - - if(bUserId != wxCouponOrder.getCUserId()) { - // TODO web管理端退款 - // B端用户退款 - WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectByPrimaryKey(bUserId.longValue()); - if (wxMerchantBUser == null) { - logger.error("操作员ID不存在:" + bUserId); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); - } - if (!wxOrder.getMerchantId().equals(wxMerchantBUser.getMerchantId())) { - logger.error("券: couponMerchantId-" + wxOrder.getMerchantId() + "核销: couponMerchantId-" + wxMerchantBUser.getMerchantId()); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); - } - } else { - logger.info("自己发起退款, userId: " + bUserId); - } - - if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode())) { - logger.error("已过期: couponOrder-" + couponOrderId); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); - } - if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode())) { - logger.error("已退款: couponOrder-" + couponOrderId); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); - } - if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode())) { - logger.error("已经核销过的券: couponOrder-" + couponOrderId); - throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); - } - try { - wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()); //3退款,券作废 - wxCouponOrder.setBUserId(bUserId); - wxCouponOrder.setUpdateDate(new Date()); - wxCouponOrderMapper.updateByPrimaryKeySelective(wxCouponOrder); - } catch (Exception e) { - logger.error("db failed: couponOrder-" + couponOrderId + ", e:" + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); - } - // 库存回复+1 - wxOrderService.stockBack(wxOrder); - return new ResultData(wxCouponOrder); } - - @Override public List queryPriceTotalGroup(String tenantId, Date startTime, Date endTime) { diff --git a/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java b/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java index 5837d10bd..e7f5ad38e 100644 --- a/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java +++ b/mallinkService/src/main/java/com/simple/service/impl/WxRefundOrderServiceImpl.java @@ -10,9 +10,7 @@ import com.simple.common.ErrorCode; import com.simple.common.Result; import com.simple.common.ResultData; import com.simple.domain.po.*; -import com.simple.enums.EnumOrderStatus; -import com.simple.enums.EnumPayWay; -import com.simple.enums.EnumRefundStatus; +import com.simple.enums.*; import com.simple.exception.MallinkException; import com.simple.mapper.*; import com.simple.pay.WxPay; @@ -53,6 +51,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { @Autowired WxOrderService wxOrderService; + @Autowired + WxCouponOrderMapper wxCouponOrderMapper; + + @Autowired + WxMerchantBUserMapper wxMerchantBUserMapper; + JSONObject errorRefundReqMap = JSON.parseObject("{\n" + " \"SYSTEMERROR\": {\n" + " \"detail\": \"接口返回错误\",\n" + @@ -210,28 +214,105 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { "}"); @Override - public ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, WxRefundOrder record, WxPayOrder payOrder, EnumPayWay payWay) { - WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); - if (StringUtils.isBlank(payAccount.getApiKey())) { - logger.error("支付密钥为空"); - throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(), "支付密钥为空,请联系商城管理员"); + @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) + public ResultData createRefundOrder(boolean isReal, WxAppinfo appInfo, Long couponOrderId, EnumRefundWay refundWay, Long bUserId) { + WxCouponOrder wxCouponOrder = wxCouponOrderMapper.selectByPrimaryKey(couponOrderId); + if(wxCouponOrder == null){ + logger.error("券ID不存在:"+ couponOrderId); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_NULL); } - if (StringUtils.isBlank(payAccount.getCertPath())) { - logger.error("证书路径为空"); - throw new MallinkException(ErrorCode.CERT_PATH_NOT_FOUND.getCode(), "证书路径为空,请联系商城管理员"); + + WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(wxCouponOrder.getOrderId()); + + if (refundWay == EnumRefundWay.B) { + logger.info("B端发起退款: bUserId-" + bUserId); + if (bUserId == null || bUserId ==0 ) { + logger.error("B端用户不存在:"+ bUserId); + throw new MallinkException(ErrorCode.USER_IS_EMPTY); + } + // B端用户退款检查一下商户 + WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectByPrimaryKey(bUserId); + if (wxMerchantBUser == null) { + logger.error("操作员ID不存在:" + bUserId); + throw new MallinkException(ErrorCode.COUPON_ORDER_BUSER_IS_NULL); + } + if (!wxOrder.getMerchantId().equals(wxMerchantBUser.getMerchantId())) { + logger.error("券: couponMerchantId-" + wxOrder.getMerchantId() + "核销: couponMerchantId-" + wxMerchantBUser.getMerchantId()); + throw new MallinkException(ErrorCode.COUPON_ORDER_BUSER_IS_NULL); + } + } else if (refundWay == EnumRefundWay.ADMIN) { + logger.info("ADMIN端发起退款: bUserId-" + bUserId); + } else if (refundWay == EnumRefundWay.AUTO) { + logger.info("auto端发起退款"); + } else { + logger.info("自己发起退款: cUserId-" + bUserId); } - // check 是否有退款订单 - List list = wxRefundOrderMapper.findList(record); + if (wxOrder.getPayment() <= 0) { + logger.error("订单支付金额小于等于0: " + wxOrder.toString()); + throw new MallinkException(ErrorCode.REFUND_PAY_ORDER_IS_ZERO); + } + + if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_OVER_TIME.getCode())) { + logger.error("已过期: couponOrder-" + couponOrderId); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); + } + if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode())) { + logger.error("已退款: couponOrder-" + couponOrderId); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_OVER_TIME); + } + if (wxCouponOrder.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USED.getCode())) { + logger.error("已经核销过的券: couponOrder-" + couponOrderId); + throw new MallinkException(ErrorCode.COUPON_ORDER_IS_USED); + } + // 更改 couponOrder 状态 + Date currentDate = new Date(); + wxCouponOrder.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_INVALID.getCode()); //3退款,券作废 + if (refundWay == EnumRefundWay.B) { + wxCouponOrder.setBUserId(bUserId); + } else if (refundWay == EnumRefundWay.AUTO) { + wxCouponOrder.setBUserId(0L); // 自动退款, 设置bUserId为0 + } else if (refundWay == EnumRefundWay.ADMIN) { + wxCouponOrder.setBUserId(1L); // ADMIN发起退款, 设置bUserId为1 + } else { + wxCouponOrder.setBUserId(2L); // 自己发起退款, 设置bUserId为2 + } + wxCouponOrder.setUpdateDate(currentDate); + try { + wxCouponOrderMapper.updateByPrimaryKeySelective(wxCouponOrder); + } catch (Exception e) { + logger.error("db failed: couponOrder-" + couponOrderId + ", e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); + } + // 库存回复+1 + wxOrderService.stockBack(wxOrder); + // 创建refundOrder + WxPayOrder payOrderQ = new WxPayOrder(); + payOrderQ.setTenantId(appInfo.getTenantId()); + payOrderQ.setCUserId(wxOrder.getCUserId()); + payOrderQ.setOrderId(wxOrder.getId()); + payOrderQ.setPayOrderStatus(EnumPayStatus.PAY_WAY_SUCCESS.getCode()); + + WxPayOrder payOrder = null; + List list = wxPayOrderMapper.findList(payOrderQ); if (list.size() > 0) { - logger.error("退款订单已存在, 无法再提交退款申请"); - throw new MallinkException(ErrorCode.REFUND_ORDER_EXIST.getCode(), "退款订单已存在, 无法再提交退款申请"); + if (list.size() > 1) { + logger.error("TODO: payOrder成功记录应该只有一条????!!!"); + } + logger.warn(""); + payOrder = list.get(0); + } + if (payOrder == null) { + logger.error("支付订单不存在(payOrder不存在)"); + return new ResultData(ErrorCode.PAY_ORDER_NOT_FOUND); } + WxRefundOrder record = new WxRefundOrder(); + record.setPayOrderNo(String.valueOf(payOrder.getId())); + record.setOrderId(wxOrder.getId()); // 创建退款订单 final IdWorker idWorker = IdWorker.get(); Long id = idWorker.nextId(); String out_refund_id = String.valueOf(id); - Date currentDate = new Date(); record.setId(id); record.setTenantId(appInfo.getTenantId()); @@ -255,8 +336,23 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { logger.error("退款订单数据库插入出错: " + record.toString()); throw new MallinkException(ErrorCode.DB_FAIL); } + WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); + if (StringUtils.isBlank(payAccount.getApiKey())) { + logger.error("支付密钥为空"); + throw new MallinkException(ErrorCode.API_KEY_NOT_FOUND.getCode(), "支付密钥为空,请联系商城管理员"); + } + if (StringUtils.isBlank(payAccount.getCertPath())) { + logger.error("证书路径为空"); + throw new MallinkException(ErrorCode.CERT_PATH_NOT_FOUND.getCode(), "证书路径为空,请联系商城管理员"); + } + // check 是否有退款订单 + List refundList = wxRefundOrderMapper.findList(record); + if (refundList.size() > 0) { + logger.error("退款订单已存在, 无法再提交退款申请"); + throw new MallinkException(ErrorCode.REFUND_ORDER_EXIST.getCode(), "退款订单已存在, 无法再提交退款申请"); + } - // 退款申请 + // 向微信提交退款申请 String noncestr = Utility.generate32UUID(); WxRefundOrderP wxRefundOrderP = new WxRefundOrderP(); wxRefundOrderP.setAppid(appInfo.getAppId()); @@ -268,11 +364,17 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { wxRefundOrderP.setOut_refund_no(out_refund_id); wxRefundOrderP.setTotal_fee(record.getTotalFee()); wxRefundOrderP.setRefund_fee(record.getRefundFee()); - wxRefundOrderP.setRefund_desc("B端商户退款"); + if (refundWay == EnumRefundWay.B) { + wxRefundOrderP.setRefund_desc("B端商户退款"); + } else if (refundWay == EnumRefundWay.ADMIN) { + wxRefundOrderP.setRefund_desc("管理端商户退款"); + } else { + wxRefundOrderP.setRefund_desc("用户自己退款"); + } wxRefundOrderP.setNotify_url(payAccount.getNotifyUrl() + "/refund"); if (isReal) { - Map signMap = new HashMap(); + Map signMap = null; try { signMap = BeanUtils.toStringMap(wxRefundOrderP); } catch (Exception e) {