From f021540afe09a1b9bfeb9cefeb030e6ccf09375d Mon Sep 17 00:00:00 2001 From: zhibing.pu <393733352@qq.com> Date: 星期三, 28 八月 2024 16:07:28 +0800 Subject: [PATCH] 完善支付相关功能 --- ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java | 35 +++++ ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java | 138 +++++++++++++++++++++- ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java | 7 + ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java | 6 + ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java | 4 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java | 12 ++ ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java | 12 ++ ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java | 10 + ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java | 5 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java | 17 ++ ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java | 8 + ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java | 5 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java | 14 ++ ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java | 22 ++- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java | 2 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java | 10 + 16 files changed, 287 insertions(+), 20 deletions(-) diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java index f3aa48a..708996e 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrderRefund.java @@ -29,6 +29,14 @@ @ApiModelProperty(value = "主键") @TableField("id") private Long id; + + @ApiModelProperty(value = "支付时间") + @TableField("pay_time") + private LocalDateTime payTime; + + @ApiModelProperty(value = "支付流水号") + @TableField("pay_code") + private String payCode; @ApiModelProperty(value = "累计退款金额") @TableField("pay_amount") diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java index 4937da4..ba006ed 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponFallbackFactory.java @@ -35,6 +35,11 @@ public R<List<Integer>> getCouponIdsByName(String name) { return R.fail("根据名称查询优惠券ids:" + throwable.getMessage()); } + + @Override + public R updateCoupon(TCoupon coupon) { + throw new RuntimeException("修改优惠券失败"); + } }; } diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java index 2ee7b91..e9002f4 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsFallbackFactory.java @@ -33,6 +33,11 @@ public R<List<Integer>> getGoodsIdsByName(String name) { return R.fail("根据商品名称获取商品ids失败:" + throwable.getMessage()); } + + @Override + public R updateGoods(TGoods goods) { + throw new RuntimeException("修改商品异常"); + } }; } diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java index 64f7fdb..946dc50 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponClient.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -28,4 +29,13 @@ R<TCoupon> getCouponById1(@PathVariable("id") Integer id); @PostMapping("/t-coupon/getCouponIdsByName/{name}") R<List<Integer>> getCouponIdsByName(@PathVariable("name")String name); + + + /** + * 修改优惠券 + * @param coupon + * @return + */ + @PostMapping("/t-coupon/updateCoupon") + R updateCoupon(@RequestBody TCoupon coupon); } diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java index 6f918aa..7f7e94a 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -32,4 +33,13 @@ */ @PostMapping("/t-goods/getGoodsIdsByName/{name}") public R<List<Integer>> getGoodsIdsByName(@PathVariable("name")String name); + + + /** + * 修改商品 + * @param goods + * @return + */ + @PostMapping("/t-goods/updateGoods") + R updateGoods(@RequestBody TGoods goods); } diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java index ee40d32..6ed2018 100644 --- a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/factory/WxPaymentFallbackFactory.java @@ -5,6 +5,7 @@ import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; import com.ruoyi.payment.api.vo.PaymentOrder; +import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -58,6 +59,11 @@ return R.fail("微信退款失败:" + throwable.getMessage()); } + + @Override + public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) { + return R.fail("微信退款回调失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java index a09b432..90cb9c9 100644 --- a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/feignClient/WxPaymentClient.java @@ -6,6 +6,7 @@ import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; import com.ruoyi.payment.api.vo.PaymentOrder; +import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -65,4 +66,10 @@ @ApiOperation("订单退款") @PostMapping(value = "/wx/refundOrderR") public R<String> refundOrderR(@RequestBody WxPaymentRefundModel model); + + + + @ApiOperation("订单退款回调") + @PostMapping(value = "/wx/refund/notify") + R<WxRefundNotifyResp> refundNotify(HttpServletRequest request); } diff --git a/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java new file mode 100644 index 0000000..320cc40 --- /dev/null +++ b/ruoyi-api/ruoyi-api-payment/src/main/java/com/ruoyi/payment/api/vo/WxRefundNotifyResp.java @@ -0,0 +1,35 @@ +package com.ruoyi.payment.api.vo; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/8/28 14:54 + */ +@Data +public class WxRefundNotifyResp { + /** + * 支付单号 + */ + private String out_trade_no; + /** + * 退款单号 + */ + private String out_refund_no; + /** + * 支付流水号 + */ + private String transaction_id; + /** + * 退款流水号 + */ + private String refund_id; + /** + * 退款状态 + */ + private String tradeState; + /** + * 退款时间 + */ + private String success_time; +} diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java index c843b31..4edd63f 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java @@ -24,6 +24,7 @@ import com.ruoyi.payment.api.model.RefundReq; import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; +import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.swagger.annotations.Api; @@ -33,6 +34,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -228,6 +230,21 @@ return shoppingOrderService.cancelOrder(id); } + /** + * 商城订单取消微信退款回调 + */ + @PostMapping("/cancelShoppingOrderWxRefund") + public void cancelShoppingOrderWxRefund(HttpServletRequest request){ + WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData(); + if(null != data){ + String out_refund_no = data.getOut_refund_no(); + String refund_id = data.getRefund_id(); + String tradeState = data.getTradeState(); + String success_time = data.getSuccess_time(); + shoppingOrderService.cancelShoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time); + } + } + @ResponseBody diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java index 307d58f..382c3ff 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderInfo.java @@ -39,6 +39,8 @@ private String code; @ApiModelProperty("下单时间") private String createTime; + @ApiModelProperty("订单金额") + private BigDecimal orderAmount; @ApiModelProperty("支付金额") private BigDecimal paymentAmount; @ApiModelProperty("备注") diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java index 6cc1346..a16ec05 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/MyShoppingOrderList.java @@ -19,6 +19,8 @@ private String imgUrl; @ApiModelProperty("商品名称") private String name; + @ApiModelProperty("商品类型(1=商品,2=优惠券)") + private Integer orderType; @ApiModelProperty("状态(1=待发货,2=待收货,3=已完成,4=已取消)") private Integer status; @ApiModelProperty("单价") @@ -27,4 +29,6 @@ private Integer number; @ApiModelProperty("支付金额") private BigDecimal paymentAmount; + @ApiModelProperty("订单时间") + private String createTime; } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java index a103b1d..ae5925d 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java @@ -55,6 +55,18 @@ /** + * 商城订单取消订单微信退款处理 + * @param out_refund_no 退款单号 + * @param refund_id 退款流水号 + * @param refund_status 退款状态 SUCCESS:退款成功 CLOSED:退款关闭 ABNORMAL:退款异常 + * @param success_time 退款成功时间 + * @return + */ + AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time); + + + + /** * 获取未开票的订单列表 * @param query * @return diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java index af1d4e3..30fb46a 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java @@ -7,11 +7,13 @@ import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserAddressClient; import com.ruoyi.account.api.model.TAppUserAddress; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.model.TExchangeOrder; import com.ruoyi.order.api.model.TShoppingOrder; +import com.ruoyi.order.api.model.TShoppingOrderRefund; import com.ruoyi.order.api.query.ShoppingOrderQuery; import com.ruoyi.order.api.query.TActivityStatisticsQuery; import com.ruoyi.order.api.vo.ChargingOrderVO; @@ -19,6 +21,7 @@ import com.ruoyi.order.api.vo.TActivityVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TShoppingOrderMapper; +import com.ruoyi.order.service.TShoppingOrderRefundService; import com.ruoyi.order.service.TShoppingOrderService; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; @@ -26,17 +29,25 @@ import com.ruoyi.other.api.feignClient.GoodsClient; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; +import com.ruoyi.payment.api.model.RefundReq; +import com.ruoyi.payment.api.model.RefundResp; +import com.ruoyi.payment.api.model.WxPaymentRefundModel; +import com.ruoyi.payment.api.vo.AliQueryOrder; import com.ruoyi.payment.api.vo.NotifyV3PayDecodeRespBody; +import io.seata.spring.annotation.GlobalTransactional; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; +import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * <p> @@ -68,6 +79,9 @@ @Resource private AliPaymentClient aliPaymentClient; + + @Resource + private TShoppingOrderRefundService shoppingOrderRefundService; @@ -206,6 +220,7 @@ myShoppingOrderList.setUnitPrice(unitPrice); myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity()); myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount()); + myShoppingOrderList.setOrderType(tShoppingOrder.getOrderType()); pageList.add(myShoppingOrderList); } return pageList; @@ -250,6 +265,7 @@ info.setUnitPrice(unitPrice); info.setCode(shoppingOrder.getCode()); info.setCreateTime(shoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + info.setOrderAmount(shoppingOrder.getOrderAmount()); info.setPaymentAmount(shoppingOrder.getPaymentAmount()); info.setRemark(shoppingOrder.getRemark()); info.setDeliveryTime(shoppingOrder.getConsignerTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); @@ -272,11 +288,18 @@ if(shoppingOrder.getStatus() == 3){ return AjaxResult.error("订单已完成,不能取消"); } - if(shoppingOrder.getStatus() == 4){ + //退款状态并且所有金额退完 + List<TShoppingOrderRefund> list = shoppingOrderRefundService.list(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getShoppingOrderId, id).eq(TShoppingOrderRefund::getRefundStatus, 2)); + BigDecimal bigDecimal = list.stream().map(TShoppingOrderRefund::getRefundAmount).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(2, RoundingMode.HALF_EVEN); + if(shoppingOrder.getPaymentAmount().compareTo(bigDecimal) == 0 && shoppingOrder.getStatus() == 4){ return AjaxResult.error("订单已取消,不能重复操作"); } + + //退款金额 + BigDecimal refundAmount = shoppingOrder.getPaymentAmount().subtract(bigDecimal); + //先查询第三方订单状态订单是否退款 - //支付方式(1=微信,2=支付宝) todo 待完善 + //支付方式(1=微信,2=支付宝) Integer paymentType = shoppingOrder.getPaymentType(); if(1 == paymentType){ NotifyV3PayDecodeRespBody data = wxPaymentClient.queryOrderInfo(shoppingOrder.getCode()).getData(); @@ -290,20 +313,118 @@ if("USERPAYING".equals(trade_state)){ return AjaxResult.error("订单正在支付中,不能操作退款"); } - if("REFUND".equals(trade_state)){ - return AjaxResult.error("订单已退款,不能操作退款"); - } } if(2 == paymentType){ - + AliQueryOrder aliQueryOrder = aliPaymentClient.query(shoppingOrder.getCode()).getData(); + String tradeStatus = aliQueryOrder.getTradeStatus(); + if("TRADE_CLOSED".equals(tradeStatus)){ + return AjaxResult.error("订单还未支付,不能操作退款"); + } + if("TRADE_FINISHED".equals(tradeStatus)){ + return AjaxResult.error("订单支付已关闭,不能操作退款"); + } + if("WAIT_BUYER_PAY".equals(tradeStatus)){ + return AjaxResult.error("订单正在支付中,不能操作退款"); + } } //退款成功后需要判断商品库存类型后决定是否需要回退库存 //加redis锁处理高并发 - - + //构建退款明细 + TShoppingOrderRefund shoppingOrderRefund = new TShoppingOrderRefund(); + shoppingOrderRefund.setPayTime(shoppingOrder.getPayTime()); + shoppingOrderRefund.setPayCode(shoppingOrder.getSerialNumber()); + shoppingOrderRefund.setPayType(shoppingOrder.getPaymentType()); + shoppingOrderRefund.setShoppingOrderId(shoppingOrder.getId()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + shoppingOrderRefund.setRefundCode("GDF" + sdf.format(new Date()) + (Math.random() * 1000)); + shoppingOrderRefund.setRefundAmount(refundAmount); + shoppingOrderRefund.setRefundStatus(1); + shoppingOrderRefund.setCode(shoppingOrder.getCode()); + shoppingOrderRefund.setRefundTitle("取消订单"); + shoppingOrderRefund.setRefundContent("取消订单"); + shoppingOrderRefund.setRefundReason("取消订单"); + shoppingOrderRefund.setRefundRemark("全额退款"); + shoppingOrderRefund.setRefundTotalAmount(refundAmount.add(bigDecimal)); + shoppingOrderRefund.setPayAmount(shoppingOrder.getPaymentAmount()); + if(1 == paymentType){ + WxPaymentRefundModel model = new WxPaymentRefundModel(); + model.setOut_trade_no(shoppingOrder.getCode()); + model.setOut_refund_no(shoppingOrderRefund.getRefundCode()); + model.setReason("取消订单"); + model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); + WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); + amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); + amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); + amount.setCurrency("CNY"); + model.setAmount(amount); + R<String> orderR = wxPaymentClient.refundOrderR(model); + if(200 == orderR.getCode()){ + shoppingOrderRefundService.save(shoppingOrderRefund); + } + } + if(2 == paymentType){ + RefundReq dto = new RefundReq(); + dto.setOutTradeNo(shoppingOrder.getCode()); + dto.setOutRequestNo(shoppingOrderRefund.getCode()); + dto.setRefundAmount(refundAmount.toString()); + dto.setRefundReason("取消订单"); + RefundResp resp = aliPaymentClient.refund(dto).getData(); + if(null != resp){ + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); + AjaxResult success = cancelShoppingOrderWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date())); + if(success.isSuccess()){ + shoppingOrderRefundService.save(shoppingOrderRefund); + } + } + } return AjaxResult.success(); } + + /** + * 商城订单取消订单微信退款处理 + * @param out_refund_no 退款单号 + * @param refund_id 退款流水号 + * @param refund_status 退款状态 SUCCESS:退款成功 CLOSED:退款关闭 ABNORMAL:退款异常 + * @param success_time 退款成功时间 + * @return + */ + @Override + @GlobalTransactional(rollbackFor = Exception.class)//分布式事务 + public AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time) { + if("SUCCESS".equals(refund_status)){ + TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no)); + one.setRefundSerialNumber(refund_id); + one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE"))); + shoppingOrderRefundService.updateById(one); + //判断是否需要回退库存 + TShoppingOrder shoppingOrder = this.getById(one.getShoppingOrderId()); + //商品 + if(shoppingOrder.getOrderType() == 1){ + // todo 需完善redis锁 + //redis锁 和支付使用同一个锁 + TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData(); + Integer inventory = goods.getInventory(); + if(-1 != inventory){ + goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity()); + goodsClient.updateGoods(goods); + } + //解锁 + } + //优惠券 + if(shoppingOrder.getOrderType() == 2){ + //redis锁 + TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData(); + Integer inventory = coupon.getInventoryQuantity(); + if(-1 != inventory){ + coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity()); + couponClient.updateCoupon(coupon); + } + //解锁 + } + } + return AjaxResult.success(); + } /** * 获取未开票的订单列表 @@ -336,6 +457,7 @@ myShoppingOrderList.setUnitPrice(unitPrice); myShoppingOrderList.setNumber(tShoppingOrder.getPurchaseQuantity()); myShoppingOrderList.setPaymentAmount(tShoppingOrder.getPaymentAmount()); + myShoppingOrderList.setCreateTime(tShoppingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"))); pageList.add(myShoppingOrderList); } return pageList; diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java index 34d1ff5..a2eefca 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java @@ -202,7 +202,17 @@ TCoupon coupon = tCouponService.getById(id); return R.ok(coupon); } - - + + + /** + * 修改优惠券 + * @param coupon + * @return + */ + @PostMapping(value = "/updateCoupon") + public R updateCoupon(@RequestBody TCoupon coupon){ + tCouponService.updateById(coupon); + return R.ok(); + } } diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java index 6021c3a..40fb7c6 100644 --- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java +++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java @@ -317,5 +317,17 @@ TGoods goods = goodsService.getById(id); return R.ok(goods); } + + + /** + * 修改商品 + * @param goods + * @return + */ + @PostMapping("/updateGoods") + public R updateGoods(@RequestBody TGoods goods){ + goodsService.updateById(goods); + return R.ok(); + } } diff --git a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java index 81ea044..a937505 100644 --- a/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java +++ b/ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java @@ -4,6 +4,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.payment.api.vo.PaymentOrder; +import com.ruoyi.payment.api.vo.WxRefundNotifyResp; import com.ruoyi.payment.wx.enums.RefundEnum; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.wx.resp.NotifyV3PayDecodeRespBody; @@ -149,12 +150,12 @@ * 退款回调 */ @PostMapping("refund/notify") - public void refundNotify(HttpServletRequest request) throws IOException { + public R<WxRefundNotifyResp> refundNotify(HttpServletRequest request) throws IOException { try { Map<String, Object> params = wxV3Pay.verifyNotify(request, new TypeReference<Map<String, Object>>() { }); // 商户订单号 - String tradeNo = params.get("out_trade_no").toString(); + String out_trade_no = params.get("out_trade_no").toString(); // 商户退款单号 String out_refund_no = params.get("out_refund_no").toString(); // 微信支付订单号 @@ -167,21 +168,22 @@ // 时间不对的话,可以调用 WxTimeUtils.toRfc3339Date(success_time)转换一下 String success_time = params.get("success_time").toString(); if (tradeState.equals(RefundEnum.SUCCESS.name())) { - String substring = out_refund_no.substring(0, 2); - switch (substring){ - case "GW": - break; - - } - // TODO 退款成功处理 + WxRefundNotifyResp resp = new WxRefundNotifyResp(); + resp.setOut_trade_no(out_trade_no); + resp.setOut_refund_no(out_refund_no); + resp.setTradeState(tradeState); + resp.setTransaction_id(transaction_id); + resp.setRefund_id(refund_id); + resp.setSuccess_time(success_time); wxV3Pay.ack(); + return R.ok(resp); } else { wxV3Pay.ack(false, "不是成功的退款状态"); } } catch (Exception e) { wxV3Pay.ack(false, e.getMessage()); } - + return R.fail(); } /** -- Gitblit v1.7.1