From 0867ea81d6b97e5f7d71dc0318e3fd84b64bdb54 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期三, 15 四月 2026 22:33:31 +0800
Subject: [PATCH] 支付对接

---
 UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java |  201 ++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 187 insertions(+), 14 deletions(-)

diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
index 0b0c1ea..41a2481 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -310,7 +310,9 @@
 				if (orderSource != 2) { // 扫码下单跳过先付判断(扫码下单已有固定司机)
 					TSysPaymentMode paymentMode = tSysPaymentModeService.selectOne(
 							new EntityWrapper<TSysPaymentMode>().last("LIMIT 1"));
-					baseWarpper.setPaymentMode(paymentMode.getPrivateType());
+					if (paymentMode != null && paymentMode.getPrivateType() != null) {
+						baseWarpper.setPaymentMode(paymentMode.getPrivateType());
+					}
 					if (paymentMode != null && Integer.valueOf(1).equals(paymentMode.getPrivateType())) {
 						// 先付模式:计算预估金额,订单状态改为7(待支付)
 						Company payCompany = companyCityService.query(geocode.get("districtCode"));
@@ -1131,6 +1133,17 @@
 		if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11) {
 			return ResultUtil.error("订单已取消,请刷新页面");
 		}
+		if (!Integer.valueOf(2).equals(orderPrivateCar.getType())) {
+			ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, reason, remark, uid);
+			if (refundResult != null) {
+				if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) {
+					return refundResult;
+				}
+				Map<String, Object> map = new HashMap<>();
+				map.put("id", null);
+				return ResultUtil.success(map);
+			}
+		}
 		Integer number1 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("pid", orderPrivateCar.getPid() == null ? orderPrivateCar.getId() : orderPrivateCar.getPid()).lt("state", 6));
 		Integer number2 = this.selectCount(new EntityWrapper<OrderPrivateCar>().eq("id", orderPrivateCar.getPid() == null ? orderPrivateCar.getId() : orderPrivateCar.getPid()).lt("state", 6));
 		if (number1 + number2 == 1) {
@@ -1257,9 +1270,14 @@
 			if (payType == 1) {//微信支付
 				orderCancel.setPayType(1);
 				orderCancelService.updateById(orderCancel);
-				String app = type == 1 ? "APP" : "JSAPI";
-				resultUtil = payMoneyUtil.weixinpay("订单取消", "", id + "_1_" + UUIDUtil.getRandomCode(5), query.getMoney().toString(), "/base/wxCancelOrderTaxi", app, userInfo.getAppletsOpenId());
-				paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), "", 1);//添加预支付数据
+				String outTradeNo = "CANCEL_" + id + "_1_" + UUIDUtil.getRandomCode(5);
+				JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, query.getMoney());
+				if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
+					return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
+				}
+				String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
+				resultUtil = ResultUtil.success(response);
+				paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, id, 1, 1, query.getMoney(), paymentCode, 1);//添加预支付数据
 			}
 			if (payType == 2) {//支付宝支付
 				orderCancel.setPayType(2);
@@ -2599,6 +2617,140 @@
 		}
 	}
 
