| | |
| | | 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.*; |
| | |
| | | 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; |
| | |
| | | @Resource |
| | | private RestTemplate internalRestTemplate; |
| | | |
| | | @Autowired |
| | | private IAdditionalFeeService additionalFeeService; |
| | | |
| | | @Autowired |
| | | private GDMapElectricFenceUtil gdMapElectricFenceUtil; |
| | | |
| | | @Resource |
| | | private ISystemPriceCityService systemPriceCityService; |
| | | |
| | | @Resource |
| | | private SystemPriceMapper systemPriceMapper; |
| | | |
| | | @Resource |
| | | private ServerCarModelMapper serverCarModelMapper; |
| | | |
| | | |
| | | /** |
| | |
| | | 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; |
| | | } |
| | | } |