Commit ce0718b646f9588568f3e92d0d74787da998e353

Authored by fengliang
1 parent 39095a05

update:退款暂存

etrade-order/src/main/java/com/diligrp/etrade/order/api/OrderController.java
@@ -806,28 +806,4 @@ public class OrderController { @@ -806,28 +806,4 @@ public class OrderController {
806 return Message.failure("服务暂时不在线,请稍后"); 806 return Message.failure("服务暂时不在线,请稍后");
807 } 807 }
808 } 808 }
809 -  
810 -  
811 - /**  
812 - * 发起退款  
813 - * @param refundDto  
814 - * @return  
815 - */  
816 - @RequestMapping(value = "/refund",method = {RequestMethod.POST},produces="application/json;charset=UTF-8")  
817 - public Message<OrderDto> refund(@RequestBody OrderRefundDto refundDto){  
818 - try{  
819 - RLock lock = redissonClient.getLock(OrderConstant.OrderLock + refundDto.getCode());  
820 - try {  
821 - lock.lock();  
822 - orderService.refundByOrderCode(refundDto);  
823 - return Message.success();  
824 - }finally {  
825 - lock.unlock();  
826 - }  
827 -  
828 - }catch (PlatformServiceException pe) {  
829 - LOGGER.warn("服务异常{}:{}",pe.getCode(), pe.getMessage());  
830 - return Message.failure("服务暂时不在线,请稍后");  
831 - }  
832 - }  
833 } 809 }
etrade-order/src/main/java/com/diligrp/etrade/order/controller/OrderManagerController.java
1 package com.diligrp.etrade.order.controller; 1 package com.diligrp.etrade.order.controller;
2 2
  3 +import com.diligrp.etrade.core.authority.SessionContext;
  4 +import com.diligrp.etrade.core.authority.UserTicket;
  5 +import com.diligrp.etrade.core.domain.Message;
  6 +import com.diligrp.etrade.core.exception.PlatformServiceException;
  7 +import com.diligrp.etrade.order.domain.OrderRefundDto;
  8 +import com.diligrp.etrade.order.service.OrderRefundService;
  9 +import com.diligrp.etrade.order.util.OrderConstant;
  10 +import jakarta.annotation.Resource;
  11 +import org.redisson.api.RLock;
  12 +import org.redisson.api.RedissonClient;
  13 +import org.slf4j.Logger;
  14 +import org.slf4j.LoggerFactory;
  15 +import org.springframework.web.bind.annotation.RequestBody;
  16 +import org.springframework.web.bind.annotation.RequestMapping;
  17 +import org.springframework.web.bind.annotation.RequestMethod;
  18 +import org.springframework.web.bind.annotation.RestController;
  19 +
  20 +@RestController
  21 +@RequestMapping("/api/orderManager")
3 public class OrderManagerController { 22 public class OrderManagerController {
  23 + private static final Logger LOGGER = LoggerFactory.getLogger(OrderManagerController.class);
  24 +
  25 + @Resource
  26 + private RedissonClient redissonClient;
  27 + @Resource
  28 + private OrderRefundService orderRefundService;
  29 + /**
  30 + * 发起退款
  31 + * @param refundDto
  32 + * @return
  33 + */
  34 + @RequestMapping(value = "/refund",method = {RequestMethod.POST},produces="application/json;charset=UTF-8")
  35 + public Message refund(@RequestBody OrderRefundDto refundDto){
  36 + UserTicket userTicket = SessionContext.getUserTicket();
  37 + try{
  38 + RLock lock = redissonClient.getLock(OrderConstant.OrderLock + refundDto.getCode());
  39 + try {
  40 + lock.lock();
  41 + return orderRefundService.addRefund(refundDto,userTicket);
  42 + }finally {
  43 + lock.unlock();
  44 + }
  45 +
  46 + }catch (PlatformServiceException pe) {
  47 + LOGGER.warn("服务异常{}:{}",pe.getCode(), pe.getMessage());
  48 + return Message.failure("服务暂时不在线,请稍后");
  49 + }
  50 + }
  51 +
  52 + @RequestMapping(value = "/refundCheck",method = {RequestMethod.POST},produces="application/json;charset=UTF-8")
  53 + public Message refundCheck(@RequestBody OrderRefundDto refundDto){
  54 + try{
  55 + return orderRefundService.refundCheck();
  56 + }catch (PlatformServiceException pe) {
  57 + LOGGER.warn("服务异常{}:{}",pe.getCode(), pe.getMessage());
  58 + return Message.failure("服务暂时不在线,请稍后");
  59 + }
  60 + }
  61 +
  62 + @RequestMapping(value = "/refundCallBack",method = {RequestMethod.POST},produces="application/json;charset=UTF-8")
  63 + public Message refundCallBack(@RequestBody OrderRefundDto refundDto){
  64 + try{
  65 + return orderRefundService.refundCheck();
  66 + }catch (PlatformServiceException pe) {
  67 + LOGGER.warn("服务异常{}:{}",pe.getCode(), pe.getMessage());
  68 + return Message.failure("服务暂时不在线,请稍后");
  69 + }
  70 + }
4 } 71 }
etrade-order/src/main/java/com/diligrp/etrade/order/dao/OrderRefundMapper.java 0 → 100644
  1 +package com.diligrp.etrade.order.dao;
  2 +
  3 +import com.diligrp.etrade.core.mybatis.MybatisMapperSupport;
  4 +import com.diligrp.etrade.order.model.OrderRefund;
  5 +import org.apache.ibatis.annotations.Param;
  6 +import org.springframework.stereotype.Repository;
  7 +
  8 +import java.util.Map;
  9 +
  10 +@Repository("orderRefundMapper")
  11 +public interface OrderRefundMapper extends MybatisMapperSupport {
  12 + Map<String, Long> getRefundInfoBefore(@Param("orderId") Long orderId);
  13 +
  14 + Long insert(OrderRefund orderRefund);
  15 +
  16 + Integer update(OrderRefund orderRefund);
  17 +}
etrade-order/src/main/java/com/diligrp/etrade/order/model/Order.java
@@ -284,6 +284,12 @@ public class Order { @@ -284,6 +284,12 @@ public class Order {
284 /** 扣减库存状态(1未扣减,2已扣减) */ 284 /** 扣减库存状态(1未扣减,2已扣减) */
285 private Integer stockDeductionState; 285 private Integer stockDeductionState;
286 286
  287 + /**
  288 + * 退款总计
  289 + * @return
  290 + */
  291 + private Long totalRefundAmount;
  292 +
287 public Integer getAchieveType() { 293 public Integer getAchieveType() {
288 return achieveType; 294 return achieveType;
289 } 295 }
@@ -755,4 +761,12 @@ public class Order { @@ -755,4 +761,12 @@ public class Order {
755 public void setStockDeductionState(Integer stockDeductionState) { 761 public void setStockDeductionState(Integer stockDeductionState) {
756 this.stockDeductionState = stockDeductionState; 762 this.stockDeductionState = stockDeductionState;
757 } 763 }
  764 +
  765 + public Long getTotalRefundAmount() {
  766 + return totalRefundAmount;
  767 + }
  768 +
  769 + public void setTotalRefundAmount(Long totalRefundAmount) {
  770 + this.totalRefundAmount = totalRefundAmount;
  771 + }
758 } 772 }
759 \ No newline at end of file 773 \ No newline at end of file
etrade-order/src/main/java/com/diligrp/etrade/order/model/OrderRefund.java 0 → 100644
  1 +package com.diligrp.etrade.order.model;
  2 +
  3 +import java.time.LocalDateTime;
  4 +
  5 +/**
  6 + * 交易订单结算单
  7 + * @author fengliang
  8 + * @since 2023.08.25
  9 + */
  10 +public class OrderRefund {
  11 + private Long id;
  12 +
  13 + /**
  14 + * 实际退款单号
  15 + */
  16 + private String refundId;
  17 +
  18 + /**
  19 + * 市场主键
  20 + */
  21 + private Long marketId;
  22 +
  23 + /**
  24 + * 订单主键
  25 + */
  26 + private Long orderId;
  27 +
  28 + /**
  29 + * 订单编号
  30 + */
  31 + private String orderCode;
  32 +
  33 + /**
  34 + * 退款金额
  35 + */
  36 + private Long refundAmount;
  37 +
  38 + /**
  39 + * 退款说明
  40 + */
  41 + private String refundMessage;
  42 +
  43 + /**
  44 + * 退款单状态
  45 + */
  46 + private Integer state;
  47 +
  48 + /**
  49 + * paymentId微信交易单号
  50 + */
  51 + private String tradeId;
  52 +
  53 + /**
  54 + * 退款失败原因
  55 + */
  56 + private String notic;
  57 +
  58 + /**
  59 + * 交费单主键
  60 + */
  61 + private Long orderPaymentId;
  62 +
  63 + /**
  64 + * 版本号
  65 + */
  66 + private Integer version;
  67 +
  68 + /** 退款单创建时间 */
  69 + private LocalDateTime createdTime;
  70 +
  71 + /** 退款单更新时间 */
  72 + private LocalDateTime modifiedTime;
  73 +
  74 + /**
  75 + * 退款时间
  76 + */
  77 + private LocalDateTime refundTime;
  78 +
  79 + private Long createId;
  80 +
  81 + private String createName;
  82 +
  83 + public Long getId() {
  84 + return id;
  85 + }
  86 +
  87 + public void setId(Long id) {
  88 + this.id = id;
  89 + }
  90 +
  91 + public String getRefundId() {
  92 + return refundId;
  93 + }
  94 +
  95 + public void setRefundId(String refundId) {
  96 + this.refundId = refundId;
  97 + }
  98 +
  99 + public Long getMarketId() {
  100 + return marketId;
  101 + }
  102 +
  103 + public void setMarketId(Long marketId) {
  104 + this.marketId = marketId;
  105 + }
  106 +
  107 + public Long getOrderId() {
  108 + return orderId;
  109 + }
  110 +
  111 + public void setOrderId(Long orderId) {
  112 + this.orderId = orderId;
  113 + }
  114 +
  115 + public String getOrderCode() {
  116 + return orderCode;
  117 + }
  118 +
  119 + public void setOrderCode(String orderCode) {
  120 + this.orderCode = orderCode;
  121 + }
  122 +
  123 + public Long getRefundAmount() {
  124 + return refundAmount;
  125 + }
  126 +
  127 + public void setRefundAmount(Long refundAmount) {
  128 + this.refundAmount = refundAmount;
  129 + }
  130 +
  131 + public String getRefundMessage() {
  132 + return refundMessage;
  133 + }
  134 +
  135 + public void setRefundMessage(String refundMessage) {
  136 + this.refundMessage = refundMessage;
  137 + }
  138 +
  139 + public Integer getState() {
  140 + return state;
  141 + }
  142 +
  143 + public void setState(Integer state) {
  144 + this.state = state;
  145 + }
  146 +
  147 + public String getTradeId() {
  148 + return tradeId;
  149 + }
  150 +
  151 + public void setTradeId(String tradeId) {
  152 + this.tradeId = tradeId;
  153 + }
  154 +
  155 + public String getNotic() {
  156 + return notic;
  157 + }
  158 +
  159 + public void setNotic(String notic) {
  160 + this.notic = notic;
  161 + }
  162 +
  163 + public Long getOrderPaymentId() {
  164 + return orderPaymentId;
  165 + }
  166 +
  167 + public void setOrderPaymentId(Long orderPaymentId) {
  168 + this.orderPaymentId = orderPaymentId;
  169 + }
  170 +
  171 + public LocalDateTime getCreatedTime() {
  172 + return createdTime;
  173 + }
  174 +
  175 + public void setCreatedTime(LocalDateTime createdTime) {
  176 + this.createdTime = createdTime;
  177 + }
  178 +
  179 + public LocalDateTime getModifiedTime() {
  180 + return modifiedTime;
  181 + }
  182 +
  183 + public void setModifiedTime(LocalDateTime modifiedTime) {
  184 + this.modifiedTime = modifiedTime;
  185 + }
  186 +
  187 + public Integer getVersion() {
  188 + return version;
  189 + }
  190 +
  191 + public void setVersion(Integer version) {
  192 + this.version = version;
  193 + }
  194 +
  195 + public LocalDateTime getRefundTime() {
  196 + return refundTime;
  197 + }
  198 +
  199 + public void setRefundTime(LocalDateTime refundTime) {
  200 + this.refundTime = refundTime;
  201 + }
  202 +
  203 + public Long getCreateId() {
  204 + return createId;
  205 + }
  206 +
  207 + public void setCreateId(Long createId) {
  208 + this.createId = createId;
  209 + }
  210 +
  211 + public String getCreateName() {
  212 + return createName;
  213 + }
  214 +
  215 + public void setCreateName(String createName) {
  216 + this.createName = createName;
  217 + }
  218 +}
0 \ No newline at end of file 219 \ No newline at end of file
etrade-order/src/main/java/com/diligrp/etrade/order/service/OrderRefundService.java 0 → 100644
  1 +package com.diligrp.etrade.order.service;
  2 +
  3 +import com.diligrp.etrade.core.authority.UserTicket;
  4 +import com.diligrp.etrade.core.domain.Message;
  5 +import com.diligrp.etrade.order.domain.OrderRefundDto;
  6 +import com.diligrp.etrade.order.model.OrderPayment;
  7 +import com.diligrp.etrade.order.model.OrderRefund;
  8 +
  9 +/** 订单接口 */
  10 +public interface OrderRefundService {
  11 +
  12 + /**
  13 + * 退款申请
  14 + * @param refundDto
  15 + * @param userTicket
  16 + * @return
  17 + */
  18 + Message addRefund(OrderRefundDto refundDto, UserTicket userTicket);
  19 +
  20 + /**
  21 + * 根据退款单发起退款
  22 + * @param orderRefund
  23 + */
  24 + OrderRefund bulidRefundOrderAndRefund(OrderRefund orderRefund);
  25 +
  26 + /**
  27 + * 退款查询
  28 + * @return
  29 + */
  30 + Message refundCheck();
  31 +}
etrade-order/src/main/java/com/diligrp/etrade/order/service/OrderService.java
1 package com.diligrp.etrade.order.service; 1 package com.diligrp.etrade.order.service;
2 2
3 import com.diligrp.etrade.admin.domain.StoreCustomerResponseDto; 3 import com.diligrp.etrade.admin.domain.StoreCustomerResponseDto;
  4 +import com.diligrp.etrade.core.authority.UserTicket;
4 import com.diligrp.etrade.core.domain.Message; 5 import com.diligrp.etrade.core.domain.Message;
5 import com.diligrp.etrade.order.domain.*; 6 import com.diligrp.etrade.order.domain.*;
6 import com.diligrp.etrade.order.model.Order; 7 import com.diligrp.etrade.order.model.Order;
@@ -8,6 +9,7 @@ import com.diligrp.etrade.order.type.OrderOrderState; @@ -8,6 +9,7 @@ import com.diligrp.etrade.order.type.OrderOrderState;
8 import com.diligrp.etrade.rpc.dto.WeChatPayFunctionDto; 9 import com.diligrp.etrade.rpc.dto.WeChatPayFunctionDto;
9 import com.diligrp.etrade.rpc.dto.WeChatPayTradeCallBackDto; 10 import com.diligrp.etrade.rpc.dto.WeChatPayTradeCallBackDto;
10 import com.diligrp.etrade.shared.domain.OrderQrCode; 11 import com.diligrp.etrade.shared.domain.OrderQrCode;
  12 +import org.springframework.transaction.annotation.Transactional;
11 13
12 import java.time.LocalDateTime; 14 import java.time.LocalDateTime;
13 import java.util.List; 15 import java.util.List;
@@ -22,6 +24,12 @@ public interface OrderService { @@ -22,6 +24,12 @@ public interface OrderService {
22 Order createOrder(OrderCreateDto orderBuyerDto, Integer orderType,Boolean transportFeeFlag); 24 Order createOrder(OrderCreateDto orderBuyerDto, Integer orderType,Boolean transportFeeFlag);
23 25
24 /** 26 /**
  27 + * 更新订单
  28 + * @param order
  29 + */
  30 + void updateByOnly(Order order);
  31 +
  32 + /**
25 * 创建或更新订单 33 * 创建或更新订单
26 * @param orderBuyerDto 34 * @param orderBuyerDto
27 * @param orderType 身份类型 35 * @param orderType 身份类型
@@ -258,6 +266,4 @@ public interface OrderService { @@ -258,6 +266,4 @@ public interface OrderService {
258 OrderDto checkOrderState(String code); 266 OrderDto checkOrderState(String code);
259 267
260 TransportFeeDto getTransportFee(OrderTransportFeeQuery order); 268 TransportFeeDto getTransportFee(OrderTransportFeeQuery order);
261 -  
262 - void refundByOrderCode(OrderRefundDto refundDto);  
263 } 269 }
etrade-order/src/main/java/com/diligrp/etrade/order/service/impl/OrderRefundServiceImpl.java 0 → 100644
  1 +package com.diligrp.etrade.order.service.impl;
  2 +
  3 +import com.diligrp.etrade.core.authority.UserTicket;
  4 +import com.diligrp.etrade.core.domain.Message;
  5 +import com.diligrp.etrade.order.dao.OrderRefundMapper;
  6 +import com.diligrp.etrade.order.domain.OrderGetDto;
  7 +import com.diligrp.etrade.order.domain.OrderRefundDto;
  8 +import com.diligrp.etrade.order.exception.OrderErrorCode;
  9 +import com.diligrp.etrade.order.model.Order;
  10 +import com.diligrp.etrade.order.model.OrderPayment;
  11 +import com.diligrp.etrade.order.model.OrderRefund;
  12 +import com.diligrp.etrade.order.service.OrderPaymentService;
  13 +import com.diligrp.etrade.order.service.OrderRefundService;
  14 +import com.diligrp.etrade.order.service.OrderService;
  15 +import com.diligrp.etrade.order.type.OrderPaymentState;
  16 +import com.diligrp.etrade.order.type.OrderRefundState;
  17 +import com.diligrp.etrade.order.util.NumberTransform;
  18 +import com.diligrp.etrade.order.util.OrderConstant;
  19 +import com.diligrp.etrade.rpc.dto.WeChatRefundBackDto;
  20 +import com.diligrp.etrade.rpc.dto.WeChatPayRefundDto;
  21 +import com.diligrp.etrade.rpc.resolver.WeChatPayRpcResolver;
  22 +import com.diligrp.etrade.rpc.type.WeChatRefundState;
  23 +import jakarta.annotation.Resource;
  24 +import org.slf4j.Logger;
  25 +import org.slf4j.LoggerFactory;
  26 +import org.springframework.stereotype.Service;
  27 +import org.springframework.transaction.annotation.Transactional;
  28 +
  29 +import java.math.RoundingMode;
  30 +import java.time.LocalDateTime;
  31 +import java.util.Map;
  32 +
  33 +
  34 +/**
  35 + * 订单主单服务实现
  36 + */
  37 +@Service
  38 +public class OrderRefundServiceImpl implements OrderRefundService {
  39 +
  40 + private static final Logger LOGGER = LoggerFactory.getLogger(OrderRefundServiceImpl.class);
  41 +
  42 + @Resource
  43 + private OrderRefundMapper orderRefundMapper;
  44 +
  45 + @Resource
  46 + private OrderService orderService;
  47 +
  48 + @Resource
  49 + private OrderPaymentService orderPaymentService;
  50 +
  51 + @Resource
  52 + private WeChatPayRpcResolver weChatPayRpcResolver;
  53 + @Transactional(rollbackFor = Exception.class)
  54 + @Override
  55 + public Message addRefund(OrderRefundDto refundDto, UserTicket userTicket) {
  56 + //基础参数效验
  57 + LOGGER.info("退款单入参{},操作员{}",refundDto,userTicket);
  58 + Order order = orderService.getOneOrder(new OrderGetDto(null, refundDto.getCode(), refundDto.getMarketId()));
  59 + if(order == null){
  60 + return Message.failure(OrderErrorCode.PARAM_ERROR,"订单不存在");
  61 + }
  62 + OrderPayment orderPayment = orderPaymentService.getOrderPaymentById(order.getId(), order.getMarketId(), OrderPaymentState.FINISH_PAY.getCode());
  63 + if(orderPayment == null){
  64 + return Message.failure(OrderErrorCode.PARAM_ERROR,"订单未支付");
  65 + }
  66 + //是否可退款效验
  67 + Map<String,Long> oldMap = orderRefundMapper.getRefundInfoBefore(order.getId());
  68 + Long refundAmount = refundDto.getRefundAmount().setScale(2, RoundingMode.HALF_UP).multiply(NumberTransform.ONE_HUNDERD).longValue();
  69 + if(oldMap!=null){
  70 + if(oldMap.get("doing")!=null&&!oldMap.get("doing").equals(0L)){
  71 + return Message.failure(OrderErrorCode.PARAM_ERROR,"有处理中的退款单据,请确定状态后,再操作");
  72 + }
  73 + Long AllRefundAmount = orderPayment.getPayAmount()-orderPayment.getPayDiscount();
  74 + if(oldMap.get("success")!=null&&oldMap.get("success")> AllRefundAmount - refundAmount){
  75 + return Message.failure(OrderErrorCode.PARAM_ERROR,"退款金额不能大于可退金额");
  76 + }
  77 + }
  78 + OrderRefund orderRefund = bulidOrderReFund(refundDto,order,orderPayment,userTicket);
  79 + orderRefundMapper.insert(orderRefund);
  80 +
  81 + //发起退款
  82 + orderRefund = bulidRefundOrderAndRefund(orderRefund);
  83 + orderRefundMapper.update(orderRefund);
  84 + //根据退款结果更新退款单内容
  85 + if(orderRefund.getState().equals(OrderRefundState.SUCCESS.getCode())){
  86 + order.setTotalRefundAmount(order.getTotalRefundAmount()+refundAmount);
  87 + orderService.updateByOnly(order);
  88 + return Message.success();
  89 + }else{
  90 + return Message.failure(OrderErrorCode.PARAM_ERROR,"已成功发起退款,退款结果暂未获得");
  91 + }
  92 +
  93 + }
  94 +
  95 + /**
  96 + * 发起退款
  97 + * @param orderRefund
  98 + */
  99 + @Transactional(rollbackFor = Exception.class)
  100 + @Override
  101 + public OrderRefund bulidRefundOrderAndRefund(OrderRefund orderRefund) {
  102 + WeChatPayRefundDto weChatPayRefundDto = bulidWeChatPayRefundDto(orderRefund);
  103 + Message<WeChatRefundBackDto> refundInfo = weChatPayRpcResolver.refund(weChatPayRefundDto);
  104 + if(refundInfo!=null&&refundInfo.getData()!=null){
  105 + orderRefund.setRefundId(refundInfo.getData().getRefundId());
  106 + if(refundInfo.getData().getState().equals(WeChatRefundState.REFUND_SUCCESS.getCode())){
  107 + orderRefund.setRefundTime(refundInfo.getData().getWhen()==null?LocalDateTime.now():refundInfo.getData().getWhen());
  108 + orderRefund.setState(OrderRefundState.SUCCESS.getCode());
  109 + } else if (refundInfo.getData().getState().equals(WeChatRefundState.REFUND_FAIL.getCode())) {
  110 + orderRefund.setState(OrderRefundState.FAIL.getCode());
  111 + }
  112 + }
  113 + return orderRefund;
  114 + }
  115 +
  116 + @Override
  117 + public Message refundCheck() {
  118 + return null;
  119 + }
  120 +
  121 + private WeChatPayRefundDto bulidWeChatPayRefundDto(OrderRefund orderRefund) {
  122 + WeChatPayRefundDto weChatPayRefundDto = new WeChatPayRefundDto();
  123 + weChatPayRefundDto.setPaymentId(orderRefund.getTradeId());
  124 + weChatPayRefundDto.setMarketId(orderRefund.getMarketId());
  125 + weChatPayRefundDto.setAmount(orderRefund.getRefundAmount());
  126 + weChatPayRefundDto.setDescription(orderRefund.getRefundMessage());
  127 + weChatPayRefundDto.setNotifyUrl(OrderConstant.WECHAT_REFUND_BACK_API);
  128 + return weChatPayRefundDto;
  129 + }
  130 +
  131 + /**
  132 + * 构建退款单
  133 + * @param refundDto
  134 + * @param order
  135 + * @param orderPayment
  136 + * @param userTicket
  137 + * @return
  138 + */
  139 + private OrderRefund bulidOrderReFund(OrderRefundDto refundDto, Order order, OrderPayment orderPayment,UserTicket userTicket) {
  140 + OrderRefund orderRefund = new OrderRefund();
  141 + orderRefund.setOrderCode(order.getCode());
  142 + orderRefund.setOrderId(order.getId());
  143 + orderRefund.setMarketId(order.getMarketId());
  144 + orderRefund.setRefundAmount(refundDto.getRefundAmount().setScale(2, RoundingMode.HALF_UP).multiply(NumberTransform.ONE_HUNDERD).longValue());
  145 + orderRefund.setRefundMessage(refundDto.getRefundMessage());
  146 + orderRefund.setState(OrderRefundState.DOING.getCode());
  147 + orderRefund.setTradeId(orderPayment.getTradeId());
  148 + orderRefund.setVersion(NumberTransform.DEFAULT_VERSION);
  149 + orderRefund.setOrderPaymentId(orderPayment.getId());
  150 + orderRefund.setCreateId(userTicket.getId());
  151 + orderRefund.setCreateName(userTicket.getRealName());
  152 + return orderRefund;
  153 + }
  154 +}
etrade-order/src/main/java/com/diligrp/etrade/order/service/impl/OrderServiceImpl.java
@@ -25,28 +25,22 @@ import com.diligrp.etrade.order.util.NumberTransform; @@ -25,28 +25,22 @@ import com.diligrp.etrade.order.util.NumberTransform;
25 import com.diligrp.etrade.rpc.CustomerRpc; 25 import com.diligrp.etrade.rpc.CustomerRpc;
26 import com.diligrp.etrade.rpc.UapRpc; 26 import com.diligrp.etrade.rpc.UapRpc;
27 import com.diligrp.etrade.rpc.UidRpc; 27 import com.diligrp.etrade.rpc.UidRpc;
28 -import com.diligrp.etrade.rpc.basicdata.BasicDataConfigRpc;  
29 import com.diligrp.etrade.rpc.dto.*; 28 import com.diligrp.etrade.rpc.dto.*;
30 -import com.diligrp.etrade.rpc.dto.request.ConfigQueryDto;  
31 import com.diligrp.etrade.rpc.dto.response.*; 29 import com.diligrp.etrade.rpc.dto.response.*;
32 import com.diligrp.etrade.rpc.resolver.PayRpcResolver; 30 import com.diligrp.etrade.rpc.resolver.PayRpcResolver;
33 import com.diligrp.etrade.rpc.dto.response.BalanceResponseDto; 31 import com.diligrp.etrade.rpc.dto.response.BalanceResponseDto;
34 import com.diligrp.etrade.rpc.dto.response.Customer; 32 import com.diligrp.etrade.rpc.dto.response.Customer;
35 import com.diligrp.etrade.rpc.dto.response.CustomerMarket; 33 import com.diligrp.etrade.rpc.dto.response.CustomerMarket;
36 import com.diligrp.etrade.rpc.dto.response.DataDictionaryValueDTO; 34 import com.diligrp.etrade.rpc.dto.response.DataDictionaryValueDTO;
37 -import com.diligrp.etrade.rpc.resolver.WeChatPayRpcResolver;  
38 import com.diligrp.etrade.rpc.type.CustomerState; 35 import com.diligrp.etrade.rpc.type.CustomerState;
39 import com.diligrp.etrade.rpc.type.WeChatPayState; 36 import com.diligrp.etrade.rpc.type.WeChatPayState;
40 -import com.diligrp.etrade.rpc.type.WeChatPayType;  
41 import com.diligrp.etrade.rpc.util.Constants; 37 import com.diligrp.etrade.rpc.util.Constants;
42 import com.diligrp.etrade.shared.SharedConfiguration; 38 import com.diligrp.etrade.shared.SharedConfiguration;
43 import com.diligrp.etrade.shared.domain.OrderQrCode; 39 import com.diligrp.etrade.shared.domain.OrderQrCode;
44 -import com.diligrp.etrade.shop.domain.request.ShopCo;  
45 import com.diligrp.etrade.shop.domain.request.ShopExpressQueryCo; 40 import com.diligrp.etrade.shop.domain.request.ShopExpressQueryCo;
46 import com.diligrp.etrade.shop.domain.response.ShopExpressVo; 41 import com.diligrp.etrade.shop.domain.response.ShopExpressVo;
47 import com.diligrp.etrade.shop.domain.response.ShopVo; 42 import com.diligrp.etrade.shop.domain.response.ShopVo;
48 import com.diligrp.etrade.shop.service.ShopExpressSettingService; 43 import com.diligrp.etrade.shop.service.ShopExpressSettingService;
49 -import com.diligrp.etrade.shop.service.ShopService;  
50 import com.diligrp.etrade.shop.type.ExpressCondition; 44 import com.diligrp.etrade.shop.type.ExpressCondition;
51 import com.diligrp.etrade.shop.type.ExpressType; 45 import com.diligrp.etrade.shop.type.ExpressType;
52 import jakarta.annotation.Resource; 46 import jakarta.annotation.Resource;
@@ -390,7 +384,9 @@ public class OrderServiceImpl implements OrderService { @@ -390,7 +384,9 @@ public class OrderServiceImpl implements OrderService {
390 updateByOnly(order); 384 updateByOnly(order);
391 } 385 }
392 386
393 - private void updateByOnly(Order order) { 387 + @Transactional(rollbackFor = Exception.class)
  388 + @Override
  389 + public void updateByOnly(Order order) {
394 Long l = orderMapper.updateByIdSelective(order); 390 Long l = orderMapper.updateByIdSelective(order);
395 if(l<=0){ 391 if(l<=0){
396 throw new OrderException(OrderErrorCode.ORDER_SYSTEM_ERROR,"数据已在其他地方处理,请刷新后重试"); 392 throw new OrderException(OrderErrorCode.ORDER_SYSTEM_ERROR,"数据已在其他地方处理,请刷新后重试");
etrade-order/src/main/java/com/diligrp/etrade/order/type/OrderRefundState.java 0 → 100644
  1 +package com.diligrp.etrade.order.type;
  2 +
  3 +import com.diligrp.etrade.core.type.IEnumType;
  4 +
  5 +public enum OrderRefundState implements IEnumType {
  6 + FAIL("失败", 1),
  7 + DOING("处理中", 2),
  8 + SUCCESS("成功", 3);
  9 +
  10 + private String name;
  11 + private Integer code;
  12 +
  13 + private OrderRefundState(String name, Integer code) {
  14 + this.name = name;
  15 + this.code = code;
  16 + }
  17 +
  18 + public static OrderRefundState getByCode(Integer code) {
  19 + for (OrderRefundState temp : OrderRefundState.values()) {
  20 + if (temp.getCodeInteger().equals(code)) {
  21 + return temp;
  22 + }
  23 + }
  24 + return null;
  25 + }
  26 +
  27 + public static String getNameByCode(Integer code) {
  28 + for (OrderRefundState temp : OrderRefundState.values()) {
  29 + if (temp.getCodeInteger().equals(code)) {
  30 + return temp.getName();
  31 + }
  32 + }
  33 + return null;
  34 + }
  35 +
  36 + public Integer getCodeInteger() {
  37 + return this.code;
  38 + }
  39 +
  40 + public String getName() {
  41 + return this.name;
  42 + }
  43 +
  44 + public int getCode() {
  45 + return this.code;
  46 + }
  47 +
  48 + public String toString() {
  49 + return this.name;
  50 + }
  51 +}
0 \ No newline at end of file 52 \ No newline at end of file
etrade-order/src/main/java/com/diligrp/etrade/order/util/OrderConstant.java
@@ -123,4 +123,9 @@ public class OrderConstant { @@ -123,4 +123,9 @@ public class OrderConstant {
123 */ 123 */
124 public static final String WECHATPAY_BACK_API= "api/order/wxChatPayCallBack"; 124 public static final String WECHATPAY_BACK_API= "api/order/wxChatPayCallBack";
125 125
  126 + /**
  127 + * 微信退款回调地址
  128 + */
  129 + public static final String WECHAT_REFUND_BACK_API= "api/orderManager/refundCallBack";
  130 +
126 } 131 }
etrade-order/src/main/resources/com/diligrp/etrade/dao/mapper/order/OrderRefundMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3 +<mapper namespace="com.diligrp.etrade.order.dao.OrderRefundMapper">
  4 + <resultMap id="BaseResultMap" type="com.diligrp.etrade.order.model.OrderRefund">
  5 + <id column="id" jdbcType="BIGINT" property="id" />
  6 + <result column="refund_id" jdbcType="VARCHAR" property="refundId" />
  7 + <result column="order_id" jdbcType="BIGINT" property="orderId" />
  8 + <result column="order_code" jdbcType="VARCHAR" property="orderCode" />
  9 + <result column="market_id" jdbcType="BIGINT" property="marketId" />
  10 + <result column="refund_amount" jdbcType="BIGINT" property="refundAmount" />
  11 + <result column="refund_message" jdbcType="VARCHAR" property="refundMessage" />
  12 + <result column="state" jdbcType="INTEGER" property="state" />
  13 + <result column="notic" jdbcType="VARCHAR" property="notic" />
  14 + <result column="trade_id" jdbcType="VARCHAR" property="tradeId" />
  15 + <result column="order_payment_id" jdbcType="BIGINT" property="orderPaymentId" />
  16 + <result column="created_time" jdbcType="TIMESTAMP" property="createdTime" />
  17 + <result column="modified_time" jdbcType="TIMESTAMP" property="modifiedTime" />
  18 + <result column="version" jdbcType="INTEGER" property="version" />
  19 + <result column="refund_time" jdbcType="TIMESTAMP" property="refundTime" />
  20 + <result column="create_id" jdbcType="BIGINT" property="createId" />
  21 + <result column="create_name" jdbcType="VARCHAR" property="createName" />
  22 + </resultMap>
  23 + <sql id="baseSql" >
  24 + id,refund_id,order_id,order_code,market_id,
  25 + refund_amount,refund_message,state,notic,trade_id,
  26 + order_payment_id,created_time,modified_time,version,
  27 + refund_time,create_id,create_name
  28 + </sql>
  29 + <insert id="insert" parameterType="com.diligrp.etrade.order.model.OrderRefund" useGeneratedKeys="true" keyProperty="id" >
  30 + insert into order_refund (refund_id,order_id,order_code,market_id,
  31 + refund_amount,refund_message,state,notic,trade_id,
  32 + order_payment_id,created_time,version,refund_time,create_id,create_name)
  33 + values (#{refundId,jdbcType=VARCHAR},#{orderId,jdbcType=BIGINT},#{orderCode,jdbcType=VARCHAR},#{marketId,jdbcType=BIGINT},
  34 + #{refundAmount,jdbcType=BIGINT},#{refundMessage,jdbcType=VARCHAR},#{state,jdbcType=INTEGER},#{notic,jdbcType=VARCHAR},#{tradeId,jdbcType=VARCHAR},
  35 + #{orderPaymentId,jdbcType=BIGINT},#{createdTime},#{version},#{refundTime},#{createId},#{createName})
  36 + </insert>
  37 + <update id="update" parameterType="com.diligrp.etrade.order.model.OrderRefund">
  38 + update order_refund
  39 + <set>
  40 + <if test="refundId != null" >
  41 + refund_id = #{refundId,jdbcType=VARCHAR},
  42 + </if>
  43 + <if test="orderId != null" >
  44 + order_id = #{orderId,jdbcType=BIGINT},
  45 + </if>
  46 + <if test="orderCode != null" >
  47 + order_code = #{orderCode,jdbcType=VARCHAR},
  48 + </if>
  49 + <if test="marketId != null" >
  50 + market_id = #{marketId,jdbcType=BIGINT},
  51 + </if>
  52 + <if test="refundAmount != null" >
  53 + refund_amount = #{refundAmount,jdbcType=BIGINT},
  54 + </if>
  55 + <if test="refundMessage != null" >
  56 + refund_message = #{refundMessage,jdbcType=VARCHAR},
  57 + </if>
  58 + <if test="state != null" >
  59 + state = #{state,jdbcType=INTEGER},
  60 + </if>
  61 + <if test="notic != null" >
  62 + notic = #{notic,jdbcType=VARCHAR},
  63 + </if>
  64 + <if test="tradeId != null" >
  65 + trade_id = #{tradeId,jdbcType=VARCHAR},
  66 + </if>
  67 + <if test="orderPaymentId != null" >
  68 + order_payment_id = #{orderPaymentId,jdbcType=BIGINT},
  69 + </if>
  70 + <if test="refundTime != null" >
  71 + refund_time = #{refundTime,jdbcType=TIMESTAMP},
  72 + </if>
  73 + <if test="createId != null" >
  74 + create_id = #{createId,jdbcType=BIGINT},
  75 + </if>
  76 + <if test="createName != null" >
  77 + create_name = #{createName,jdbcType=VARCHAR},
  78 + </if>
  79 + version = version + 1
  80 + </set>
  81 + where id = #{id}
  82 + </update>
  83 + <select id="getRefundInfoBefore" resultType="java.util.Map" parameterType="java.lang.Long">
  84 + select SUM(case when state = 2 then refund_amount else 0 end) as 'doing',
  85 + SUM(case when state = 3 then refund_amount else 0 end) as 'success' FROM order_refund
  86 + WHERE order_id = #{orderId}
  87 + </select>
  88 +</mapper>
0 \ No newline at end of file 89 \ No newline at end of file
etrade-rpc/src/main/java/com/diligrp/etrade/rpc/PayRpc.java
@@ -147,14 +147,14 @@ public interface PayRpc { @@ -147,14 +147,14 @@ public interface PayRpc {
147 * @return 147 * @return
148 */ 148 */
149 @RequestMapping(value = "/wechat/api/gateway.do?service=hzbank.payment.service:refund", method = RequestMethod.POST) 149 @RequestMapping(value = "/wechat/api/gateway.do?service=hzbank.payment.service:refund", method = RequestMethod.POST)
150 - Message<WeChatPayRefundBackDto> refundHg(@RequestBody WeChatPayRefundDto requestDto, @RequestHeader HttpHeaders headers); 150 + Message<WeChatRefundBackDto> refundHg(@RequestBody WeChatPayRefundDto requestDto, @RequestHeader HttpHeaders headers);
151 151
152 /** 152 /**
153 - * 杭州银行微信退款 153 + * 杭州银行微信退款查询
154 * @param requestDto 154 * @param requestDto
155 * @param headers 155 * @param headers
156 * @return 156 * @return
157 */ 157 */
158 @RequestMapping(value = "/wechat/api/gateway.do?service=hzbank.payment.service:refundState", method = RequestMethod.POST) 158 @RequestMapping(value = "/wechat/api/gateway.do?service=hzbank.payment.service:refundState", method = RequestMethod.POST)
159 - Message<WeChatPayRefundBackDto> refundCheckHg(@RequestBody WeChatPayRefundCheckDto requestDto, @RequestHeader HttpHeaders headers); 159 + Message<WeChatRefundBackDto> refundCheckHg(@RequestBody WeChatPayRefundCheckDto requestDto, @RequestHeader HttpHeaders headers);
160 } 160 }
etrade-rpc/src/main/java/com/diligrp/etrade/rpc/dto/WeChatPayRefundBackDto.java renamed to etrade-rpc/src/main/java/com/diligrp/etrade/rpc/dto/WeChatRefundBackDto.java
1 package com.diligrp.etrade.rpc.dto; 1 package com.diligrp.etrade.rpc.dto;
2 2
  3 +import java.time.LocalDateTime;
  4 +
3 /** 5 /**
4 * 微信预支付返回 6 * 微信预支付返回
5 * @author fengliang 7 * @author fengliang
6 * @Date 2024-3-25 8 * @Date 2024-3-25
7 */ 9 */
8 -public class WeChatPayRefundBackDto { 10 +public class WeChatRefundBackDto {
9 11
10 /** 12 /**
11 * 退款单号 13 * 退款单号
@@ -22,6 +24,11 @@ public class WeChatPayRefundBackDto { @@ -22,6 +24,11 @@ public class WeChatPayRefundBackDto {
22 */ 24 */
23 private String message; 25 private String message;
24 26
  27 + /**
  28 + * 退款时间
  29 + */
  30 + private LocalDateTime when;
  31 +
25 public String getRefundId() { 32 public String getRefundId() {
26 return refundId; 33 return refundId;
27 } 34 }
@@ -45,4 +52,12 @@ public class WeChatPayRefundBackDto { @@ -45,4 +52,12 @@ public class WeChatPayRefundBackDto {
45 public void setMessage(String message) { 52 public void setMessage(String message) {
46 this.message = message; 53 this.message = message;
47 } 54 }
  55 +
  56 + public LocalDateTime getWhen() {
  57 + return when;
  58 + }
  59 +
  60 + public void setWhen(LocalDateTime when) {
  61 + this.when = when;
  62 + }
48 } 63 }
etrade-rpc/src/main/java/com/diligrp/etrade/rpc/resolver/WeChatPayRpcResolver.java
@@ -15,8 +15,6 @@ import org.springframework.http.HttpHeaders; @@ -15,8 +15,6 @@ import org.springframework.http.HttpHeaders;
15 import org.springframework.http.MediaType; 15 import org.springframework.http.MediaType;
16 import org.springframework.stereotype.Component; 16 import org.springframework.stereotype.Component;
17 17
18 -import java.time.LocalDateTime;  
19 -  
20 @Component 18 @Component
21 @RefreshScope 19 @RefreshScope
22 public class WeChatPayRpcResolver { 20 public class WeChatPayRpcResolver {
@@ -107,10 +105,11 @@ public class WeChatPayRpcResolver { @@ -107,10 +105,11 @@ public class WeChatPayRpcResolver {
107 * @param weChatPayRefundDto 105 * @param weChatPayRefundDto
108 * @return 106 * @return
109 */ 107 */
110 - public Message<WeChatPayRefundBackDto> refund(WeChatPayRefundDto weChatPayRefundDto){ 108 + public Message<WeChatRefundBackDto> refund(WeChatPayRefundDto weChatPayRefundDto){
  109 + weChatPayRefundDto.setNotifyUrl(backBaseUrl+weChatPayRefundDto.getNotifyUrl());
111 //组装headers 110 //组装headers
112 HttpHeaders prepareHeaders = creatHeader(weChatPayRefundDto.getMarketId().toString(), REFUND_STATE_INFO); 111 HttpHeaders prepareHeaders = creatHeader(weChatPayRefundDto.getMarketId().toString(), REFUND_STATE_INFO);
113 - Message<WeChatPayRefundBackDto> refundJsonObject = payRpc.refundHg(weChatPayRefundDto, prepareHeaders); 112 + Message<WeChatRefundBackDto> refundJsonObject = payRpc.refundHg(weChatPayRefundDto, prepareHeaders);
114 if(!refundJsonObject.getCode().equals(200)){ 113 if(!refundJsonObject.getCode().equals(200)){
115 log.info("退款参数{},请求体头部为{},请求结果为{}",weChatPayRefundDto,prepareHeaders,refundJsonObject); 114 log.info("退款参数{},请求体头部为{},请求结果为{}",weChatPayRefundDto,prepareHeaders,refundJsonObject);
116 throw new PlatformServiceException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "退款失败:" + refundJsonObject.getMessage()); 115 throw new PlatformServiceException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "退款失败:" + refundJsonObject.getMessage());
@@ -124,10 +123,10 @@ public class WeChatPayRpcResolver { @@ -124,10 +123,10 @@ public class WeChatPayRpcResolver {
124 * @param weChatPayRefundCheckDto 123 * @param weChatPayRefundCheckDto
125 * @return 124 * @return
126 */ 125 */
127 - public Message<WeChatPayRefundBackDto> refundCheck(WeChatPayRefundCheckDto weChatPayRefundCheckDto){ 126 + public Message<WeChatRefundBackDto> refundCheck(WeChatPayRefundCheckDto weChatPayRefundCheckDto){
128 //组装headers 127 //组装headers
129 HttpHeaders prepareHeaders = creatHeader(weChatPayRefundCheckDto.getMarketId().toString(), REFUND_CHECK_INFO); 128 HttpHeaders prepareHeaders = creatHeader(weChatPayRefundCheckDto.getMarketId().toString(), REFUND_CHECK_INFO);
130 - Message<WeChatPayRefundBackDto> refundJsonObject = payRpc.refundCheckHg(weChatPayRefundCheckDto, prepareHeaders); 129 + Message<WeChatRefundBackDto> refundJsonObject = payRpc.refundCheckHg(weChatPayRefundCheckDto, prepareHeaders);
131 if(!refundJsonObject.getCode().equals(200)){ 130 if(!refundJsonObject.getCode().equals(200)){
132 log.info("退款查询参数{},请求体头部为{},请求结果为{}",weChatPayRefundCheckDto,prepareHeaders,refundJsonObject); 131 log.info("退款查询参数{},请求体头部为{},请求结果为{}",weChatPayRefundCheckDto,prepareHeaders,refundJsonObject);
133 throw new PlatformServiceException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "退款失败:" + refundJsonObject.getMessage()); 132 throw new PlatformServiceException(ErrorCode.SYSTEM_UNKNOWN_ERROR, "退款失败:" + refundJsonObject.getMessage());
etrade-rpc/src/main/java/com/diligrp/etrade/rpc/type/WeChatRefundState.java 0 → 100644
  1 +package com.diligrp.etrade.rpc.type;
  2 +
  3 +
  4 +/**
  5 + * 微信支付类型
  6 + */
  7 +public enum WeChatRefundState {
  8 + REFUND_SUCCESS(4, "支付成功"),
  9 +
  10 + REFUND_FAIL(5, "支付失败");
  11 +
  12 + private Integer code;
  13 + private String value;
  14 +
  15 + WeChatRefundState(Integer code, String value) {
  16 + this.code = code;
  17 + this.value = value;
  18 + }
  19 +
  20 + public static WeChatRefundState getInstance(Integer code) {
  21 + WeChatRefundState[] var1 = values();
  22 + int var2 = var1.length;
  23 +
  24 + for(int var3 = 0; var3 < var2; ++var3) {
  25 + WeChatRefundState state = var1[var3];
  26 + if (state.getCode().equals(code)) {
  27 + return state;
  28 + }
  29 + }
  30 + return null;
  31 + }
  32 +
  33 + public Boolean equalsToCode(Integer code) {
  34 + return this.getCode().equals(code);
  35 + }
  36 +
  37 + public Integer getCode() {
  38 + return this.code;
  39 + }
  40 +
  41 + public String getValue() {
  42 + return this.value;
  43 + }
  44 +
  45 +}