yanderong
2026-07-14 bef6b492f8a67db0630662df5af9d69b47b00475
feat: 出租车改为线上支付
3个文件已修改
265 ■■■■■ 已修改文件
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/OrderServiceImpl.java
@@ -1304,7 +1304,7 @@
            case 1:
                return orderPrivateCarService.queryMoneyInfo(orderId);
            case 2:
                break;
                return orderTaxiService.queryMoneyInfo(orderId);
        }
        return null;
    }
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/IOrderTaxiService.java
@@ -174,4 +174,12 @@
     * @throws Exception
     */
    List<OrderTaxi> taskMidAxbUnBindSend() throws Exception;
    /**
     * 获取订单费用明细
     * @param orderId
     * @return
     * @throws Exception
     */
    Map<String, Object> queryMoneyInfo(Integer orderId) throws Exception;
}
DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -9,6 +9,8 @@
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.specialTrain.model.OrderPrivateCar;
import com.stylefeng.guns.modular.specialTrain.server.IOrderPrivateCarService;
import com.stylefeng.guns.modular.system.dao.ServerCarModelMapper;
import com.stylefeng.guns.modular.system.dao.SystemPriceMapper;
import com.stylefeng.guns.modular.system.dao.UserInfoMapper;
import com.stylefeng.guns.modular.system.model.*;
import com.stylefeng.guns.modular.system.service.*;
@@ -16,6 +18,7 @@
import com.stylefeng.guns.modular.taxi.dao.OrderTaxiMapper;
import com.stylefeng.guns.modular.taxi.model.OrderTaxi;
import com.stylefeng.guns.modular.taxi.service.IOrderTaxiService;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpEntity;
@@ -102,8 +105,20 @@
    @Resource
    private RestTemplate internalRestTemplate;
    @Autowired
    private IAdditionalFeeService additionalFeeService;
    @Autowired
    private GDMapElectricFenceUtil gdMapElectricFenceUtil;
    @Resource
    private ISystemPriceCityService systemPriceCityService;
    @Resource
    private SystemPriceMapper systemPriceMapper;
    @Resource
    private ServerCarModelMapper serverCarModelMapper;
    /**
@@ -1183,4 +1198,244 @@
        orderTaxi.setOrderMoney(sum.setScale(2, BigDecimal.ROUND_DOWN).doubleValue());
        return orderTaxi;
    }
    /**
     * 获取订单费用明细
     * @param orderId
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> queryMoneyInfo(Integer orderId) throws Exception {
        OrderTaxi orderTaxi = this.selectById(orderId);
        // 实时计算费用
        setMoney(orderTaxi);
        Map<String, Object> map = new HashMap<>();
        map.put("orderMoney", orderTaxi.getOrderMoney()==null?BigDecimal.ZERO:new BigDecimal(orderTaxi.getOrderMoney().toString()).setScale(2,RoundingMode.HALF_UP));//订单金额
        map.put("travelMoney", orderTaxi.getTravelMoney());// 行程费
        map.put("startMileage", 0);//起步价
        map.put("startMoney", 0);//起步价
        map.put("mileageKilometers", 0);//里程费
        map.put("mileageMoney", 0);//里程费
        map.put("duration", 0);//时长费
        map.put("durationMoney", 0);//时长费
        map.put("wait", 0);//等待费
        map.put("waitMoney", 0);//等待费
        map.put("longDistance", 0);//远途费
        map.put("longDistanceMoney", 0);//远途费
        map.put("parkMoney", orderTaxi.getParkMoney());//停车费
        map.put("roadTollMoney", orderTaxi.getRoadTollMoney());//过路费
        map.put("redPacketMoney", orderTaxi.getRedPacketMoney());//红包抵扣金额
        map.put("couponMoney", orderTaxi.getCouponMoney());//优惠券抵扣金额
        map.put("discountMoney", orderTaxi.getDiscountMoney());//折扣抵扣金额
        map.put("discount", orderTaxi.getDiscount());//折扣
        map.put("holidayFee", orderTaxi.getHolidayFee());//节假日费
        List<OrderAdditionalFee> orderAdditionalFees = orderAdditionalFeeService.selectList(new EntityWrapper<OrderAdditionalFee>().eq("orderType", 2).eq("orderId", orderId));
        List<Map<String, Object>> list = new ArrayList<>();
        orderAdditionalFees.forEach(orderAdditionalFee -> {
            AdditionalFee additionalFee = additionalFeeService.selectById(orderAdditionalFee.getAdditionalFeeId());
            Map<String, Object> map1 = new HashMap<>();
            map1.put("name", additionalFee.getName());
            map1.put("amount", orderAdditionalFee.getAmount());
            list.add(map1);
        });
        map.put("additionalFee", list);
        return map;
    }
    public void setMoney(OrderTaxi orderTaxi) {
        try {
            Map<String, String> startGeocode = gdMapGeocodingUtil.geocode(String.valueOf(orderTaxi.getStartLon()), String.valueOf(orderTaxi.getStartLat()));
            if (orderTaxi.getEndLon() != null && orderTaxi.getEndLat() != null && startGeocode != null) {
                Map<String, String> distance = gdMapElectricFenceUtil.getDistance(
                        orderTaxi.getStartLon() + "," + orderTaxi.getStartLat(),
                        orderTaxi.getEndLon() + "," + orderTaxi.getEndLat(),
                        1
                );
                if (distance != null) {
                    double distanceMeters = Double.parseDouble(distance.get("distance"));
                    long durationSeconds = Long.parseLong(distance.get("duration"));
                    Map<String, Object> textPriceMap = getTextPrice(distanceMeters, durationSeconds, 0, 2, startGeocode);
                    if (textPriceMap != null && textPriceMap.get("zongfeiyong") != null) {
                        Double estimateAmount = Double.valueOf(textPriceMap.get("zongfeiyong").toString());
                        orderTaxi.setEstimateAmount(estimateAmount);
                        orderTaxi.setOrderMoney(estimateAmount);
                        orderTaxi.setPaymentMode(1);
                        orderTaxi.setState(7);
                    } else {
                        orderTaxi.setPaymentMode(2);
                    }
                } else {
                    orderTaxi.setPaymentMode(2);
                }
            } else {
                orderTaxi.setPaymentMode(2);
            }
        } catch (Exception e) {
            orderTaxi.setPaymentMode(2);
            orderTaxi.setState(1);
        }
    }
    public Map<String, Object> getTextPrice(double distance, long duration, long wait, Integer type, Map<String, String> geocode) throws Exception {
        String provinceCode = geocode.get("provinceCode");
        String cityCode = geocode.get("cityCode");
        String districtCode = geocode.get("districtCode");
        //获取匹配的城市价格配置
        SystemPriceCity systemPriceCity = systemPriceCityService.queryOne(provinceCode, cityCode, districtCode);
        if (null == systemPriceCity) {
            return null;
        }
        Map<String, Object> query1 = systemPriceMapper.query(systemPriceCity.getId(), type, null);
        if (null == query1) {//排除没有设置价格的车型
            return null;
        }
        Map<String, Object> map = new HashMap<>();
        double d = distance / 1000;//实际公里
        double t = duration / 60;//实际时间
        JSONObject jsonObject = JSON.parseObject(query1.get("content").toString());//等待费
        Double num1 = jsonObject.getDouble("num1");
        Double num2 = jsonObject.getDouble("num2");
        JSONArray mileageList = jsonObject.getJSONArray("mileageList");
        Double num4 = jsonObject.getDouble("num4");
        Double num5 = jsonObject.getDouble("num5");
        String num6 = jsonObject.getString("num6");
        Double num7 = jsonObject.getDouble("num7");
        Double num8 = jsonObject.getDouble("num8");
        String[] split = num6.split(" - ");
        Integer time1 = Integer.valueOf(split[0].replace(":", ""));
        Integer time2 = Integer.valueOf(split[1].replace(":", ""));
        long start_date = 0;
        long end_date = 0;
        if(time1.compareTo(time2) > 0){
            //跨天
            String[] split1 = split[1].split(":");
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1);
            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
            calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
            calendar.set(Calendar.SECOND, 59);
            end_date = calendar.getTimeInMillis();
            String[] split2 = split[0].split(":");
            calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split2[0]));
            calendar.set(Calendar.MINUTE, Integer.valueOf(split2[1]));
            calendar.set(Calendar.SECOND, 0);
            start_date = calendar.getTimeInMillis();
        }else{
            String[] split1 = split[1].split(":");
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
            calendar.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
            calendar.set(Calendar.SECOND, 59);
            end_date = calendar.getTimeInMillis();
            String[] split2 = split[0].split(":");
            calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split2[0]));
            calendar.set(Calendar.MINUTE, Integer.valueOf(split2[1]));
            calendar.set(Calendar.SECOND, 0);
            start_date = calendar.getTimeInMillis();
        }
        Double amount = 0D;
        if (System.currentTimeMillis() > start_date && System.currentTimeMillis() <= end_date) {
            amount = num7;
            BigDecimal multiply = BigDecimal.ZERO;
            BigDecimal yt = BigDecimal.ZERO;
            if (d > num8) {
                if(null != mileageList){
                    List<MileageObject> list = new ArrayList<>();
                    for (int i = 0; i < mileageList.size(); i++) {
                        MileageObject mileageObject = mileageList.getObject(i, MileageObject.class);
                        list.add(mileageObject);
                    }
                    //根据配置的里程倒序排序
                    list.sort(new Comparator<MileageObject>() {
                        @Override
                        public int compare(MileageObject o1, MileageObject o2) {
                            return o1.getMileage().compareTo(o2.getMileage()) * -1;
                        }
                    });
                    //计算每个阶段的增加费用
                    Double last = new BigDecimal(d).setScale(0, RoundingMode.DOWN).doubleValue();
                    for (int i = 0; i < list.size(); i++) {
                        Double mileage = list.get(i).getMileage();
                        Double price = list.get(i).getPrice();
                        if(d > mileage){
                            if(last <= num2){
                                break;
                            }
                            multiply = multiply.add((new BigDecimal(last).subtract(new BigDecimal(mileage))).multiply(new BigDecimal(price)));
                            last = mileage;
                        }
                    }
                }
                if (d > num4) {
                    yt = new BigDecimal(d).subtract(new BigDecimal(num4)).multiply(new BigDecimal(num5));
                }
                amount = new BigDecimal(num7).add(multiply).add(yt).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
            }
            map.put("qibujia", num7);
            map.put("lichengfei", multiply.doubleValue());
            map.put("yuantufei", yt.doubleValue());
            map.put("zongfeiyong", amount);
        } else {
            amount = num1;
            BigDecimal multiply = BigDecimal.ZERO;
            BigDecimal yt = BigDecimal.ZERO;
            if (d > num2) {
                if(null != mileageList){
                    List<MileageObject> list = new ArrayList<>();
                    for (int i = 0; i < mileageList.size(); i++) {
                        MileageObject mileageObject = mileageList.getObject(i, MileageObject.class);
                        list.add(mileageObject);
                    }
                    //根据配置的里程倒序排序
                    list.sort(new Comparator<MileageObject>() {
                        @Override
                        public int compare(MileageObject o1, MileageObject o2) {
                            return o1.getMileage().compareTo(o2.getMileage()) * -1;
                        }
                    });
                    //计算每个阶段的增加费用
                    Double last = new BigDecimal(d).setScale(0, RoundingMode.DOWN).doubleValue();
                    for (int i = 0; i < list.size(); i++) {
                        Double mileage = list.get(i).getMileage();
                        Double price = list.get(i).getPrice();
                        if(d > mileage){
                            if(last <= num2){
                                break;
                            }
                            multiply = multiply.add((new BigDecimal(last).subtract(new BigDecimal(mileage))).multiply(new BigDecimal(price)));
                            last = mileage;
                        }
                    }
                }
                if (d > num4) {
                    yt = new BigDecimal(d).subtract(new BigDecimal(num4)).multiply(new BigDecimal(num5));
                }
                amount = new BigDecimal(num1).add(multiply).add(yt).setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
            }
            map.put("qibujia", num1);
            map.put("lichengfei", multiply.doubleValue());
            map.put("yuantufei", yt.doubleValue());
            map.put("zongfeiyong", amount);
        }
        return map;
    }
    @Data
    public static class MileageObject{
        private Double mileage;
        private Double price;
    }
}