Parcourir la source

fix:优化订单车费计算,以选的地址为准,不以客户当前定位计算

wrj il y a 10 mois
Parent
commit
cb026ceb5e

+ 13 - 13
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/RedisGeoController.java

@@ -79,19 +79,19 @@ public class RedisGeoController {
         return R.ok(radius);
     }
 
-    @ApiOperation("测试")
-    @RequestMapping(value = "test", method = RequestMethod.GET)
-    public List<TWxUser> test() {
-        locationUtil.geoAdd("shijiazhuang1", 114.48, 38.03);
-        locationUtil.geoAdd("shijiazhuang2", 114.48, 38.02);
-        locationUtil.geoAdd("shijiazhuang3", 114.48, 39.03);
-
-        Map<String, Double> shijiazhuang1 = locationUtil.distanceInclude("shijiazhuang1", 30000);
-
-        log.error(shijiazhuang1.toString());
-
-        return null;
-    }
+//    @ApiOperation("测试")
+//    @RequestMapping(value = "test", method = RequestMethod.GET)
+//    public List<TWxUser> test() {
+//        locationUtil.geoAdd("shijiazhuang1", 114.48, 38.03);
+//        locationUtil.geoAdd("shijiazhuang2", 114.48, 38.02);
+//        locationUtil.geoAdd("shijiazhuang3", 114.48, 39.03);
+//
+//        Map<String, Double> shijiazhuang1 = locationUtil.distanceInclude("shijiazhuang1", 30000);
+//
+//        log.error(shijiazhuang1.toString());
+//
+//        return null;
+//    }
 
 }
 

+ 4 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TJsServiceImpl.java

@@ -2,7 +2,7 @@ package com.ylx.massage.service.impl;
 
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.json.JSONObject;
+
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -14,7 +14,7 @@ import com.ylx.common.utils.StringUtils;
 import com.ylx.massage.domain.*;
 import com.ylx.massage.domain.vo.TJsVo;
 import com.ylx.massage.enums.JsStatusEnum;
-import com.ylx.massage.enums.OrderStatusEnum;
+
 import com.ylx.massage.mapper.TJsMapper;
 import com.ylx.massage.service.*;
 import com.ylx.massage.utils.DateTimeUtils;
@@ -100,7 +100,7 @@ public class TJsServiceImpl extends ServiceImpl<TJsMapper, TJs> implements TJsSe
 //        JSONObject jsonObject = new JSONObject(js.getcAddress());
 //        Object latitude = jsonObject.get("latitude");
 //        Object longitude = jsonObject.get("longitude");
-        locationUtil.geoAdd(js.getcOpenId(), Double.parseDouble(js.getLongitude().toString()), Double.parseDouble(js.getLatitude().toString()));
+        locationUtil.geoAdd(LocationUtil.GEO_KEY,js.getcOpenId(), Double.parseDouble(js.getLongitude().toString()), Double.parseDouble(js.getLatitude().toString()));
     }
 
 
@@ -163,7 +163,7 @@ public class TJsServiceImpl extends ServiceImpl<TJsMapper, TJs> implements TJsSe
 //        JSONObject jsonObject = new JSONObject(js.getcAddress());
 //        Object latitude = jsonObject.get("latitude");
 //        Object longitude = jsonObject.get("longitude");
-        locationUtil.geoAdd(js.getcOpenId(), Double.parseDouble(js.getLongitude().toString()), Double.parseDouble(js.getLatitude().toString()));
+        locationUtil.geoAdd(LocationUtil.GEO_KEY,js.getcOpenId(), Double.parseDouble(js.getLongitude().toString()), Double.parseDouble(js.getLatitude().toString()));
         LambdaQueryWrapper<TJs> objectLambdaQueryWrapper = new LambdaQueryWrapper<>();
         objectLambdaQueryWrapper.eq(TJs::getcOpenId, js.getcOpenId());
         return this.update(js, objectLambdaQueryWrapper);

+ 21 - 16
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -22,10 +22,7 @@ import com.ylx.massage.enums.JsStatusEnum;
 import com.ylx.massage.enums.OrderStatusEnum;
 import com.ylx.massage.mapper.TOrderMapper;
 import com.ylx.massage.service.*;
-import com.ylx.massage.utils.DateTimeUtils;
-import com.ylx.massage.utils.MassageUtil;
-import com.ylx.massage.utils.OrderNumberGenerator;
-import com.ylx.massage.utils.WeChatUtil;
+import com.ylx.massage.utils.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.stereotype.Service;
@@ -51,8 +48,8 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
 
     @Resource
     private WechatAccountConfig wxPayProperties;
-
-
+    @Resource
+    private LocationUtil locationUtil;
 
     @Resource
     private TWxUserService wxUserService;
