From b1cd09d63e42a82e01337fea92274ee632e86b2f Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 28 四月 2026 14:02:27 +0800
Subject: [PATCH] 线路目的地价格获取
---
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/DriverSelfTripMapper.xml | 24 ++
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/DriverSelfTripMapper.java | 7
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java | 291 ++++++++++++++++++++++++++++---
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java | 2
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/DriverSelfTrip.java | 189 +++++++++++++++++++++
UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml | 9
6 files changed, 489 insertions(+), 33 deletions(-)
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/DriverSelfTripMapper.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/DriverSelfTripMapper.java
new file mode 100644
index 0000000..93dcfd1
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/DriverSelfTripMapper.java
@@ -0,0 +1,7 @@
+package com.stylefeng.guns.modular.crossCity.dao;
+
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import com.stylefeng.guns.modular.crossCity.model.DriverSelfTrip;
+
+public interface DriverSelfTripMapper extends BaseMapper<DriverSelfTrip> {
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java
index 7ecc4a1..29f18a1 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/LineShiftDriverMapper.java
@@ -14,4 +14,6 @@
* @return 扫码下单详情数据
*/
Map<String, Object> queryScanOrderDetail(@Param("lineShiftDriverId") Integer lineShiftDriverId);
+
+ Integer queryCustomerIdByLineShiftDriverId(@Param("lineShiftDriverId") Integer lineShiftDriverId);
}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/DriverSelfTripMapper.xml b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/DriverSelfTripMapper.xml
new file mode 100644
index 0000000..caac4f1
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/DriverSelfTripMapper.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.stylefeng.guns.modular.crossCity.dao.DriverSelfTripMapper">
+
+ <resultMap id="BaseResultMap" type="com.stylefeng.guns.modular.crossCity.model.DriverSelfTrip">
+ <id column="id" property="id"/>
+ <result column="driverId" property="driverId"/>
+ <result column="day" property="day"/>
+ <result column="startTime" property="startTime"/>
+ <result column="seat" property="seat"/>
+ <result column="startCityCode" property="startCityCode"/>
+ <result column="startCityName" property="startCityName"/>
+ <result column="endCityCode" property="endCityCode"/>
+ <result column="endCityName" property="endCityName"/>
+ <result column="startAddress" property="startAddress"/>
+ <result column="startLon" property="startLon"/>
+ <result column="startLat" property="startLat"/>
+ <result column="destJson" property="destJson"/>
+ <result column="state" property="state"/>
+ <result column="insertTime" property="insertTime"/>
+ <result column="updateTime" property="updateTime"/>
+ </resultMap>
+
+</mapper>
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
index e4f6ec9..461bc48 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/dao/mapping/LineShiftDriverMapper.xml
@@ -69,4 +69,11 @@
WHERE lsd.id = #{lineShiftDriverId}
</select>
-</mapper>
\ No newline at end of file
+ <select id="queryCustomerIdByLineShiftDriverId" resultType="java.lang.Integer">
+ select customerId
+ from t_line_shift_driver
+ where id = #{lineShiftDriverId}
+ limit 1
+ </select>
+
+</mapper>
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/DriverSelfTrip.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/DriverSelfTrip.java
new file mode 100644
index 0000000..66d553c
--- /dev/null
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/model/DriverSelfTrip.java
@@ -0,0 +1,189 @@
+package com.stylefeng.guns.modular.crossCity.model;
+
+import com.baomidou.mybatisplus.annotations.TableField;
+import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.annotations.TableName;
+import com.baomidou.mybatisplus.enums.IdType;
+
+import java.util.Date;
+
+@TableName("t_driver_self_trip")
+public class DriverSelfTrip {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ @TableField("id")
+ private Integer id;
+
+ @TableField("driverId")
+ private Integer driverId;
+
+ @TableField("day")
+ private Date day;
+
+ @TableField("startTime")
+ private String startTime;
+
+ @TableField("seat")
+ private Integer seat;
+
+ @TableField("startCityCode")
+ private String startCityCode;
+
+ @TableField("startCityName")
+ private String startCityName;
+
+ @TableField("endCityCode")
+ private String endCityCode;
+
+ @TableField("endCityName")
+ private String endCityName;
+
+ @TableField("startAddress")
+ private String startAddress;
+
+ @TableField("startLon")
+ private Double startLon;
+
+ @TableField("startLat")
+ private Double startLat;
+
+ @TableField("destJson")
+ private String destJson;
+
+ @TableField("state")
+ private Integer state;
+
+ @TableField("insertTime")
+ private Date insertTime;
+
+ @TableField("updateTime")
+ private Date updateTime;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Integer getDriverId() {
+ return driverId;
+ }
+
+ public void setDriverId(Integer driverId) {
+ this.driverId = driverId;
+ }
+
+ public Date getDay() {
+ return day;
+ }
+
+ public void setDay(Date day) {
+ this.day = day;
+ }
+
+ public String getStartTime() {
+ return startTime;
+ }
+
+ public void setStartTime(String startTime) {
+ this.startTime = startTime;
+ }
+
+ public Integer getSeat() {
+ return seat;
+ }
+
+ public void setSeat(Integer seat) {
+ this.seat = seat;
+ }
+
+ public String getStartCityCode() {
+ return startCityCode;
+ }
+
+ public void setStartCityCode(String startCityCode) {
+ this.startCityCode = startCityCode;
+ }
+
+ public String getStartCityName() {
+ return startCityName;
+ }
+
+ public void setStartCityName(String startCityName) {
+ this.startCityName = startCityName;
+ }
+
+ public String getEndCityCode() {
+ return endCityCode;
+ }
+
+ public void setEndCityCode(String endCityCode) {
+ this.endCityCode = endCityCode;
+ }
+
+ public String getEndCityName() {
+ return endCityName;
+ }
+
+ public void setEndCityName(String endCityName) {
+ this.endCityName = endCityName;
+ }
+
+ public String getStartAddress() {
+ return startAddress;
+ }
+
+ public void setStartAddress(String startAddress) {
+ this.startAddress = startAddress;
+ }
+
+ public Double getStartLon() {
+ return startLon;
+ }
+
+ public void setStartLon(Double startLon) {
+ this.startLon = startLon;
+ }
+
+ public Double getStartLat() {
+ return startLat;
+ }
+
+ public void setStartLat(Double startLat) {
+ this.startLat = startLat;
+ }
+
+ public String getDestJson() {
+ return destJson;
+ }
+
+ public void setDestJson(String destJson) {
+ this.destJson = destJson;
+ }
+
+ public Integer getState() {
+ return state;
+ }
+
+ public void setState(Integer state) {
+ this.state = state;
+ }
+
+ public Date getInsertTime() {
+ return insertTime;
+ }
+
+ public void setInsertTime(Date insertTime) {
+ this.insertTime = insertTime;
+ }
+
+ public Date getUpdateTime() {
+ return updateTime;
+ }
+
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+}
diff --git a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
index af0462c..3a60020 100644
--- a/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
+++ b/UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/crossCity/server/impl/OrderCrossCityServiceImpl.java
@@ -7,10 +7,12 @@
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.util.ToolUtil;
import com.stylefeng.guns.modular.account.controller.AppOrderController;
+import com.stylefeng.guns.modular.crossCity.dao.DriverSelfTripMapper;
import com.stylefeng.guns.modular.crossCity.dao.LinePriceMapper;
import com.stylefeng.guns.modular.crossCity.dao.LineMapper;
import com.stylefeng.guns.modular.crossCity.dao.LineShiftDriverMapper;
import com.stylefeng.guns.modular.crossCity.dao.OrderCrossCityMapper;
+import com.stylefeng.guns.modular.crossCity.model.DriverSelfTrip;
import com.stylefeng.guns.modular.crossCity.model.Line;
import com.stylefeng.guns.modular.crossCity.model.LineShiftDriver;
import com.stylefeng.guns.modular.crossCity.model.LineSite;
@@ -89,6 +91,9 @@
@Resource
private OrderTaxiMapper orderTaxiMapper;
+
+ @Resource
+ private DriverSelfTripMapper driverSelfTripMapper;
@Resource
@@ -132,6 +137,9 @@
@Autowired
private GDMapGeocodingUtil gdMapGeocodingUtil;
+
+ @Autowired
+ private GeodesyUtil geodesyUtil;
@Autowired
private ChinaMobileUtil chinaMobileUtil;
@@ -239,28 +247,24 @@
@Override
public ResultUtil queryOrderMoney(String startLonLat, String endLonLat, Integer peopleNumber, Integer travelMode, Integer lineId,
Integer lineDestinationId, Integer serverCarModelId, Integer totalSeat, String seatNumber) throws Exception {
- if (lineDestinationId != null) {
- Map<String, Object> destination = lineMapper.queryLineDestinationById(lineDestinationId, lineId);
- if (destination == null) {
- return ResultUtil.error("目的地不存在");
+ Double endLon = null;
+ Double endLat = null;
+ if (ToolUtil.isNotEmpty(endLonLat) && endLonLat.contains(",")) {
+ String[] endArr = endLonLat.split(",");
+ if (endArr.length == 2) {
+ endLon = Double.valueOf(endArr[0]);
+ endLat = Double.valueOf(endArr[1]);
}
- Object priceObj = (totalSeat != null && totalSeat <= 5) ? destination.get("price5") : destination.get("price7");
- if (priceObj == null) {
- return ResultUtil.error("目的地价格未配置");
- }
- double unitPrice = Double.valueOf(String.valueOf(priceObj));
- double totalPrice = new BigDecimal(unitPrice).multiply(new BigDecimal(peopleNumber)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
- Map<String, Object> map = new HashMap<>();
- map.put("distance", 0);
- map.put("price", totalPrice);
- return ResultUtil.success(map);
}
- // TODO: 2023/11/4 无法修改
- Map<String, String> distance = gdMapElectricFenceUtil.getDistance(startLonLat, endLonLat, 1);//调用高德计算距离
- if (null != distance) {
- return this.getPrice(Double.valueOf(distance.get("distance")), peopleNumber, travelMode, lineId, serverCarModelId, totalSeat, seatNumber);
+ ResultUtil<Map<String, Object>> result = this.getPriceV2(lineId, lineDestinationId, totalSeat, peopleNumber, endLon, endLat, null);
+ if (result.getCode() != 200) {
+ return result;
}
+ Double price = Double.valueOf(String.valueOf(result.getData().get("price")));
+ if (price < 0) {
return ResultUtil.error("获取距离计算出错");
+ }
+ return result;
}
/**
@@ -1316,9 +1320,16 @@
endAddress = endAddress.replaceAll("& #41;", ")");
orderCrossCity.setEndAddress(endAddress);
orderCrossCity.setMileage(0D);
- ResultUtil<Map<String, Object>> price = this.getPrice(orderCrossCityWarpper.getDistance(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getTravelMode(), orderCrossCityWarpper.getLineId(),
- orderCrossCityWarpper.getServerCarModelId(), orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getSeatNumber());
+ ResultUtil<Map<String, Object>> price = this.getPriceV2(orderCrossCityWarpper.getLineId(), orderCrossCityWarpper.getLineDestinationId(),
+ orderCrossCityWarpper.getTotalSeat(), orderCrossCityWarpper.getPeopleNumber(), orderCrossCityWarpper.getEndLon(),
+ orderCrossCityWarpper.getEndLat(), orderCrossCityWarpper.getLineShiftDriverId());
+ if (price.getCode() != 200) {
+ return ResultUtil.error("计算价格失败");
+ }
Double money = Double.valueOf(price.getData().get("price").toString());
+ if (money < 0) {
+ return ResultUtil.error("计算价格失败");
+ }
orderCrossCity.setOrderMoney(money);
Integer companyId = driver.getCompanyId();
orderCrossCity.setCompanyId(companyId);
@@ -2993,12 +3004,29 @@
}
String seatNumber = seatNumberBuilder.toString();
// 6. 获取线路班次信息
- LineSite lineSite = lineSiteService.selectById(lineShiftDriver.getLineShiftId());
+ LineSite lineSite;
+ if (lineShiftDriver.getLineShiftId() != null && lineShiftDriver.getLineShiftId() == -1) {
+ lineSite = new LineSite();
+ lineSite.setId(-1);
+ lineSite.setLineId(-1);
+ Integer customerId = lineShiftDriverMapper.queryCustomerIdByLineShiftDriverId(lineShiftDriver.getId());
+ if (customerId != null) {
+ DriverSelfTrip selfTrip = driverSelfTripMapper.selectById(customerId);
+ if (selfTrip != null) {
+ lineSite.setStartTime(selfTrip.getStartTime());
+ }
+ }
+ } else {
+ lineSite = lineSiteService.selectById(lineShiftDriver.getLineShiftId());
+ }
if (lineSite == null) {
return ResultUtil.error("线路班次信息不存在");
}
- Line line = lineService.selectById(lineSite.getLineId());
- if (line == null) {
+ Line line = null;
+ if (lineSite.getLineId() != null && lineSite.getLineId() != -1) {
+ line = lineService.selectById(lineSite.getLineId());
+ }
+ if (lineSite.getLineId() != null && lineSite.getLineId() != -1 && line == null) {
return ResultUtil.error("线路信息不存在");
}
@@ -3026,13 +3054,13 @@
}
// 10. 计算价格
- Map<String, String> distanceMap = gdMapElectricFenceUtil.getDistance(
- warpper.getStartLon() + "," + warpper.getStartLat(),
- warpper.getEndLon() + "," + warpper.getEndLat(), 1);
- if (distanceMap == null) {
- return ResultUtil.error("计算行程距离出错");
- }
- Double distance = Double.valueOf(distanceMap.get("distance"));
+// Map<String, String> distanceMap = gdMapElectricFenceUtil.getDistance(
+// warpper.getStartLon() + "," + warpper.getStartLat(),
+// warpper.getEndLon() + "," + warpper.getEndLat(), 1);
+// if (distanceMap == null) {
+// return ResultUtil.error("计算行程距离出错");
+// }
+// Double distance = Double.valueOf(distanceMap.get("distance"));
// 获取车辆信息
Car car = carMapper.selectById(driver.getCarId());
@@ -3047,12 +3075,14 @@
if(null == carService){
return ResultUtil.error("车辆未开通该服务");
}
- ResultUtil<Map<String, Object>> priceResult = this.getPrice(distance, warpper.getPeopleNumber(), 1,
- lineSite.getLineId(), carService.getServerCarModelId(), lineShiftDriver.getTotalSeat(), seatNumber);
+ ResultUtil<Map<String, Object>> priceResult = this.getPriceV2(lineSite.getLineId(), lineShiftDriver, warpper);
if (priceResult.getCode() != 200) {
return ResultUtil.error("计算价格失败");
}
Double ticketPrice = Double.valueOf(priceResult.getData().get("price").toString());
+ if (ticketPrice < 0) {
+ return ResultUtil.error("计算价格失败");
+ }
// 计算合计费用
Double otherFee = warpper.getOtherFee() != null ? warpper.getOtherFee().setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue() : 0D;
@@ -3204,4 +3234,201 @@
baseWarpper.setId(orderCrossCity.getId());
return ResultUtil.success(baseWarpper);
}
+
+ public ResultUtil<Map<String, Object>> getPriceV2(Integer lineId, LineShiftDriver lineShiftDriver, OrderCrossCityScanWarpper warpper) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("distance", 0);
+ if (lineShiftDriver == null || warpper == null || warpper.getEndLon() == null || warpper.getEndLat() == null
+ || warpper.getPeopleNumber() == null || warpper.getPeopleNumber() <= 0) {
+ map.put("price", -1);
+ return ResultUtil.success(map);
+ }
+ if (lineId != null && lineId == -1) {
+ BigDecimal price = querySelfTripNearestPrice(lineShiftDriver, warpper);
+ map.put("price", price == null ? -1 : multiplyPeopleNumber(price, warpper.getPeopleNumber()).doubleValue());
+ return ResultUtil.success(map);
+ }
+ BigDecimal price = queryLineDestinationPrice(lineId, lineShiftDriver, warpper);
+ map.put("price", price == null ? -1 : multiplyPeopleNumber(price, warpper.getPeopleNumber()).doubleValue());
+ return ResultUtil.success(map);
+ }
+
+ public ResultUtil<Map<String, Object>> getPriceV2(Integer lineId, Integer lineDestinationId, Integer totalSeat,
+ Integer peopleNumber, Double endLon, Double endLat, Integer lineShiftDriverId) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("distance", 0);
+ if (peopleNumber == null || peopleNumber <= 0 || endLon == null || endLat == null) {
+ map.put("price", -1);
+ return ResultUtil.success(map);
+ }
+ if (lineDestinationId != null) {
+ Map<String, Object> destination = lineMapper.queryLineDestinationById(lineDestinationId, lineId);
+ BigDecimal unitPrice = null;
+ if (destination != null) {
+ unitPrice = totalSeat != null && totalSeat == 6 ? getBigDecimal(destination.get("price7")) : getBigDecimal(destination.get("price5"));
+ if (unitPrice == null) {
+ unitPrice = getBigDecimal(destination.get("price5"));
+ }
+ }
+ map.put("price", unitPrice == null ? -1 : multiplyPeopleNumber(unitPrice, peopleNumber).doubleValue());
+ return ResultUtil.success(map);
+ }
+ if (lineId != null && lineId == -1) {
+ if (lineShiftDriverId == null) {
+ map.put("price", -1);
+ return ResultUtil.success(map);
+ }
+ LineShiftDriver lineShiftDriver = lineShiftDriverMapper.selectById(lineShiftDriverId);
+ if (lineShiftDriver == null) {
+ map.put("price", -1);
+ return ResultUtil.success(map);
+ }
+ OrderCrossCityScanWarpper warpper = new OrderCrossCityScanWarpper();
+ warpper.setEndLon(endLon);
+ warpper.setEndLat(endLat);
+ warpper.setPeopleNumber(peopleNumber);
+ return getPriceV2(lineId, lineShiftDriver, warpper);
+ }
+ List<Map<String, Object>> destinations = lineMapper.queryLineDestinations(lineId);
+ if (destinations == null || destinations.size() == 0) {
+ map.put("price", -1);
+ return ResultUtil.success(map);
+ }
+ BigDecimal defaultPrice5 = getBigDecimal(destinations.get(0).get("price5"));
+ BigDecimal matchedPrice = null;
+ for (Map<String, Object> destination : destinations) {
+ if (isPointInDestinationFence(destination, endLon, endLat)) {
+ matchedPrice = totalSeat != null && totalSeat == 6 ? getBigDecimal(destination.get("price7")) : getBigDecimal(destination.get("price5"));
+ if (matchedPrice == null) {
+ matchedPrice = getBigDecimal(destination.get("price5"));
+ }
+ break;
+ }
+ }
+ BigDecimal finalPrice = matchedPrice == null ? defaultPrice5 : matchedPrice;
+ map.put("price", finalPrice == null ? -1 : multiplyPeopleNumber(finalPrice, peopleNumber).doubleValue());
+ return ResultUtil.success(map);
+ }
+
+ private BigDecimal querySelfTripNearestPrice(LineShiftDriver lineShiftDriver, OrderCrossCityScanWarpper warpper) {
+ Integer customerId = lineShiftDriverMapper.queryCustomerIdByLineShiftDriverId(lineShiftDriver.getId());
+ if (customerId == null) {
+ return null;
+ }
+ DriverSelfTrip selfTrip = driverSelfTripMapper.selectById(customerId);
+ if (selfTrip == null || ToolUtil.isEmpty(selfTrip.getDestJson())) {
+ return null;
+ }
+ JSONArray destArray = JSON.parseArray(selfTrip.getDestJson());
+ if (destArray == null || destArray.size() == 0) {
+ return null;
+ }
+ BigDecimal bestPrice = null;
+ Double minDistance = null;
+ String target = warpper.getEndLon() + "," + warpper.getEndLat();
+ for (int i = 0; i < destArray.size(); i++) {
+ JSONObject dest = destArray.getJSONObject(i);
+ if (dest == null || dest.getDouble("endLon") == null || dest.getDouble("endLat") == null || dest.getBigDecimal("price") == null) {
+ continue;
+ }
+ String source = dest.getDouble("endLon") + "," + dest.getDouble("endLat");
+ Double distance = geodesyUtil.getDistance(source, target).get("WGS84");
+ if (distance == null) {
+ continue;
+ }
+ if (minDistance == null || distance < minDistance) {
+ minDistance = distance;
+ bestPrice = dest.getBigDecimal("price");
+ }
+ }
+ return bestPrice;
+ }
+
+ private BigDecimal queryLineDestinationPrice(Integer lineId, LineShiftDriver lineShiftDriver, OrderCrossCityScanWarpper warpper) {
+ List<Map<String, Object>> destinations = lineMapper.queryLineDestinations(lineId);
+ if (destinations == null || destinations.size() == 0) {
+ return null;
+ }
+ BigDecimal defaultPrice5 = getBigDecimal(destinations.get(0).get("price5"));
+ for (Map<String, Object> destination : destinations) {
+ if (isPointInDestinationFence(destination, warpper.getEndLon(), warpper.getEndLat())) {
+ if (lineShiftDriver.getTotalSeat() != null && lineShiftDriver.getTotalSeat() == 6) {
+ BigDecimal price7 = getBigDecimal(destination.get("price7"));
+ return price7 == null ? defaultPrice5 : price7;
+ }
+ BigDecimal price5 = getBigDecimal(destination.get("price5"));
+ return price5 == null ? defaultPrice5 : price5;
+ }
+ }
+ return defaultPrice5;
+ }
+
+ private boolean isPointInDestinationFence(Map<String, Object> destination, Double lon, Double lat) {
+ if (destination == null || lon == null || lat == null) {
+ return false;
+ }
+ Integer fenceType = destination.get("fenceType") == null ? null : Integer.valueOf(String.valueOf(destination.get("fenceType")));
+ String coordinate = destination.get("coordinate") == null ? null : String.valueOf(destination.get("coordinate"));
+ if (fenceType == null || ToolUtil.isEmpty(coordinate)) {
+ return false;
+ }
+ if (fenceType == 1) {
+ String[] arr = coordinate.split(";");
+ if (arr.length != 2) {
+ return false;
+ }
+ String[] center = arr[0].split(",");
+ if (center.length != 2) {
+ return false;
+ }
+ String source = center[0] + "," + center[1];
+ String target = lon + "," + lat;
+ Double distance = geodesyUtil.getDistance(source, target).get("WGS84");
+ return distance != null && distance <= Double.valueOf(arr[1]);
+ }
+ return isPointInPolygon(coordinate, lon, lat);
+ }
+
+ private boolean isPointInPolygon(String coordinate, Double lon, Double lat) {
+ String[] points = coordinate.split(";");
+ if (points.length < 3) {
+ return false;
+ }
+ boolean inside = false;
+ for (int i = 0, j = points.length - 1; i < points.length; j = i++) {
+ String[] current = points[i].split(",");
+ String[] previous = points[j].split(",");
+ if (current.length != 2 || previous.length != 2) {
+ continue;
+ }
+ double xi = Double.parseDouble(current[0]);
+ double yi = Double.parseDouble(current[1]);
+ double xj = Double.parseDouble(previous[0]);
+ double yj = Double.parseDouble(previous[1]);
+ boolean intersect = ((yi > lat) != (yj > lat))
+ && (lon < (xj - xi) * (lat - yi) / ((yj - yi) == 0 ? 0.0000001D : (yj - yi)) + xi);
+ if (intersect) {
+ inside = !inside;
+ }
+ }
+ return inside;
+ }
+
+ private BigDecimal getBigDecimal(Object value) {
+ if (value == null || ToolUtil.isEmpty(String.valueOf(value))) {
+ return null;
+ }
+ try {
+ return new BigDecimal(String.valueOf(value));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ private BigDecimal multiplyPeopleNumber(BigDecimal price, Integer peopleNumber) {
+ if (price == null || peopleNumber == null || peopleNumber <= 0) {
+ return null;
+ }
+ return price.multiply(new BigDecimal(peopleNumber)).setScale(2, BigDecimal.ROUND_HALF_UP);
+ }
}
--
Gitblit v1.7.1