| @@ -130,35 +130,6 @@ public class WxCouponOrderController extends BaseController { | |||||
| } | } | ||||
| } | } | ||||
| @ApiOperation(value = "退券接口", notes = "{\"couponOrderId\":\"string\"}") | |||||
| @PostMapping("refund") | |||||
| public ResultData refund(@RequestBody Map<String, String> 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\"}") | @ApiOperation(value = "根据couponOrderId查询接口", notes = "{\"couponOrderId\":\"string\"}") | ||||
| @PostMapping("/findById") | @PostMapping("/findById") | ||||
| public ResultData findById(@RequestBody Map<String, String> paramMap) { | public ResultData findById(@RequestBody Map<String, String> paramMap) { | ||||
| @@ -8,6 +8,7 @@ import com.simple.config.PayProperty; | |||||
| import com.simple.domain.po.*; | import com.simple.domain.po.*; | ||||
| import com.simple.enums.EnumPayStatus; | import com.simple.enums.EnumPayStatus; | ||||
| import com.simple.enums.EnumPayWay; | import com.simple.enums.EnumPayWay; | ||||
| import com.simple.enums.EnumRefundWay; | |||||
| import com.simple.exception.MallinkException; | import com.simple.exception.MallinkException; | ||||
| import com.simple.service.*; | import com.simple.service.*; | ||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| @@ -42,68 +43,29 @@ public class WxRefundOrderController extends BaseController { | |||||
| @Autowired | @Autowired | ||||
| private WxRefundOrderService wxRefundOrderService; | private WxRefundOrderService wxRefundOrderService; | ||||
| @ApiOperation(value = "发起退款", notes = "{\"orderId\":\"string\"}") | |||||
| @ApiOperation(value = "退券退款", notes = "{\"couponOrderId\":\"string\"}") | |||||
| @PostMapping("/create") | @PostMapping("/create") | ||||
| public ResultData create(@RequestBody Map<String, String> paramMap) { | public ResultData create(@RequestBody Map<String, String> paramMap) { | ||||
| // couponOrder发起退款 | |||||
| logger.info("/api/refund/create" + paramMap.toString()); | |||||
| //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); | //Assert.notNull(wxRefundOrder.getName(), "角色名不能为空"); | ||||
| //Assert.isTrue(!checkUnique(sysRole.getName(), null), "重复的角色名"); | //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); | return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | ||||
| } | } | ||||
| Long orderId = 0L; | |||||
| Long couponOrderId = 0L; | |||||
| try { | try { | ||||
| orderId = Long.valueOf(orderIdStr); | |||||
| couponOrderId = Long.valueOf(couponOrderIdStr); | |||||
| } catch (NumberFormatException e) { | } catch (NumberFormatException e) { | ||||
| logger.error("orderId参数不正确: " + paramMap.toString()); | |||||
| logger.error("couponOrderId参数不正确: " + paramMap.toString()); | |||||
| return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); | 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(); | WxMerchantBUser bUser = getUser(); | ||||
| WxAppinfo appinfo = getAppInfo(bUser.getAppId()); | WxAppinfo appinfo = getAppInfo(bUser.getAppId()); | ||||
| try { | 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(); | return new ResultData(); | ||||
| } catch (MallinkException e) { | } catch (MallinkException e) { | ||||
| logger.error(e.getMessage()); | logger.error(e.getMessage()); | ||||
| @@ -31,34 +31,6 @@ public class WxCouponOrderController extends BaseController { | |||||
| @Autowired | @Autowired | ||||
| private WxCouponOrderService wxCouponOrderService; | private WxCouponOrderService wxCouponOrderService; | ||||
| @ApiOperation(value = "退券接口", notes = "{\"couponOrderId\":\"string\"}") | |||||
| @PostMapping("refund") | |||||
| public ResultData refund(@RequestBody Map<String, String> 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("券包分页列表接口") | @ApiOperation("券包分页列表接口") | ||||
| @GetMapping("list") | @GetMapping("list") | ||||
| @ApiImplicitParams({ | @ApiImplicitParams({ | ||||
| @@ -113,6 +113,7 @@ public enum ErrorCode{ | |||||
| COUPON_ORDER_IS_USED(4001, "卡券已核销"), | COUPON_ORDER_IS_USED(4001, "卡券已核销"), | ||||
| COUPON_ORDER_IS_OVER_TIME(4002, "卡券已过期"), | COUPON_ORDER_IS_OVER_TIME(4002, "卡券已过期"), | ||||
| COUPON_ORDER_IS_INVALID(4003, "卡券已经作废"), | COUPON_ORDER_IS_INVALID(4003, "卡券已经作废"), | ||||
| COUPON_ORDER_BUSER_IS_NULL(4004, "卡券B端用户不存在"), | |||||
| /** | /** | ||||
| @@ -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; | |||||
| } | |||||
| } | |||||
| @@ -62,15 +62,6 @@ public interface WxCouponOrderService { | |||||
| */ | */ | ||||
| ResultData verify(Long couponOrderId, Long bUserId); | ResultData verify(Long couponOrderId, Long bUserId); | ||||
| /** | |||||
| * 根据主键couponOrderId(券码)退券(款) | |||||
| * | |||||
| * @param couponOrderId | |||||
| * @param bUserId 退券(款)人(登录用户) | |||||
| */ | |||||
| ResultData refund(Long couponOrderId, Long bUserId); | |||||
| /** | /** | ||||
| * 根据日期 b用户查券list | * 根据日期 b用户查券list | ||||
| * | * | ||||
| @@ -7,6 +7,7 @@ import com.simple.domain.po.WxAppinfo; | |||||
| import com.simple.domain.po.WxPayOrder; | import com.simple.domain.po.WxPayOrder; | ||||
| import com.simple.domain.po.WxRefundOrder; | import com.simple.domain.po.WxRefundOrder; | ||||
| import com.simple.enums.EnumPayWay; | import com.simple.enums.EnumPayWay; | ||||
| import com.simple.enums.EnumRefundWay; | |||||
| public interface WxRefundOrderService { | public interface WxRefundOrderService { | ||||
| @@ -14,12 +15,12 @@ public interface WxRefundOrderService { | |||||
| * 创建退款订单 | * 创建退款订单 | ||||
| * @param isReal | * @param isReal | ||||
| * @param appInfo | * @param appInfo | ||||
| * @param record 退款订单请求 | |||||
| * @param payOrder 支付订单 | |||||
| * @param payWay | |||||
| * @param couponOrderId 券包Id | |||||
| * @param refundWay 退款来源 | |||||
| * @param bUserId b端退款Id,auto,admin,self可为null | |||||
| * @return | * @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); | |||||
| /** | /** | ||||
| * 退款订单查询 | * 退款订单查询 | ||||
| @@ -12,6 +12,7 @@ import com.simple.domain.vo.CUserDateAmountVo; | |||||
| import com.simple.domain.vo.WxCouponOrderBVo; | import com.simple.domain.vo.WxCouponOrderBVo; | ||||
| import com.simple.domain.vo.WxCouponOrderCVo; | import com.simple.domain.vo.WxCouponOrderCVo; | ||||
| import com.simple.enums.EnumCouponOrderStatus; | import com.simple.enums.EnumCouponOrderStatus; | ||||
| import com.simple.enums.EnumRefundStatus; | |||||
| import com.simple.exception.MallinkException; | import com.simple.exception.MallinkException; | ||||
| import com.simple.mapper.*; | import com.simple.mapper.*; | ||||
| import com.simple.service.WxCouponOrderService; | import com.simple.service.WxCouponOrderService; | ||||
| @@ -57,8 +58,6 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService { | |||||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); | return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findList(record)); | ||||
| } | } | ||||
| @Override | @Override | ||||
| public WxCouponOrder getById(Long id) { | public WxCouponOrder getById(Long id) { | ||||
| return wxCouponOrderMapper.selectByPrimaryKey(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()); | throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); | ||||
| } | } | ||||
| return new ResultData(wxCouponOrder); | 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 | @Override | ||||
| public List<CUserDateAmountVo> queryPriceTotalGroup(String tenantId, Date startTime, Date endTime) { | public List<CUserDateAmountVo> queryPriceTotalGroup(String tenantId, Date startTime, Date endTime) { | ||||
| @@ -10,9 +10,7 @@ import com.simple.common.ErrorCode; | |||||
| import com.simple.common.Result; | import com.simple.common.Result; | ||||
| import com.simple.common.ResultData; | import com.simple.common.ResultData; | ||||
| import com.simple.domain.po.*; | 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.exception.MallinkException; | ||||
| import com.simple.mapper.*; | import com.simple.mapper.*; | ||||
| import com.simple.pay.WxPay; | import com.simple.pay.WxPay; | ||||
| @@ -53,6 +51,12 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||||
| @Autowired | @Autowired | ||||
| WxOrderService wxOrderService; | WxOrderService wxOrderService; | ||||
| @Autowired | |||||
| WxCouponOrderMapper wxCouponOrderMapper; | |||||
| @Autowired | |||||
| WxMerchantBUserMapper wxMerchantBUserMapper; | |||||
| JSONObject errorRefundReqMap = JSON.parseObject("{\n" + | JSONObject errorRefundReqMap = JSON.parseObject("{\n" + | ||||
| " \"SYSTEMERROR\": {\n" + | " \"SYSTEMERROR\": {\n" + | ||||
| " \"detail\": \"接口返回错误\",\n" + | " \"detail\": \"接口返回错误\",\n" + | ||||
| @@ -210,28 +214,105 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||||
| "}"); | "}"); | ||||
| @Override | @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<WxRefundOrder> 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<WxPayOrder> list = wxPayOrderMapper.findList(payOrderQ); | |||||
| if (list.size() > 0) { | 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(); | final IdWorker idWorker = IdWorker.get(); | ||||
| Long id = idWorker.nextId(); | Long id = idWorker.nextId(); | ||||
| String out_refund_id = String.valueOf(id); | String out_refund_id = String.valueOf(id); | ||||
| Date currentDate = new Date(); | |||||
| record.setId(id); | record.setId(id); | ||||
| record.setTenantId(appInfo.getTenantId()); | record.setTenantId(appInfo.getTenantId()); | ||||
| @@ -255,8 +336,23 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||||
| logger.error("退款订单数据库插入出错: " + record.toString()); | logger.error("退款订单数据库插入出错: " + record.toString()); | ||||
| throw new MallinkException(ErrorCode.DB_FAIL); | 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<WxRefundOrder> refundList = wxRefundOrderMapper.findList(record); | |||||
| if (refundList.size() > 0) { | |||||
| logger.error("退款订单已存在, 无法再提交退款申请"); | |||||
| throw new MallinkException(ErrorCode.REFUND_ORDER_EXIST.getCode(), "退款订单已存在, 无法再提交退款申请"); | |||||
| } | |||||
| // 退款申请 | |||||
| // 向微信提交退款申请 | |||||
| String noncestr = Utility.generate32UUID(); | String noncestr = Utility.generate32UUID(); | ||||
| WxRefundOrderP wxRefundOrderP = new WxRefundOrderP(); | WxRefundOrderP wxRefundOrderP = new WxRefundOrderP(); | ||||
| wxRefundOrderP.setAppid(appInfo.getAppId()); | wxRefundOrderP.setAppid(appInfo.getAppId()); | ||||
| @@ -268,11 +364,17 @@ public class WxRefundOrderServiceImpl implements WxRefundOrderService { | |||||
| wxRefundOrderP.setOut_refund_no(out_refund_id); | wxRefundOrderP.setOut_refund_no(out_refund_id); | ||||
| wxRefundOrderP.setTotal_fee(record.getTotalFee()); | wxRefundOrderP.setTotal_fee(record.getTotalFee()); | ||||
| wxRefundOrderP.setRefund_fee(record.getRefundFee()); | 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"); | wxRefundOrderP.setNotify_url(payAccount.getNotifyUrl() + "/refund"); | ||||
| if (isReal) { | if (isReal) { | ||||
| Map signMap = new HashMap(); | |||||
| Map signMap = null; | |||||
| try { | try { | ||||
| signMap = BeanUtils.toStringMap(wxRefundOrderP); | signMap = BeanUtils.toStringMap(wxRefundOrderP); | ||||
| } catch (Exception e) { | } catch (Exception e) { | ||||