| | |
| | | package com.stylefeng.guns.modular.specialTrain.server.impl; |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONArray; |
| | | import com.alibaba.fastjson.JSONObject; |
| | |
| | | import java.math.RoundingMode; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.LinkedBlockingQueue; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import java.util.concurrent.TimeUnit; |
| | |
| | | @Service |
| | | public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService { |
| | | |
| | | public static List<Integer> orderIds = new ArrayList<>(); |
| | | public static Set<Integer> orderIds = ConcurrentHashMap.newKeySet();; |
| | | @Resource |
| | | private OrderPrivateCarMapper orderPrivateCarMapper; |
| | | @Resource |
| | |
| | | private IOrderTaxiService orderTaxiService; |
| | | @Autowired |
| | | private PayMoneyUtil payMoneyUtil; |
| | | |
| | | @Autowired |
| | | private CbyzxOrderPayHelper cbyzxOrderPayHelper; |
| | | @Autowired |
| | | private TAbnormalPayOrderMapper abnormalPayOrderMapper; |
| | | @Autowired |
| | |
| | | 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")); |
| | |
| | | orderPrivateCar.setTotalPeopleNum(peopleNum); |
| | | orderPrivateCar.setIsReassign(1); |
| | | orderPrivateCar.setIsDelete(1); |
| | | orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0); |
| | | this.insert(orderPrivateCar); |
| | | |
| | | if (orderSource == 2) {//扫码下单 |
| | |
| | | orderPrivateCar.setTotalPeopleNum(peopleNum); |
| | | orderPrivateCar.setIsReassign(1); |
| | | orderPrivateCar.setIsDelete(1); |
| | | orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0); |
| | | this.insert(orderPrivateCar); |
| | | this.pushOrder(orderPrivateCar); |
| | | } else { |
| | |
| | | orderPrivateCar.setIsReassign(1); |
| | | orderPrivateCar.setIsDelete(1); |
| | | orderPrivateCar.setPid(orderPrivateCar1.getPid() == null ? orderPrivateCar1.getId() : orderPrivateCar1.getPid()); |
| | | orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0); |
| | | this.insert(orderPrivateCar); |
| | | //修改总订单人数 |
| | | OrderPrivateCar orderPrivateCar2 = new OrderPrivateCar(); |
| | |
| | | orderPrivateCar.setTotalPeopleNum(peopleNum); |
| | | orderPrivateCar.setIsReassign(1); |
| | | orderPrivateCar.setIsDelete(1); |
| | | orderPrivateCar.setPrepayStage(Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) ? 1 : 0); |
| | | |
| | | //判断独享,一口价,拼车 |
| | | JSONArray jsonArray = JSON.parseArray(serverCarModel); |
| | |
| | | // if(orderPrivateCar.getState() == 4){ |
| | | // return ResultUtil.error("司机已到达预约点,取消会产生一定的费用"); |
| | | // } |
| | | if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11) { |
| | | if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11 && orderPrivateCar.getCancelType() ==2) { |
| | | return ResultUtil.error("订单已取消,请刷新页面"); |
| | | } |
| | | if (!Integer.valueOf(2).equals(orderPrivateCar.getPaymentMode())) { |
| | | handlePrivateCarPrepayCancelRefund(orderPrivateCar,reason); |
| | | } |
| | | 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 (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); |
| | |
| | | String driverId = (String) redisTemplate.opsForValue().get("DEVICE_" + map.get("driverId")); |
| | | map.put("device", ToolUtil.isNotEmpty(driverId) ? 2 : 1); |
| | | map.put("orderType", 1); |
| | | fillPrivateCarPrepayDisplayMoney(this.selectById(orderId), map); |
| | | return map; |
| | | } |
| | | |
| | |
| | | if (orderPrivateCar.getState() != 7) { |
| | | return ResultUtil.error("订单不在待支付状态,不允许支付", ""); |
| | | } |
| | | if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) { |
| | | return ResultUtil.error("订单退款处理中,请等待退款完成", ""); |
| | | } |
| | | Integer uid = orderPrivateCar.getUserId(); |
| | | Double orderMoney = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney()); |
| | | UserInfo userInfo = userInfoService.selectById(uid); |
| | |
| | | } |
| | | } |
| | | orderMoney = orderMoney < 0 ? 0 : orderMoney; |
| | | ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney); |
| | | if (prepaySettleResult != null) { |
| | | return prepaySettleResult; |
| | | } |
| | | orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney); |
| | | if (payType == 1) {//微信支付 |
| | | String app = type == 1 ? "APP" : "JSAPI"; |
| | | resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); |
| | | paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据 |
| | | String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5); |
| | | JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney); |
| | | 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, orderId, 1, 1, orderMoney, paymentCode, 1);//添加预支付数据 |
| | | } |
| | | if (payType == 2) {//支付宝支付 |
| | | resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi"); |
| | | paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据 |
| | | String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5); |
| | | resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi"); |
| | | paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, outTradeNo, 1);//添加预支付数据 |
| | | } |
| | | if (payType == 3) {//余额支付 |
| | | if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) { |
| | |
| | | |
| | | userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); |
| | | |
| | | boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar); |
| | | boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar); |
| | | if (isPrepayFirstStage) { |
| | | handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3); |
| | | return resultUtil; |
| | | } |
| | | |
| | | OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()); |
| | | SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); |
| | | userInfo.setIntegral(userInfo.getIntegral() + (orderMoney.intValue() * query1.getIntegral()));//积分 |
| | | |
| | | |
| | | //添加交易明细 |
| | | transactionDetailsService.saveData(uid, "快车订单", orderMoney, 2, 1, 1, 1, orderId); |
| | | userInfoService.updateById(userInfo); |
| | | |
| | | |
| | | orderPrivateCar.setState(8); |
| | | orderPrivateCar.setPayType(3); |
| | | orderPrivateCar.setPayMoney(orderMoney); |
| | | orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), orderMoney) : orderMoney); |
| | | orderPrivateCar.setPayTime(new Date()); |
| | | |
| | | //处理优惠券和红包 |
| | | if (null != userCouponRecord) { |
| | | userCouponRecord.setState(2); |
| | | userCouponRecord.setEndTime(new Date()); |
| | | userCouponRecordService.updateById(userCouponRecord); |
| | | if (isPrepaySpreadStage) { |
| | | orderPrivateCar.setPrepayStage(5); |
| | | orderPrivateCar.setPrepaySecondPayNo(buildBalancePayNo(1, orderId)); |
| | | } |
| | | if (null != query) { |
| | | query.setState(2); |
| | | query.setEndTime(new Date()); |
| | | userRedPacketRecordService.updateById(query); |
| | | |
| | | if (!isPrepaySpreadStage) { |
| | | consumePrivateCarBenefits(orderPrivateCar); |
| | | } |
| | | //非追缴单才需要添加收入 |
| | | if(0 == orderPrivateCar.getRecoveryOrder()){ |
| | |
| | | } |
| | | if (orderPrivateCar.getState() != 7) { |
| | | return ResultUtil.error("订单不在待支付状态,不允许支付", new ArrayList<>()); |
| | | } |
| | | if (Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) && Integer.valueOf(4).equals(orderPrivateCar.getPrepayStage())) { |
| | | return ResultUtil.error("订单退款处理中,请等待退款完成", new ArrayList<>()); |
| | | } |
| | | |
| | | Integer uid = orderPrivateCar.getUserId(); |
| | |
| | | orderMoney = new BigDecimal(orderMoney).setScale(2, RoundingMode.HALF_UP).doubleValue(); |
| | | System.out.println("!!!" + orderMoney + "!!!!"); |
| | | orderMoney = orderMoney < 0 ? 0 : orderMoney; |
| | | orderPrivateCar.setPayMoney(orderMoney); |
| | | ResultUtil prepaySettleResult = settlePrivateCarPrepayIfNoSecondPay(orderPrivateCar, userInfo, orderMoney); |
| | | if (prepaySettleResult != null) { |
| | | return prepaySettleResult; |
| | | } |
| | | orderMoney = getPrivateCarPrepayFinalPayAmount(orderPrivateCar, orderMoney); |
| | | if (!isPrivateCarPrepaySpreadStage(orderPrivateCar)) { |
| | | orderPrivateCar.setPayMoney(orderMoney); |
| | | } |
| | | if (payType == 1) {//微信支付 |
| | | if (orderMoney == 0) { |
| | | return ResultUtil.error("请使用余额支付"); |
| | | } |
| | | String app = type == 1 ? "APP" : "JSAPI"; |
| | | resultUtil = payMoneyUtil.weixinpay("完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/wxPayOrderTaxi", app, userInfo.getAppletsOpenId()); |
| | | paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 1, orderMoney, "", 1);//添加预支付数据 |
| | | String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5); |
| | | JSONObject response = cbyzxOrderPayHelper.createOrder(orderPrivateCar.getUserId(), userInfo.getAppletsOpenId(), outTradeNo, orderMoney); |
| | | 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, orderId, 1, 1, orderMoney, paymentCode, 1);//添加预支付数据 |
| | | |
| | | //创建定时任务查询订单支付状态 |
| | | ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); |
| | |
| | | if (orderMoney == 0) { |
| | | return ResultUtil.error("请使用余额支付"); |
| | | } |
| | | resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", orderId + "_1_" + UUIDUtil.getRandomCode(5), orderMoney.toString(), "/base/aliPayOrderTaxi"); |
| | | paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, "", 1);//添加预支付数据 |
| | | String outTradeNo = orderId + "_1_" + UUIDUtil.getRandomCode(5); |
| | | resultUtil = payMoneyUtil.alipay("完成订单", "完成订单", "", outTradeNo, orderMoney.toString(), "/base/aliPayOrderTaxi"); |
| | | paymentRecordService.saveData(1, orderPrivateCar.getUserId(), 1, orderId, 1, 2, orderMoney, outTradeNo, 1);//添加预支付数据 |
| | | } |
| | | if (payType == 3) {//余额支付 |
| | | if (userInfo.getBalance() == null || userInfo.getBalance() < orderMoney) { |
| | |
| | | } |
| | | |
| | | userInfo.setBalance(new BigDecimal(userInfo.getBalance()).subtract(new BigDecimal(orderMoney)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); |
| | | |
| | | |
| | | boolean isPrepayFirstStage = isPrivateCarPrepayFirstStage(orderPrivateCar); |
| | | boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar); |
| | | if (isPrepayFirstStage) { |
| | | handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, orderMoney, 3); |
| | | return resultUtil; |
| | | } |
| | | |
| | | OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()); |
| | | SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); |
| | | if (null != query1) { |
| | |
| | | |
| | | orderPrivateCar.setState(8); |
| | | orderPrivateCar.setPayType(3); |
| | | orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), orderMoney) : orderMoney); |
| | | orderPrivateCar.setPayTime(new Date()); |
| | | |
| | | //处理优惠券和红包 |
| | | if (null != userCouponRecord) { |
| | | userCouponRecord.setState(2); |
| | | userCouponRecord.setEndTime(new Date()); |
| | | userCouponRecordService.updateById(userCouponRecord); |
| | | if (isPrepaySpreadStage) { |
| | | orderPrivateCar.setPrepayStage(5); |
| | | orderPrivateCar.setPrepaySecondPayNo(buildBalancePayNo(1, orderId)); |
| | | } |
| | | //处理打车卡 |
| | | if (null != userTaxiCard) { |
| | | userTaxiCardService.updateById(userTaxiCard); |
| | | } |
| | | if (null != query) { |
| | | query.setState(2); |
| | | query.setEndTime(new Date()); |
| | | userRedPacketRecordService.updateById(query); |
| | | |
| | | if (!isPrepaySpreadStage) { |
| | | consumePrivateCarBenefits(orderPrivateCar); |
| | | } |
| | | //非追缴单才添加收入记录 |
| | | if(0 == orderPrivateCar.getRecoveryOrder()){ |
| | |
| | | System.err.println("预支付数据异常(orderId = " + id + ")"); |
| | | } |
| | | } |
| | | |
| | | private boolean isPrivateCarPrepayFirstStage(OrderPrivateCar orderPrivateCar) { |
| | | return orderPrivateCar != null |
| | | && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) |
| | | && Integer.valueOf(1).equals(orderPrivateCar.getPrepayStage()); |
| | | } |
| | | |
| | | private boolean isPrivateCarPrepaySpreadStage(OrderPrivateCar orderPrivateCar) { |
| | | return orderPrivateCar != null |
| | | && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) |
| | | && Integer.valueOf(3).equals(orderPrivateCar.getPrepayStage()); |
| | | } |
| | | |
| | | private String buildBalancePayNo(Integer orderType, Integer orderId) { |
| | | return "BAL_" + orderType + "_" + orderId + "_" + System.currentTimeMillis(); |
| | | } |
| | | |
| | | private Double appendPayMoney(Double source, Double amount) { |
| | | return new BigDecimal(source == null ? 0D : source) |
| | | .add(new BigDecimal(amount == null ? 0D : amount)) |
| | | .setScale(2, BigDecimal.ROUND_HALF_EVEN) |
| | | .doubleValue(); |
| | | } |
| | | |
| | | private boolean isPrivateCarPrepayFinalStage(OrderPrivateCar orderPrivateCar) { |
| | | return orderPrivateCar != null |
| | | && Integer.valueOf(7).equals(orderPrivateCar.getState()); |
| | | } |
| | | |
| | | private BigDecimal toMoney(Double amount) { |
| | | return new BigDecimal(String.valueOf(amount == null ? 0D : amount)).setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private PaymentRecord getPrivateCarPrepayPaidRecord(OrderPrivateCar orderPrivateCar) throws Exception { |
| | | PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2); |
| | | if (paymentRecord == null) { |
| | | paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, null, 2); |
| | | } |
| | | if (paymentRecord == null) { |
| | | paymentRecord = paymentRecordService.query(1, null, null, orderPrivateCar.getId(), 1, null, 2); |
| | | } |
| | | if (paymentRecord != null && orderPrivateCar.getPayType() == null) { |
| | | orderPrivateCar.setPayType(paymentRecord.getPayType()); |
| | | } |
| | | return paymentRecord; |
| | | } |
| | | |
| | | private BigDecimal getPrivateCarPrepayPaidAmount(OrderPrivateCar orderPrivateCar) throws Exception { |
| | | PaymentRecord paymentRecord = getPrivateCarPrepayPaidRecord(orderPrivateCar); |
| | | if (paymentRecord != null && paymentRecord.getAmount() != null && paymentRecord.getAmount() > 0) { |
| | | return toMoney(paymentRecord.getAmount()); |
| | | } |
| | | if ((Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()) || (orderPrivateCar.getPrepayStage() != null && orderPrivateCar.getPrepayStage() > 0)) |
| | | && orderPrivateCar.getPayMoney() != null && orderPrivateCar.getPayMoney() > 0) { |
| | | return toMoney(orderPrivateCar.getPayMoney()); |
| | | } |
| | | return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP); |
| | | } |
| | | |
| | | private Double getPrivateCarPrepayFinalPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) throws Exception { |
| | | if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) { |
| | | return toMoney(finalAmount).doubleValue(); |
| | | } |
| | | BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar); |
| | | if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return toMoney(finalAmount).doubleValue(); |
| | | } |
| | | BigDecimal spreadAmount = toMoney(finalAmount).subtract(paidAmount).setScale(2, RoundingMode.HALF_UP); |
| | | if (spreadAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | orderPrivateCar.setPrepayStage(3); |
| | | return spreadAmount.doubleValue(); |
| | | } |
| | | return 0D; |
| | | } |
| | | |
| | | private Double getPrivateCarPrepayDisplayPayAmount(OrderPrivateCar orderPrivateCar, Double finalAmount) { |
| | | if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) { |
| | | return toMoney(finalAmount).doubleValue(); |
| | | } |
| | | try { |
| | | BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar); |
| | | if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return toMoney(finalAmount).doubleValue(); |
| | | } |
| | | BigDecimal displayAmount = toMoney(finalAmount).subtract(paidAmount).setScale(2, RoundingMode.HALF_UP); |
| | | return displayAmount.compareTo(BigDecimal.ZERO) > 0 ? displayAmount.doubleValue() : 0D; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | return toMoney(finalAmount).doubleValue(); |
| | | } |
| | | } |
| | | |
| | | private void fillPrivateCarPrepayDisplayMoney(OrderPrivateCar orderPrivateCar, Map<String, Object> map) { |
| | | if (map == null || orderPrivateCar == null || !isPrivateCarPrepayFinalStage(orderPrivateCar)) { |
| | | return; |
| | | } |
| | | Double finalAmount = null != map.get("orderMoney") ? Double.valueOf(String.valueOf(map.get("orderMoney"))) : orderPrivateCar.getOrderMoney(); |
| | | Double displayAmount = getPrivateCarPrepayDisplayPayAmount(orderPrivateCar, finalAmount); |
| | | map.put("orderMoney", displayAmount); |
| | | map.put("payMoney", displayAmount); |
| | | } |
| | | |
| | | private ResultUtil settlePrivateCarPrepayIfNoSecondPay(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double finalAmount) throws Exception { |
| | | if (!isPrivateCarPrepayFinalStage(orderPrivateCar)) { |
| | | return null; |
| | | } |
| | | BigDecimal paidAmount = getPrivateCarPrepayPaidAmount(orderPrivateCar); |
| | | if (paidAmount.compareTo(BigDecimal.ZERO) <= 0) { |
| | | return null; |
| | | } |
| | | BigDecimal settleAmount = toMoney(finalAmount); |
| | | BigDecimal refundAmount = paidAmount.subtract(settleAmount).setScale(2, RoundingMode.HALF_UP); |
| | | if (refundAmount.compareTo(BigDecimal.ZERO) < 0) { |
| | | return null; |
| | | } |
| | | if (refundAmount.compareTo(BigDecimal.ZERO) > 0) { |
| | | ResultUtil refundResult = refundPrivateCarPrepayDifference(orderPrivateCar, userInfo, refundAmount.doubleValue()); |
| | | if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) { |
| | | return refundResult; |
| | | } |
| | | } |
| | | finishPrivateCarPrepayOrder(orderPrivateCar, settleAmount.doubleValue()); |
| | | return ResultUtil.success(); |
| | | } |
| | | |
| | | private ResultUtil refundPrivateCarPrepayDifference(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double refundAmount) throws Exception { |
| | | if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) { |
| | | userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0D) |
| | | .add(toMoney(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); |
| | | userInfoService.updateById(userInfo); |
| | | orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5)); |
| | | orderPrivateCar.setPrepayRefundAmount(refundAmount); |
| | | orderPrivateCar.setPrepayRefundTime(new Date()); |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); |
| | | return ResultUtil.success(); |
| | | } |
| | | |
| | | PaymentRecord paymentRecord = getPrivateCarPrepayPaidRecord(orderPrivateCar); |
| | | if (paymentRecord == null) { |
| | | return ResultUtil.error("先付订单缺少已支付流水,无法退款"); |
| | | } |
| | | if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) { |
| | | CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest(); |
| | | request.setOutRequestNo(ToolUtil.isNotEmpty(orderPrivateCar.getPrepaySecondPayNo()) ? orderPrivateCar.getPrepaySecondPayNo() : paymentRecord.getCode()); |
| | | request.setRefundOutRequestNo("PREPAY_DIFF_REFUND_1_" + orderPrivateCar.getId() + ToolUtil.getRandomString(5)); |
| | | request.setRefundAmount(toFen(refundAmount)); |
| | | request.setRefundDesc("快车先付订单多退少补退款"); |
| | | JSONObject response = CbyzxPayUtil.closePayOrder(request); |
| | | if (!isPrivateCarPrepayRefundSuccess(response)) { |
| | | return ResultUtil.error(extractPrivateCarRefundMessage(response), response); |
| | | } |
| | | orderPrivateCar.setPrepayRefundNo(extractPrivateCarRefundNo(response)); |
| | | orderPrivateCar.setPrepayRefundAmount(refundAmount); |
| | | orderPrivateCar.setPrepayRefundTime(new Date()); |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); |
| | | return ResultUtil.success(response); |
| | | } |
| | | if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) { |
| | | Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundAmount.toString()); |
| | | if (!"10000".equals(map.get("code"))) { |
| | | return ResultUtil.error(map.get("msg")); |
| | | } |
| | | orderPrivateCar.setPrepayRefundNo(map.get("trade_no")); |
| | | orderPrivateCar.setPrepayRefundAmount(refundAmount); |
| | | orderPrivateCar.setPrepayRefundTime(new Date()); |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车先付订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); |
| | | return ResultUtil.success(map); |
| | | } |
| | | return ResultUtil.error("先付订单支付方式不支持退款"); |
| | | } |
| | | |
| | | private void finishPrivateCarPrepayOrder(OrderPrivateCar orderPrivateCar, Double settleAmount) throws Exception { |
| | | orderPrivateCar.setState(8); |
| | | orderPrivateCar.setPayMoney(settleAmount); |
| | | orderPrivateCar.setPayTime(new Date()); |
| | | orderPrivateCar.setPrepayStage(5); |
| | | if (orderPrivateCar.getRecoveryOrder() != null && 0 == orderPrivateCar.getRecoveryOrder()) { |
| | | Double incomeAmount = (2 == orderPrivateCar.getAbnormal() && 2 == orderPrivateCar.getAbnormalStatus() |
| | | ? orderPrivateCar.getResponsibilityMoney().doubleValue() : orderPrivateCar.getOrderMoney()); |
| | | Map<String, Object> map = incomeService.saveIncome(orderPrivateCar.getId(), 1, incomeAmount); |
| | | orderPrivateCar.setSplitAllocation(JSON.toJSONString(map)); |
| | | } |
| | | this.updateAllColumnById(orderPrivateCar); |
| | | promotion(orderPrivateCar.getId()); |
| | | new Thread(new Runnable() { |
| | | @Override |
| | | public void run() { |
| | | pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); |
| | | pushUtil.pushOrderState(2, orderPrivateCar.getDriverId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); |
| | | } |
| | | }).start(); |
| | | systemNoticeService.addSystemNotice(1, "您的快车先付订单已完成结算,请注意查收。", orderPrivateCar.getUserId(), 1); |
| | | } |
| | | |
| | | private void consumePrivateCarBenefits(OrderPrivateCar orderPrivateCar) throws Exception { |
| | | if (null != orderPrivateCar.getCouponId()) { |
| | | UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId()); |
| | | if (userCouponRecord != null) { |
| | | userCouponRecord.setState(2); |
| | | userCouponRecord.setEndTime(new Date()); |
| | | 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()); |
| | | jsonObject.put("time", jsonObject.getInteger("time") - 1); |
| | | userTaxiCard.setContent(jsonObject.toJSONString()); |
| | | userTaxiCardService.updateById(userTaxiCard); |
| | | } |
| | | } |
| | | if (null != orderPrivateCar.getRedPacketId()) { |
| | | UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId()); |
| | | if (userRedPacketRecord != null) { |
| | | userRedPacketRecord.setState(2); |
| | | userRedPacketRecord.setEndTime(new Date()); |
| | | userRedPacketRecordService.updateById(userRedPacketRecord); |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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+ToolUtil.getRandomString(5); |
| | | } |
| | | |
| | | private boolean isPrivateCarPrepayMode(OrderPrivateCar orderPrivateCar) { |
| | | return orderPrivateCar != null && Integer.valueOf(1).equals(orderPrivateCar.getPaymentMode()); |
| | | } |
| | | |
| | | private void handlePrivateCarPrepayCancelRefund(OrderPrivateCar orderPrivateCar, String reason) throws Exception { |
| | | if (!isPrivateCarPrepayMode(orderPrivateCar)) { |
| | | return; |
| | | } |
| | | if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) { |
| | | Double refundAmount = orderPrivateCar.getPayMoney(); |
| | | if (refundAmount == null || refundAmount <= 0) { |
| | | throw new RuntimeException("余额先付订单退款金额异常"); |
| | | } |
| | | UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId()); |
| | | if (userInfo == null) { |
| | | throw new RuntimeException("用户信息不存在,无法退款"); |
| | | } |
| | | userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0) |
| | | .add(new BigDecimal(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); |
| | | userInfoService.updateById(userInfo); |
| | | restorePrivateCarBenefits(orderPrivateCar); |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); |
| | | orderPrivateCar.setState(10); |
| | | orderPrivateCar.setPrepayStage(5); |
| | | orderPrivateCar.setPrepayRefundNo("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5)); |
| | | orderPrivateCar.setPrepayRefundAmount(refundAmount); |
| | | orderPrivateCar.setPrepayRefundTime(new Date()); |
| | | this.updateById(orderPrivateCar); |
| | | systemNoticeService.addSystemNotice(1, "您的快车余额先付订单已取消,退款已退回账户余额,请注意查收。", orderPrivateCar.getUserId(), 1); |
| | | } else if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())){ |
| | | String outRequestNo = orderPrivateCar.getPrepaySecondPayNo(); |
| | | if (ToolUtil.isEmpty(outRequestNo)) { |
| | | throw new RuntimeException("微信先付订单缺少支付单号,无法关闭支付单"); |
| | | } |
| | | Double refundAmount = orderPrivateCar.getPayMoney(); |
| | | if (refundAmount == null || refundAmount <= 0) { |
| | | throw new RuntimeException("微信先付订单退款金额异常"); |
| | | } |
| | | 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)) { |
| | | throw new RuntimeException(extractPrivateCarRefundMessage(response)); |
| | | } |
| | | restorePrivateCarBenefits(orderPrivateCar); |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车取消订单退款", refundAmount, 1, 1, 1, 1, orderPrivateCar.getId()); |
| | | systemNoticeService.addSystemNotice(1, "您的快车微信先付订单已取消,退款已原路退回,请注意查收。", orderPrivateCar.getUserId(), 1); |
| | | } |
| | | } |
| | | |
| | | private ResultUtil handlePrivateCarPrepayCancelRefund(OrderPrivateCar orderPrivateCar, String reason, String remark, Integer uid) throws Exception { |
| | | System.out.println("快车退款!!!!"); |
| | | if (!isPrivateCarPrepayMode(orderPrivateCar)) { |
| | | return null; |
| | | } |
| | | if (Integer.valueOf(3).equals(orderPrivateCar.getPayType())) { |
| | | Double refundAmount = orderPrivateCar.getPayMoney(); |
| | | System.out.println("快车余额退款金额!!!!"+ refundAmount); |
| | | if (refundAmount == null || refundAmount <= 0) { |
| | | return ResultUtil.error("余额先付订单退款金额异常"); |
| | | } |
| | | UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId()); |
| | | if (userInfo == null) { |
| | | return ResultUtil.error("用户信息不存在,无法退款"); |
| | | } |
| | | userInfo.setBalance(new BigDecimal(null != userInfo.getBalance() ? userInfo.getBalance() : 0) |
| | | .add(new BigDecimal(refundAmount)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); |
| | | userInfoService.updateById(userInfo); |
| | | 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("BALANCE_REFUND_1_" + orderPrivateCar.getId() + "_" + ToolUtil.getRandomString(5)); |
| | | 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() + 600000)); |
| | | } |
| | | } |
| | | System.out.println("余额退款通知940"); |
| | | systemNoticeService.addSystemNotice(1, "您的快车余额先付订单已取消,退款已退回账户余额,请注意查收。", orderPrivateCar.getUserId(), 1); |
| | | return ResultUtil.success(); |
| | | } |
| | | 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()); |
| | | for (int i = 0; i < jsonArray.size(); i++) { |
| | | JSONObject jsonObject = jsonArray.getJSONObject(i); |
| | | Integer serverCarModelId = jsonObject.getInteger("serverCarModelId"); |
| | | Integer rideType = jsonObject.getInteger("rideType"); |
| | | if (serverCarModelId != null && serverCarModelId == 0) { |
| | | OrderTaxi orderTaxi = new OrderTaxi(); |
| | | orderTaxi.setId(orderPrivateCar.getId()); |
| | | orderTaxi.setState(1); |
| | | orderTaxi.setUserId(orderPrivateCar.getUserId()); |
| | | orderTaxi.setStartLon(orderPrivateCar.getStartLon()); |
| | | orderTaxi.setStartLat(orderPrivateCar.getStartLat()); |
| | | orderTaxiService.pushOrder(orderTaxi, 3); |
| | | continue; |
| | | } |
| | | OrderPrivateCar pushOrder = new OrderPrivateCar(); |
| | | BeanUtils.copyProperties(orderPrivateCar, pushOrder); |
| | | pushOrder.setRideType(rideType); |
| | | pushOrder.setServerCarModelId(serverCarModelId); |
| | | this.pushOrder(pushOrder); |
| | | } |
| | | return; |
| | | } |
| | | if (Integer.valueOf(3).equals(orderPrivateCar.getRideType())) { |
| | | this.pushOrderPrivateCar(orderPrivateCar.getId()); |
| | | return; |
| | | } |
| | | this.pushOrder(orderPrivateCar); |
| | | } |
| | | |
| | | private void handlePrivateCarPrepayFirstPaid(OrderPrivateCar orderPrivateCar, UserInfo userInfo, Double payAmount, Integer payType) throws Exception { |
| | | OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()); |
| | | SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); |
| | | System.out.println("快车预付回调-------057,"+query1); |
| | | if (null != query1) { |
| | | userInfo.setIntegral(userInfo.getIntegral() + (payAmount.intValue() * query1.getIntegral())); |
| | | } |
| | | userInfoService.updateById(userInfo); |
| | | |
| | | consumePrivateCarBenefits(orderPrivateCar); |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车订单", payAmount, 2, 1, 1, 1, orderPrivateCar.getId()); |
| | | |
| | | orderPrivateCar.setState(1); |
| | | orderPrivateCar.setPayType(payType); |
| | | orderPrivateCar.setPayMoney(payAmount); |
| | | orderPrivateCar.setPayTime(new Date()); |
| | | orderPrivateCar.setPrepayStage(2); |
| | | this.updateAllColumnById(orderPrivateCar); |
| | | |
| | | pushUtil.pushOrderState(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, orderPrivateCar.getState(), 0); |
| | | systemNoticeService.addSystemNotice(1, "您的快车订单已支付成功,我们正在为您指派司机,请稍后!", orderPrivateCar.getUserId(), 1); |
| | | dispatchPrepayPrivateCarOrder(orderPrivateCar); |
| | | } |
| | | |
| | | @Override |
| | | public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type) throws Exception { |
| | | public void payOrderPrivateCarCallback(Integer id, String order_id, Integer type, String outTradeNo) throws Exception { |
| | | OrderPrivateCar orderPrivateCar = this.selectById(id); |
| | | PaymentRecord query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1); |
| | | PaymentRecord query = ToolUtil.isNotEmpty(outTradeNo) ? paymentRecordService.queryByCode(outTradeNo, 1) : null; |
| | | if (query == null) { |
| | | query = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, Integer.valueOf(id), 1, type, 1); |
| | | } |
| | | System.out.println("快车预付回调-------084,"+query); |
| | | if (null != query && query.getState() == 1) { |
| | | UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId()); |
| | | query.setState(2); |
| | | query.setCode(order_id); |
| | | paymentRecordService.updateById(query); |
| | | System.out.println("快车预付回调-------090"); |
| | | if (isPrivateCarPrepayFirstStage(orderPrivateCar)) { |
| | | orderPrivateCar.setPrepaySecondPayNo(outTradeNo); |
| | | handlePrivateCarPrepayFirstPaid(orderPrivateCar, userInfo, query.getAmount(), type); |
| | | return; |
| | | } |
| | | |
| | | //添加交易明细 |
| | | transactionDetailsService.saveData(orderPrivateCar.getUserId(), "快车订单", query.getAmount(), 2, 1, 1, 1, query.getOrderId()); |
| | | orderPrivateCar.setState(8); |
| | | orderPrivateCar.setPayType(type); |
| | | orderPrivateCar.setPayMoney(query.getAmount()); |
| | | boolean isPrepaySpreadStage = isPrivateCarPrepaySpreadStage(orderPrivateCar); |
| | | orderPrivateCar.setPayMoney(isPrepaySpreadStage ? appendPayMoney(orderPrivateCar.getPayMoney(), query.getAmount()) : query.getAmount()); |
| | | orderPrivateCar.setPayTime(new Date()); |
| | | |
| | | UserInfo userInfo = userInfoService.selectById(orderPrivateCar.getUserId()); |
| | | if (isPrepaySpreadStage) { |
| | | orderPrivateCar.setPrepayStage(5); |
| | | orderPrivateCar.setPrepaySecondPayNo(order_id); |
| | | } |
| | | |
| | | OpenCity openCity = openCityService.openCity1(orderPrivateCar.getStartLon().toString(), orderPrivateCar.getStartLat().toString()); |
| | | SysIntegral query1 = sysIntegralMapper.query(openCity.getId()); |
| | | if(null != query1){ |
| | | userInfo.setIntegral(userInfo.getIntegral() + (query.getAmount().intValue() * query1.getIntegral()));//积分 |
| | | userInfoService.updateById(userInfo); |
| | | } |
| | | |
| | | //处理优惠券和红包 |
| | | if (null != orderPrivateCar.getCouponId()) { |
| | | UserCouponRecord userCouponRecord = userCouponRecordService.selectById(orderPrivateCar.getCouponId()); |
| | | userCouponRecord.setState(2); |
| | | userCouponRecord.setEndTime(new Date()); |
| | | userCouponRecordService.updateById(userCouponRecord); |
| | | |
| | | if (!isPrepaySpreadStage) { |
| | | consumePrivateCarBenefits(orderPrivateCar); |
| | | } |
| | | if (null != orderPrivateCar.getUserTaxiCardId()) { |
| | | UserTaxiCard userTaxiCard = userTaxiCardService.selectById(orderPrivateCar.getUserTaxiCardId()); |
| | | if (userTaxiCard.getType() == 1 || userTaxiCard.getType() == 3) { |
| | | JSONObject jsonObject = JSON.parseObject(userTaxiCard.getContent()); |
| | | jsonObject.put("time", jsonObject.getInteger("time") - 1); |
| | | userTaxiCard.setContent(jsonObject.toJSONString()); |
| | | userTaxiCardService.updateById(userTaxiCard); |
| | | } |
| | | } |
| | | if (null != orderPrivateCar.getRedPacketId()) { |
| | | UserRedPacketRecord userRedPacketRecord = userRedPacketRecordService.selectById(orderPrivateCar.getRedPacketId()); |
| | | userRedPacketRecord.setState(2); |
| | | userRedPacketRecord.setEndTime(new Date()); |
| | | userRedPacketRecordService.updateById(userRedPacketRecord); |
| | | } |
| | | |
| | | |
| | | query.setState(2); |
| | | query.setCode(order_id); |
| | | paymentRecordService.updateById(query); |
| | | |
| | | //非追缴单才需要记录收入 |
| | | if(null != orderPrivateCar.getRecoveryOrder() && 0 == orderPrivateCar.getRecoveryOrder()){ |
| | |
| | | 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"); |
| | |
| | | vo.setDriverInfoWarpper(driverInfoWarpper); |
| | | //其余信息 |
| | | BeanUtils.copyProperties(order, vo); |
| | | vo.setPayMoney(getPrivateCarPrepayDisplayPayAmount(order, order.getOrderMoney())); |
| | | unPayOrderVOList.add(vo); |
| | | } |
| | | |
| | |
| | | } |
| | | int finalI = i; |
| | | PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null); |
| | | System.out.println("pushOrder:" + pushOrder); |
| | | System.out.println("pushOrder2:" + pushOrder); |
| | | if (orderPrivateCar.getState() > 1) { |
| | | push = true; |
| | | break; |
| | |
| | | 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()); |
| | | } |
| | |
| | | @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());//添加记录,防止调用接口重复提醒无人接单 |
| | |
| | | // 判断是否为派单模式 |
| | | 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) { |
| | |
| | | |
| | | }else { |
| | | // 没找到车辆 |
| | | orderPrivateCar.setState(10); |
| | | orderPrivateCarMapper.updateById(orderPrivateCar); |
| | | pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 1); |
| | | |
| | | // TODO 退款 |
| | | Thread.sleep(5000); |
| | | ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, "无司机接单", "无司机接单", orderPrivateCar.getUserId()); |
| | | if (refundResult == null) { |
| | | orderPrivateCar.setState(10); |
| | | orderPrivateCarMapper.updateById(orderPrivateCar); |
| | | } |
| | | pushUtil.pushEndPush(1, orderPrivateCar.getUserId(), orderPrivateCar.getId(), 1, 10); |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | }else { |
| | | System.out.println( "推单模式"); |
| | | |
| | | List<PushOrder> querys = pushOrderService.querys(null, 1, openCity.getId());//获取需要推送的次数 |
| | | for (int i = 1; i <= querys.size() + 15; i++) { |
| | |
| | | } |
| | | int finalI = i; |
| | | PushOrder pushOrder = querys.stream().filter(s -> s.getType() == (finalI <= 3 ? finalI : 3)).findFirst().orElse(null); |
| | | System.out.println("pushOrder:" + pushOrder); |
| | | System.out.println("pushOrder1:" + pushOrder); |
| | | int i2 = pushOrder.getPushTime() / 10; |
| | | if (i2 == 0) { |
| | | i2 = 1; |
| | |
| | | } |
| | | //获取空闲司机 |
| | | 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();//计算占比转成整数(下标截取) |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |