| | |
| | | import com.stylefeng.guns.modular.system.util.*; |
| | | import com.stylefeng.guns.modular.taxi.model.OrderTaxi; |
| | | import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.beans.factory.annotation.Value; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | |
| | | import java.math.RoundingMode; |
| | | import java.util.*; |
| | | |
| | | |
| | | @Slf4j |
| | | @Service |
| | | public class OrderPrivateCarServiceImpl extends ServiceImpl<OrderPrivateCarMapper, OrderPrivateCar> implements IOrderPrivateCarService { |
| | | |
| | |
| | | return; |
| | | } |
| | | |
| | | PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2); |
| | | if (paymentRecord == null || ToolUtil.isEmpty(paymentRecord.getCode())) { |
| | | System.err.println("预支付退款数据异常(privateCarOrderId = " + orderPrivateCar.getId() + ")"); |
| | | return; |
| | | } |
| | | |
| | | if (Integer.valueOf(1).equals(orderPrivateCar.getPayType())) { |
| | | Map<String, String> map = payMoneyUtil.wxRefund(paymentRecord.getCode(), refundNo, paymentRecord.getAmount().toString(), refundMoney.toString(), "/base/prepayRefundWXPay"); |
| | | if (!"SUCCESS".equals(map.get("return_code"))) { |
| | | System.err.println("专车预支付退款申请失败:" + map.get("return_msg")); |
| | | String outRequestNo = orderPrivateCar.getPrepaySecondPayNo(); |
| | | if (ToolUtil.isEmpty(outRequestNo)) { |
| | | System.err.println("快车微信先付订单缺少支付单号,无法关闭支付单(privateCarOrderId = " + orderPrivateCar.getId() + ")"); |
| | | return; |
| | | } |
| | | CbyzxPayUtil.ClosePayOrderRequest request = new CbyzxPayUtil.ClosePayOrderRequest(); |
| | | request.setOutRequestNo(outRequestNo); |
| | | request.setRefundOutRequestNo(refundNo); |
| | | request.setRefundAmount(toFen(refundMoney)); |
| | | request.setRefundDesc("快车预支付多退退款"); |
| | | JSONObject response = CbyzxPayUtil.closePayOrder(request); |
| | | if (isPrepayRefundSuccess(response)) { |
| | | String responseRefundNo = extractPrepayRefundNo(response); |
| | | if (ToolUtil.isNotEmpty(responseRefundNo)) { |
| | | orderPrivateCar.setPrepayRefundNo(responseRefundNo); |
| | | } |
| | | finishPrepaidOrder(orderPrivateCar); |
| | | } else { |
| | | System.err.println("快车微信先付退款申请失败:" + extractPrepayRefundMessage(response)); |
| | | } |
| | | return; |
| | | } |
| | | |
| | | if (Integer.valueOf(2).equals(orderPrivateCar.getPayType())) { |
| | | PaymentRecord paymentRecord = paymentRecordService.query(1, orderPrivateCar.getUserId(), 1, orderPrivateCar.getId(), 1, orderPrivateCar.getPayType(), 2); |
| | | if (paymentRecord == null || ToolUtil.isEmpty(paymentRecord.getCode())) { |
| | | System.err.println("预支付退款数据异常(privateCarOrderId = " + orderPrivateCar.getId() + ")"); |
| | | return; |
| | | } |
| | | try { |
| | | Map<String, String> map = payMoneyUtil.aliRefund(paymentRecord.getCode(), refundMoney.toString()); |
| | | if ("10000".equals(map.get("code"))) { |
| | |
| | | |
| | | private String buildPrepayRefundNo(Integer orderType, Integer orderId) { |
| | | return "PRF_" + orderType + "_" + orderId + "_" + System.currentTimeMillis(); |
| | | } |
| | | |
| | | private Integer toFen(Double amount) { |
| | | return new BigDecimal(String.valueOf(amount)).multiply(new BigDecimal("100")).setScale(0, RoundingMode.HALF_UP).intValue(); |
| | | } |
| | | |
| | | private boolean isPrepayRefundSuccess(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 extractPrepayRefundNo(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 extractPrepayRefundMessage(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 Double formatMoney(Double money) { |
| | |
| | | double estimateMileage = (null == orderPrivateCar.getEstimateMileage() ? 0D : orderPrivateCar.getEstimateMileage()); |
| | | System.out.println("预估里程数"+estimateMileage); |
| | | //在价格区间按照一口价算,不在区间按实时价格算 |
| | | if(d<estimateMileage+contentPrice.getDouble("num29")*1000 && d>estimateMileage-contentPrice.getDouble("num32")*1000){ |
| | | double exceedMileageInner = Optional.ofNullable(query1.get("exceedMileageInner")).map(Object::toString).map(Double::parseDouble).orElse(0d); |
| | | double belowMileageInner = Optional.ofNullable(query1.get("belowMileageInner")).map(Object::toString).map(Double::parseDouble).orElse(0d); |
| | | if(d<estimateMileage+exceedMileageInner*1000 && d>estimateMileage-belowMileageInner*1000) { |
| | | System.out.println("在区间==============="); |
| | | orderPrivateCar = calculationPrice1(orderPrivateCar,contentPrice,jsonObject.getLongValue("num1"),jsonObject.getDouble("num2"),parkingFee,crossingFee); |
| | | orderPrivateCar = calculationPrice(orderPrivateCar,contentPrice,jsonObject.getLongValue("num1"),jsonObject.getDouble("num2"),parkingFee,crossingFee); |
| | | System.out.println("返回订单数据"+orderPrivateCar); |
| | | }else{ |
| | | System.out.println("不在区间===================="); |