longz
2026-07-09 13378d4aa6192756e87e5851188653820b5021fb
用户端代为退款
6个文件已修改
363 ■■■■■ 已修改文件
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -29,6 +29,7 @@
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -47,6 +48,8 @@
@RestController
@RequestMapping("")
public class OrderController {
    private static final String PREPAY_REFUND_PENDING_PREFIX = "PREPAY_REFUND_PENDING:";
    @Autowired
    private IOrderService orderService;
@@ -78,6 +81,9 @@
    @Autowired
    private IOrderTaxiService orderTaxiService;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Autowired
    private IOrderPrivateCarService orderPrivateCarService;
@@ -1209,4 +1215,45 @@
            e.printStackTrace();
        }
    }
    /**
     * 内部服务调用:预支付多退退款成功后完成司机端订单状态。
     */
    @ResponseBody
    @PostMapping("/base/internal/prepayRefundCallback")
    public ResultUtil prepayRefundCallback(Integer orderId, Integer orderType, String refundNo, String refundId) {
        try {
            if (orderId == null || orderType == null || ToolUtil.isEmpty(refundNo)) {
                return ResultUtil.paranErr();
            }
            if (orderType == 1) {
                orderPrivateCarService.payPrepaidRefundCallback(orderId, refundNo, refundId);
            } else if (orderType == 2) {
                orderTaxiService.payPrepaidRefundCallback(orderId, refundNo, refundId);
            } else {
                return ResultUtil.paranErr();
            }
            return ResultUtil.success();
        } catch (Exception e) {
            e.printStackTrace();
            return ResultUtil.runErr();
        }
    }
    /**
     * 内部服务调用:查询先付退款是否还在等待回调/状态完成,避免用户端重复发起二次支付。
     */
    @ResponseBody
    @PostMapping("/base/internal/prepayRefundPending")
    public ResultUtil prepayRefundPending(Integer orderId, Integer orderType) {
        if (orderId == null || orderType == null) {
            return ResultUtil.paranErr();
        }
        Map<String, Object> data = new HashMap<>();
        String key = PREPAY_REFUND_PENDING_PREFIX + orderType + ":" + orderId;
        Object marker = redisTemplate.opsForValue().get(key);
        data.put("pending", marker != null);
        data.put("marker", marker);
        return ResultUtil.success(data);
    }
}
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -22,16 +22,25 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Slf4j
@Service
public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService {
    private static final String PREPAY_REFUND_PENDING_PREFIX = "PREPAY_REFUND_PENDING:";
    @Resource
    private OrderPrivateCarMapper orderPrivateCarMapper;
@@ -122,6 +131,9 @@
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Resource
    private RestTemplate internalRestTemplate;
    /**
@@ -967,7 +979,14 @@
            request.setRefundOutRequestNo(refundNo);
            request.setRefundAmount(toFen(refundMoney));
            request.setRefundDesc("快车预支付多退退款");
            JSONObject response = CbyzxPayUtil.closePayOrder(request);
            markPrepayRefundPending(1, orderPrivateCar.getId(), refundNo, refundMoney);
            JSONObject response;
            try {
                response = requestUserServerPrepayRefund(request);
            } catch (Exception e) {
                clearPrepayRefundPending(1, orderPrivateCar.getId());
                throw e;
            }
            if (isPrepayRefundSuccess(response)) {
                String responseRefundNo = extractPrepayRefundNo(response);
                if (ToolUtil.isNotEmpty(responseRefundNo)) {
@@ -975,6 +994,7 @@
                }
                finishPrepaidOrder(orderPrivateCar);
            } else {
                clearPrepayRefundPending(1, orderPrivateCar.getId());
                System.err.println("快车微信先付退款申请失败:" + extractPrepayRefundMessage(response));
            }
            return;
@@ -1029,6 +1049,36 @@
    private String buildPrepayRefundNo(Integer orderType, Integer orderId) {
        return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private String buildPrepayRefundPendingKey(Integer orderType, Integer orderId) {
        return PREPAY_REFUND_PENDING_PREFIX + orderType + ":" + orderId;
    }
    private void markPrepayRefundPending(Integer orderType, Integer orderId, String refundNo, Double refundMoney) {
        JSONObject marker = new JSONObject();
        marker.put("refundNo", refundNo);
        marker.put("refundAmount", refundMoney);
        marker.put("createTime", System.currentTimeMillis());
        redisTemplate.opsForValue().set(buildPrepayRefundPendingKey(orderType, orderId), marker.toJSONString(), 2, TimeUnit.HOURS);
    }
    private void clearPrepayRefundPending(Integer orderType, Integer orderId) {
        redisTemplate.delete(buildPrepayRefundPendingKey(orderType, orderId));
    }
    private JSONObject requestUserServerPrepayRefund(CbyzxPayUtil.ClosePayOrderRequest request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("outRequestNo", request.getOutRequestNo());
        params.add("refundOutRequestNo", request.getRefundOutRequestNo());
        params.add("refundAmount", String.valueOf(request.getRefundAmount()));
        params.add("refundDesc", request.getRefundDesc());
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
        String response = internalRestTemplate.postForObject(
                "http://user-server/base/internal/cbyzxPrepayRefund", requestEntity, String.class);
        return JSON.parseObject(response);
    }
    private Integer toFen(Double amount) {
@@ -1086,9 +1136,11 @@
    public void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception {
        OrderPrivateCar orderPrivateCar = this.selectById(orderId);
        if (orderPrivateCar == null || !Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            clearPrepayRefundPending(1, orderId);
            return;
        }
        if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundTime())) {
            clearPrepayRefundPending(1, orderId);
            return;
        }
        if (ToolUtil.isNotEmpty(orderPrivateCar.getPrepayRefundNo()) && !orderPrivateCar.getPrepayRefundNo().equals(refundNo)) {
@@ -1096,6 +1148,7 @@
        }
        finishPrepaidOrder(orderPrivateCar);
        this.updateById(orderPrivateCar);
        clearPrepayRefundPending(1, orderId);
        pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
        pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState());
        new Thread(new Runnable() {
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -17,16 +17,25 @@
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
@Service
public class OrderTaxiServiceImpl extends ServiceImpl<OrderTaxiMapper, OrderTaxi> implements IOrderTaxiService {
    private static final String PREPAY_REFUND_PENDING_PREFIX = "PREPAY_REFUND_PENDING:";
    @Resource
    private OrderTaxiMapper orderTaxiMapper;
@@ -88,6 +97,9 @@
    @Autowired
    private PayMoneyUtil payMoneyUtil;
    @Resource
    private RestTemplate internalRestTemplate;
@@ -672,7 +684,14 @@
            request.setRefundOutRequestNo(refundNo);
            request.setRefundAmount(toFen(refundMoney));
            request.setRefundDesc("出租车预支付多退退款");
            JSONObject response = CbyzxPayUtil.closePayOrder(request);
            markPrepayRefundPending(2, orderTaxi.getId(), refundNo, refundMoney);
            JSONObject response;
            try {
                response = requestUserServerPrepayRefund(request);
            } catch (Exception e) {
                clearPrepayRefundPending(2, orderTaxi.getId());
                throw e;
            }
            if (isPrepayRefundSuccess(response)) {
                String responseRefundNo = extractPrepayRefundNo(response);
                if (ToolUtil.isNotEmpty(responseRefundNo)) {
@@ -680,6 +699,7 @@
                }
                finishPrepaidOrder(orderTaxi);
            } else {
                clearPrepayRefundPending(2, orderTaxi.getId());
                System.err.println("出租车微信先付退款申请失败:" + extractPrepayRefundMessage(response));
            }
            return;
@@ -733,6 +753,36 @@
    private String buildPrepayRefundNo(Integer orderType, Integer orderId) {
        return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private String buildPrepayRefundPendingKey(Integer orderType, Integer orderId) {
        return PREPAY_REFUND_PENDING_PREFIX + orderType + ":" + orderId;
    }
    private void markPrepayRefundPending(Integer orderType, Integer orderId, String refundNo, Double refundMoney) {
        JSONObject marker = new JSONObject();
        marker.put("refundNo", refundNo);
        marker.put("refundAmount", refundMoney);
        marker.put("createTime", System.currentTimeMillis());
        redisTemplate.opsForValue().set(buildPrepayRefundPendingKey(orderType, orderId), marker.toJSONString(), 2, TimeUnit.HOURS);
    }
    private void clearPrepayRefundPending(Integer orderType, Integer orderId) {
        redisTemplate.delete(buildPrepayRefundPendingKey(orderType, orderId));
    }
    private JSONObject requestUserServerPrepayRefund(CbyzxPayUtil.ClosePayOrderRequest request) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("outRequestNo", request.getOutRequestNo());
        params.add("refundOutRequestNo", request.getRefundOutRequestNo());
        params.add("refundAmount", String.valueOf(request.getRefundAmount()));
        params.add("refundDesc", request.getRefundDesc());
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
        String response = internalRestTemplate.postForObject(
                "http://user-server/base/internal/cbyzxPrepayRefund", requestEntity, String.class);
        return JSON.parseObject(response);
    }
    private Integer toFen(Double amount) {
@@ -790,9 +840,11 @@
    public void payPrepaidRefundCallback(Integer orderId, String refundNo, String refundId) throws Exception {
        OrderTaxi orderTaxi = this.selectById(orderId);
        if (orderTaxi == null || !Integer.valueOf(4).equals(orderTaxi.getPrepayStage())) {
            clearPrepayRefundPending(2, orderId);
            return;
        }
        if (ToolUtil.isNotEmpty(orderTaxi.getPrepayRefundTime())) {
            clearPrepayRefundPending(2, orderId);
            return;
        }
        if (ToolUtil.isNotEmpty(orderTaxi.getPrepayRefundNo()) && !orderTaxi.getPrepayRefundNo().equals(refundNo)) {
@@ -800,6 +852,7 @@
        }
        finishPrepaidOrder(orderTaxi);
        this.updateById(orderTaxi);
        clearPrepayRefundPending(2, orderId);
        pushUtil.pushOrderState(1, orderTaxi.getUserId(), orderTaxi.getId(), 2, orderTaxi.getState());
        pushUtil.pushOrderState(2, orderTaxi.getDriverId(), orderTaxi.getId(), 2, orderTaxi.getState());
    }
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -43,7 +43,13 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
@@ -151,6 +157,9 @@
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Resource
    private RestTemplate internalRestTemplate;
    @Resource
    private ISystemPriceCityService systemPriceCityService;
@@ -1722,9 +1731,39 @@
     */
    @ResponseBody
    @PostMapping("/base/cbyzxCancelOrderTaxi")
    public Map<String, Object> cbyzxCancelOrderTaxi(HttpServletRequest request, HttpServletResponse response) {
        // 不做处理  退款已同步处理
        return buildCbyzxCallbackResponse(0, "success");
    public Map<String, Object> cbyzxCancelOrderTaxi(@RequestBody(required = false) String params,
                                                    HttpServletRequest request, HttpServletResponse response) {
        try {
            JSONObject payload = parseCbyzxCallbackPayload(params, request);
            String refundNo = firstNotBlank(payload,
                    "refundOutRequestNo", "refund_out_request_no", "outRefundNo", "out_refund_no",
                    "merchantRefundSerialNo", "merchant_refund_serial_no");
            if (StringUtils.isBlank(refundNo)) {
                return buildCbyzxCallbackResponse(0, "success");
            }
            if (!refundNo.startsWith("PRF_")) {
                return buildCbyzxCallbackResponse(0, "success");
            }
            String[] split = refundNo.split("_");
            if (split.length < 4 || !StringUtils.isNumeric(split[1]) || !StringUtils.isNumeric(split[2])) {
                return buildCbyzxCallbackResponse(1, "invalid refundOutRequestNo");
            }
            Integer orderType = Integer.valueOf(split[1]);
            Integer orderId = Integer.valueOf(split[2]);
            String refundId = firstNotBlank(payload,
                    "refundId", "refund_id", "gatewaySerialNo", "gateway_serial_no",
                    "thirdRefundNo", "third_refund_no", "merchantRefundSerialNo", "merchant_refund_serial_no");
            Map<String, Object> driverResult = notifyDriverPrepayRefund(orderId, orderType, refundNo, refundId);
            Object code = driverResult == null ? null : driverResult.get("code");
            if (code != null && "200".equals(String.valueOf(code))) {
                return buildCbyzxCallbackResponse(0, "success");
            }
            log.error("创博优退款回调转发司机端失败,payload={}, driverResult={}", payload, driverResult);
            return buildCbyzxCallbackResponse(1, "driver callback fail");
        } catch (Exception e) {
            log.error("创博优退款回调处理失败", e);
            return buildCbyzxCallbackResponse(1, "fail");
        }
//        try {
//            Map<String, String> map = payMoneyUtil.weixinpayCallback(request);
@@ -1759,6 +1798,46 @@
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
    }
    /**
     * 内部服务调用:创博优微信先付订单退款。
     * 只负责调用退款网关并返回原始结果,不修改司机端订单业务状态。
     */
    @ResponseBody
    @PostMapping("/base/internal/cbyzxPrepayRefund")
    public JSONObject cbyzxPrepayRefund(String outRequestNo, String refundOutRequestNo,
                                        Integer refundAmount, String refundDesc) {
        JSONObject error = new JSONObject();
        if (ToolUtil.isEmpty(outRequestNo)) {
            error.put("code", 1);
            error.put("msg", "missing outRequestNo");
            return error;
        }
        if (ToolUtil.isEmpty(refundOutRequestNo)) {
            error.put("code", 1);
            error.put("msg", "missing refundOutRequestNo");
            return error;
        }
        if (refundAmount == null || refundAmount <= 0) {
            error.put("code", 1);
            error.put("msg", "invalid refundAmount");
            return error;
        }
        try {
            CbyzxPayUtil.ClosePayOrderRequest closeRequest = new CbyzxPayUtil.ClosePayOrderRequest();
            closeRequest.setOutRequestNo(outRequestNo);
            closeRequest.setRefundOutRequestNo(refundOutRequestNo);
            closeRequest.setRefundAmount(refundAmount);
            closeRequest.setRefundDesc(ToolUtil.isNotEmpty(refundDesc) ? refundDesc : "微信先付订单退款");
            return CbyzxPayUtil.closePayOrder(closeRequest);
        } catch (Exception e) {
            log.error("内部创博优先付退款失败,outRequestNo={}, refundOutRequestNo={}",
                    outRequestNo, refundOutRequestNo, e);
            error.put("code", 1);
            error.put("msg", e.getMessage());
            return error;
        }
    }
    /**
@@ -2089,6 +2168,69 @@
        return result;
    }
    private JSONObject parseCbyzxCallbackPayload(String params, HttpServletRequest request) {
        JSONObject payload = new JSONObject();
        if (StringUtils.isNotBlank(params)) {
            try {
                JSONObject body = JSONObject.parseObject(params);
                if (body != null) {
                    payload.putAll(body);
                }
            } catch (Exception e) {
                log.warn("创博优回调body不是JSON,params={}", params);
            }
        }
        if (request != null && request.getParameterMap() != null) {
            for (String key : request.getParameterMap().keySet()) {
                String[] values = request.getParameterValues(key);
                if (values == null || values.length == 0) {
                    continue;
                }
                payload.put(key, values.length == 1 ? values[0] : Arrays.asList(values));
            }
        }
        return payload;
    }
    private String firstNotBlank(JSONObject payload, String... keys) {
        if (payload == null || keys == null) {
            return null;
        }
        for (String key : keys) {
            Object value = payload.get(key);
            if (value == null) {
                continue;
            }
            if (value instanceof Collection) {
                for (Object item : (Collection<?>) value) {
                    String text = item == null ? null : String.valueOf(item);
                    if (StringUtils.isNotBlank(text)) {
                        return text;
                    }
                }
            } else {
                String text = String.valueOf(value);
                if (StringUtils.isNotBlank(text)) {
                    return text;
                }
            }
        }
        return null;
    }
    private Map<String, Object> notifyDriverPrepayRefund(Integer orderId, Integer orderType, String refundNo, String refundId) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, Object> postParams = new LinkedMultiValueMap<>();
        postParams.add("orderId", orderId);
        postParams.add("orderType", orderType);
        postParams.add("refundNo", refundNo);
        postParams.add("refundId", refundId);
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(postParams, headers);
        return internalRestTemplate.postForObject(
                "http://driver-server/base/internal/prepayRefundCallback", requestEntity, Map.class);
    }
    /**
     * 小件物流差价微信支付回调
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -2029,6 +2029,9 @@
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        if (isPrepayRefundPending(1, orderId)) {
            return ResultUtil.error("退款处理中,请稍后刷新", "");
        }
        normalizePrivateCarPrepayFirstStageBeforePay(orderPrivateCar);
        System.out.println("!!!" + orderPrivateCar + "!!!!");
        Integer uid = orderPrivateCar.getUserId();
@@ -2197,6 +2200,9 @@
        }
        if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", new ArrayList<>());
        }
        if (isPrepayRefundPending(1, orderId)) {
            return ResultUtil.error("退款处理中,请稍后刷新", new ArrayList<>());
        }
        normalizePrivateCarPrepayFirstStageBeforePay(orderPrivateCar);
@@ -2692,6 +2698,29 @@
        return "BAL_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private boolean isPrepayRefundPending(Integer orderType, Integer orderId) {
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
            params.add("orderType", String.valueOf(orderType));
            params.add("orderId", String.valueOf(orderId));
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
            Map response = internalRestTemplate.postForObject(
                    "http://driver-server/base/internal/prepayRefundPending", requestEntity, Map.class);
            if (response == null || !ResultUtil.SUCCESS.equals(response.get("code"))) {
                return false;
            }
            Object data = response.get("data");
            if (data instanceof Map) {
                return Boolean.TRUE.equals(((Map) data).get("pending"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    private Double appendPayMoney(Double source, Double amount) {
        return new BigDecimal(source == null ? 0D : source)
                .add(new BigDecimal(amount == null ? 0D : amount))
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -1293,6 +1293,9 @@
        if (Integer.valueOf(1).equals(orderTaxi.getPaymentMode()) && Integer.valueOf(4).equals(orderTaxi.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        if (isPrepayRefundPending(2, orderId)) {
            return ResultUtil.error("退款处理中,请稍后刷新", "");
        }
        Integer uid = orderTaxi.getUserId();
        Double orderMoney = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
        UserInfo userInfo = userInfoService.selectById(uid);
@@ -1453,6 +1456,9 @@
        }
        if (Integer.valueOf(1).equals(orderTaxi.getPaymentMode()) && Integer.valueOf(4).equals(orderTaxi.getPrepayStage())) {
            return ResultUtil.error("订单退款处理中,请等待退款完成", "");
        }
        if (isPrepayRefundPending(2, orderId)) {
            return ResultUtil.error("退款处理中,请稍后刷新", "");
        }
        Integer uid = orderTaxi.getUserId();
        Double orderMoney = (2 == orderTaxi.getAbnormal() && 2 == orderTaxi.getAbnormalStatus() ? orderTaxi.getResponsibilityMoney().doubleValue() : orderTaxi.getOrderMoney());
@@ -2161,6 +2167,29 @@
        return "BAL_" + orderType + "_" + orderId + "_" + System.currentTimeMillis();
    }
    private boolean isPrepayRefundPending(Integer orderType, Integer orderId) {
        try {
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
            params.add("orderType", String.valueOf(orderType));
            params.add("orderId", String.valueOf(orderId));
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
            Map response = internalRestTemplate.postForObject(
                    "http://driver-server/base/internal/prepayRefundPending", requestEntity, Map.class);
            if (response == null || !ResultUtil.SUCCESS.equals(response.get("code"))) {
                return false;
            }
            Object data = response.get("data");
            if (data instanceof Map) {
                return Boolean.TRUE.equals(((Map) data).get("pending"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    private Double appendPayMoney(Double source, Double amount) {
        return new BigDecimal(source == null ? 0D : source)
                .add(new BigDecimal(amount == null ? 0D : amount))