@@ -91,8 +88,8 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     private RefundVoucherService refundVoucherService;
 
 
-    public Boolean isFree(String jsId, BigDecimal distance) {
-        TJs js = jsService.getById(jsId);
+    public Boolean isFree(TJs js, BigDecimal distance) {
+
         Date date = new Date();
         //白天免车费(07.30-20.00)
         long current = Long.parseLong(DateTimeUtils.numTime(date));
@@ -129,14 +126,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         if (order.getcGoods().isEmpty()) {
             throw new ServiceException("请选择项目");
         }
-        //计算车费
-        if (order.getDistance() != null) {
-            //判断是否可以免车费
-            if (!this.isFree(order.getcJsId(), order.getDistance())) {
-                BigDecimal bigDecimal = massageUtil.calculateTaxiFare(order.getDistance());
-                order.setFare(bigDecimal.setScale(MassageConstants.INTEGER_TWO, RoundingMode.HALF_UP));
-            }
-        }
+
         //优惠卷减免
 //        List<CouponReceiveVo> coupons = couponReceiveService.getByOpenId(order.getcOpenId());
 //        BigDecimal preferential = this.setCoupon(coupons);
@@ -158,6 +148,21 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         if (address == null) {
             throw new ServiceException("请先添加地址");
         }
+        TJs js = jsService.getById(order.getcJsId());
+        //添加位置信息
+        locationUtil.geoAdd(LocationUtil.GEO_KEY_USER, js.getcOpenId(), Double.parseDouble(js.getLongitude().toString()), Double.parseDouble(js.getLatitude().toString()));
+        locationUtil.geoAdd(LocationUtil.GEO_KEY_USER, order.getcOpenId(), Double.parseDouble(address.getLongitude().toString()), Double.parseDouble(address.getLatitude().toString()));
+        double distance = locationUtil.getDistance(js.getcOpenId(), order.getcOpenId());
+        locationUtil.remove(LocationUtil.GEO_KEY_USER, js.getcOpenId() + "," + order.getcOpenId());
+        order.setDistance(new BigDecimal(distance));
+        //计算车费
+        if (order.getDistance() != null && order.getDistance().compareTo(BigDecimal.ZERO) > 0) {
+            //判断是否可以免车费
+            if (!this.isFree(js, order.getDistance())) {
+                BigDecimal bigDecimal = massageUtil.calculateTaxiFare(order.getDistance());
+                order.setFare(bigDecimal.setScale(MassageConstants.INTEGER_TWO, RoundingMode.HALF_UP));
+            }
+        }
 
         order.setAddress(address.getAddress());
         order.setName(address.getName());

+ 24 - 3
nightFragrance-massage/src/main/java/com/ylx/massage/utils/LocationUtil.java

@@ -30,7 +30,9 @@ public class LocationUtil {
     /**
      * 作为存储经纬度列表的key值
      */
-    private static final String GEO_KEY = MassageConstants.ATLAS + "JS_POSITION";
+    public static final String GEO_KEY = MassageConstants.ATLAS + "JS_POSITION";
+
+    public static final String GEO_KEY_USER = MassageConstants.ATLAS + "USER_POSITION";
 
     /**
      * 将经纬度信息添加到redis中
@@ -39,11 +41,16 @@ public class LocationUtil {
      * @param longitude 经度
      * @param latitude  纬度
      */
-    public void geoAdd(String certId, double longitude, double latitude) {
+    public void geoAdd(String geoKey,String certId, double longitude, double latitude) {
         GeoOperations geoOperations = redisTemplate.opsForGeo();
         Point point = new Point(longitude, latitude);
         RedisGeoCommands.GeoLocation geoLocation = new RedisGeoCommands.GeoLocation(certId, point);
-        geoOperations.add(GEO_KEY, geoLocation);
+        geoOperations.add(geoKey, geoLocation);
+    }
+
+    public void remove(String geoKey,String certId) {
+        GeoOperations geoOperations = redisTemplate.opsForGeo();
+        geoOperations.remove(geoKey, certId);
     }
 
     /**
@@ -86,6 +93,10 @@ public class LocationUtil {
         return map;
     }
 
+
+    /**
+    * 获取附近的技师以及距离
+    */
     public List<TJs> dis(Location locationBo) {
 
         ArrayList<TJs> js = Lists.newArrayList();
@@ -118,5 +129,15 @@ public class LocationUtil {
         return js;
     }
 
+    /**
+     * 获得两点之间的距离
+     * */
+    public double getDistance(String jsKey,String userKey) {
+        // 获取两个城市之间的距离
+        Distance distance = redisTemplate.opsForGeo().distance(GEO_KEY, jsKey, userKey, RedisGeoCommands.DistanceUnit.KILOMETERS);
+        System.out.println("获取两之间的距离:"+distance.getValue()+" 千米");
+        return distance.getValue();
+    }
+
 
 }