+	private void restorePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception {
+		if (null != orderPrivateCar.getCouponId()) {
+			UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId());
+			if (userCouponRecord != null) {
+				userCouponRecord.setState(1);
+				userCouponRecord.setEndTime(null);
+				userCouponRecordService.updateById(userCouponRecord);
+			}
+		}
+		if (null != orderPrivateCar.getUserTaxiCardId()) {
+			UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId());
+			if (userTaxiCard != null && (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3)) {
+				JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent());
+				Integer time = jsonObject.getInteger("time");
+				jsonObject.put("time", (time == null ? 0 : time) + 1);
+				userTaxiCard.setContent(jsonObject.toJSONString());
+				userTaxiCardService.updateById(userTaxiCard);
+			}
+		}
+		if (null != orderPrivateCar.getRedPacketId()) {
+			UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId());
+			if (userRedPacketRecord != null) {
+				userRedPacketRecord.setState(1);
+				userRedPacketRecord.setEndTime(null);
+				userRedPacketRecordService.updateById(userRedPacketRecord);
+			}
+		}
+	}
+
+	private boolean isPrivateCarPrepayRefundSuccess(JSONObject response) {
+		if (response == null) {
+			return false;
+		}
+		Object code = response.get("code");
+		if (code == null || !"0".equals(String.valueOf(code))) {
+			return false;
+		}
+		JSONObject data = response.getJSONObject("data");
+		return data != null && Boolean.TRUE.equals(data.getBoolean("isSuccess"));
+	}
+
+	private String extractPrivateCarRefundNo(JSONObject response) {
+		if (response == null) {
+			return null;
+		}
+		JSONObject data = response.getJSONObject("data");
+		if (data == null) {
+			return null;
+		}
+		String refundNo = data.getString("merchantRefundSerialNo");
+		if (ToolUtil.isNotEmpty(refundNo)) {
+			return refundNo;
+		}
+		refundNo = data.getString("refundId");
+		if (ToolUtil.isNotEmpty(refundNo)) {
+			return refundNo;
+		}
+		return data.getString("gatewaySerialNo");
+	}
+
+	private String extractPrivateCarRefundMessage(JSONObject response) {
+		if (response == null) {
+			return "微信先付退款失败";
+		}
+		JSONObject data = response.getJSONObject("data");
+		if (data != null && ToolUtil.isNotEmpty(data.getString("failReason"))) {
+			return data.getString("failReason");
+		}
+		String msg = response.getString("msg");
+		return ToolUtil.isNotEmpty(msg) ? msg : "微信先付退款失败";
+	}
+
+	private Integer toFen(Double amount) {
+		return new BigDecimal(String.valueOf(amount)).multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).intValue();
+	}
+
+	private String buildPrepayRefundOutNo(Integer orderId) {
+		return "PREPAY_REFUND_1_" + orderId;
+	}
+
+	private boolean isPrivateCarPrepayMode(OrderPrivateCar orderPrivateCar) {
+		return orderPrivateCar != null && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode());
+	}
+
+	private ResultUtil handlePrivateCarPrepayCancelRefund(OrderPrivateCar orderPrivateCar, String reason, String remark, Integer uid) throws Exception {
+		if (!isPrivateCarPrepayMode(orderPrivateCar)) {
+			return null;
+		}
+		String outRequestNo = orderPrivateCar.getPrepaySecondPayNo();
+		if (ToolUtil.isEmpty(outRequestNo)) {
+			return ResultUtil.error("微信先付订单缺少支付单号,无法关闭支付单");
+		}
+		Double refundAmount = orderPrivateCar.getPayMoney();
+		if (refundAmount == null || refundAmount <= 0) {
+			return ResultUtil.error("微信先付订单退款金额异常");
+		}
+		CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest();
+		request.setOutRequestNo(outRequestNo);
+		request.setRefundOutRequestNo(buildPrepayRefundOutNo(orderPrivateCar.getId()));
+		request.setRefundAmount(toFen(refundAmount));
+		request.setRefundDesc(ToolUtil.isNotEmpty(reason) ? reason : "快车订单取消退款");
+		JSONObject response = CbyzxPayUtil.closePayOrder(request);
+		if (!isPrivateCarPrepayRefundSuccess(response)) {
+			return ResultUtil.error(extractPrivateCarRefundMessage(response), response);
+		}
+
+		restorePrivateCarBenefits(orderPrivateCar);
+		transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId());
+		orderCancelService.saveData(orderPrivateCar.getId(), 1,
+				ToolUtil.isNotEmpty(reason) ? reason : "无司机接单",
+				ToolUtil.isNotEmpty(remark) ? remark : (ToolUtil.isNotEmpty(reason) ? reason : "无司机接单"),
+				1, refundAmount, 2, 1, uid);
+		orderPrivateCar.setState(10);
+		orderPrivateCar.setPrepayStage(5);
+		orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response));
+		orderPrivateCar.setPrepayRefundAmount(refundAmount);
+		orderPrivateCar.setPrepayRefundTime(new Date());
+		this.updateById(orderPrivateCar);
+		if (orderPrivateCar.getDriverId() != null) {
+			this.deleteTask(orderPrivateCar.getId());
+			pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0);
+			Driver driver = driverService.selectById(orderPrivateCar.getDriverId());
+			if (driver != null) {
+				driver.setState(2);
+				driverService.updateById(driver);
+			}
+			if (orderPrivateCar.getBindId() != null) {
+				chinaMobileUtil.midAxbUnBindSend(orderPrivateCar.getBindId(), orderPrivateCar.getTelX(), (System.currentTimeMillis() + 86400000));
+			}
+		}
+		systemNoticeService.addSystemNotice(1, "您的快车微信先付订单已取消,退款已原路退回,请注意查收。", orderPrivateCar.getUserId(), 1);
+		return ResultUtil.success(response);
+	}
+
 	private void dispatchPrepayPrivateCarOrder(OrderPrivateCar orderPrivateCar) throws Exception {
 		if (Integer.valueOf(3).equals(orderPrivateCar.getType()) && ToolUtil.isNotEmpty(orderPrivateCar.getServerCarModel())) {
 			JSONArray jsonArray = JSON.parseArray(orderPrivateCar.getServerCarModel());
@@ -2668,6 +2820,7 @@
 			paymentRecordService.updateById(query);
 
 			if (isPrivateCarPrepayFirstStage(orderPrivateCar)) {
+				orderPrivateCar.setPrepaySecondPayNo(outTradeNo);
 				handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, query.getAmount(), type);
 				return;
 			}
@@ -2822,9 +2975,14 @@
 		OrderPrivateCar orderPrivateCar = this.selectById(orderId);
 		ResultUtil resultUtil = ResultUtil.success();
 		if (payType == 1) {//微信支付
-			String app = type == 1 ? "APP" : "JSAPI";
-			resultUtil = payMoneyUtil.weixinpay("感谢费", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/wxPayThankYouFee", app, userInfo.getAppletsOpenId());
-			paymentRecordService.saveData(3, uid, 1, orderId, 1, 1, money, "", 1);//添加预支付数据
+			String outTradeNo = "THANK_" + orderId + "_1_" + UUIDUtil.getRandomCode(5);
+			JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, money);
+			if (!cbyzxOrderPayHelper.isCreateSuccess(response)) {
+				return ResultUtil.error(cbyzxOrderPayHelper.extractMessage(response), response);
+			}
+			String paymentCode = ToolUtil.isNotEmpty(cbyzxOrderPayHelper.extractRecordCode(response)) ? cbyzxOrderPayHelper.extractRecordCode(response) : outTradeNo;
+			resultUtil = ResultUtil.success(response);
+			paymentRecordService.saveData(3, uid, 1, orderId, 1, 1, money, paymentCode, 1);//添加预支付数据
 		}
 		if (payType == 2) {//支付宝支付
 			resultUtil = payMoneyUtil.alipay("感谢费", "感谢费", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), money.toString(), "/base/aliPayThankYouFee");
@@ -3005,8 +3163,11 @@
 								break;
 							}
 							if (num == 18) {
-								orderPrivateCar1.setState(10);
-								orderPrivateCarMapper.updateById(orderPrivateCar1);
+								ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar1, "无司机接单", "无司机接单", orderPrivateCar1.getUserId());
+								if (refundResult == null) {
+									orderPrivateCar1.setState(10);
+									orderPrivateCarMapper.updateById(orderPrivateCar1);
+								}
 								pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
 								orderIds.remove(orderPrivateCar.getId());
 							}
@@ -3036,6 +3197,7 @@
 			@Override
 			public void run() {
 				try {
+					System.out.println("推单推单推单!!");
 					Integer id = orderPrivateCar.getId();
 					Integer orderType = orderPrivateCar.getRideType() == 1 ? 1 : orderPrivateCar.getRideType() == 2 ? 9 : 8;
 					orderIds.add(orderPrivateCar.getId());//添加记录,防止调用接口重复提醒无人接单
@@ -3049,8 +3211,9 @@
 					// 判断是否为派单模式
 					TSysPushType sysPushType = tSysPushTypeService.selectOne(new EntityWrapper<TSysPushType>().eq("openCityId", openCity.getId()));
 					if(sysPushType!=null && sysPushType.getPushType()==2){
+						System.out.println( "派单模式");
 						OrderPrivateCar orderPrivateCar = orderPrivateCarMapper.selectById(id);
-						if (null == orderPrivateCar && orderPrivateCar.getState() == 1) {
+						if (null != orderPrivateCar && orderPrivateCar.getState() == 1) {
 							// 固定5公里进行派单
 							List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), 5.0, null);//所有附近空闲司机
 							if (list.size() > 0) {
@@ -3143,17 +3306,19 @@
 
 							}else {
 								// 没找到车辆
-								orderPrivateCar.setState(10);
-								orderPrivateCarMapper.updateById(orderPrivateCar);
+								ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId());
+								if (refundResult == null) {
+									orderPrivateCar.setState(10);
+									orderPrivateCarMapper.updateById(orderPrivateCar);
+								}
 								pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
-
-								// TODO 退款
 							}
 
 
 						}
 
 					}else {
+						System.out.println( "推单模式");
 
 						List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数
 						for (int i = 1; i <= querys.size() + 15; i++) {
@@ -3174,6 +3339,7 @@
 								}
 								//获取空闲司机
 								List<Driver> list = driverService.queryIdleDriver(orderType, orderPrivateCar.getServerCarModelId(), orderPrivateCar.getStartLon(), orderPrivateCar.getStartLat(), pushOrder.getPushDistance(), null);//所有附近空闲司机
+								System.out.println(list.toString()+"XXXXXXXX");
 								if (list.size() > 0) {
 									double driverProportion = pushOrder.getDriverProportion() / 100;//推送占比计算成小数
 									int lastIndex = Double.valueOf(list.size() * driverProportion).intValue();//计算占比转成整数(下标截取)
@@ -3202,6 +3368,13 @@
 								if (i == querys.size() + 15 && state == 1) {
 									pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1);
 									orderIds.remove(orderPrivateCar.getId());
+
+									// 没找到车辆
+									ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId());
+									if (refundResult == null) {
+										orderPrivateCar.setState(10);
+										orderPrivateCarMapper.updateById(orderPrivateCar);
+									}
 								}
 							}
 						}

--
Gitblit v1.7.1