From d4c3427bbd111f4a005c77a9cc1f131b455fc6cf Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期一, 30 十月 2023 11:30:40 +0800 Subject: [PATCH] 新增加腾讯地图工具类 --- ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/RegionServiceImpl.java | 8 ++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/AppNearShopVo.java | 5 + ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrixElements.java | 20 +++++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java | 11 ++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrix.java | 15 +++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java | 30 +++++++ ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/MapUtil.java | 70 +++++++++++++++++ ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java | 25 +++-- ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml | 16 ++++ 9 files changed, 186 insertions(+), 14 deletions(-) diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java index f686694..8eaf64d 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java @@ -2083,7 +2083,7 @@ if(proportionPercent.compareTo(BigDecimal.ZERO)>0){ PaymentDelaytransHFTXVo result = new PaymentDelaytransHFTXVo(); // 计算分成金额 - int amount = orderMoney.multiply(proportionPercent).setScale(0, RoundingMode.UP).intValue(); + int amount = orderMoney.multiply(new BigDecimal(100)).setScale(0, RoundingMode.HALF_EVEN).intValue(); BigDecimal multiply = orderMoney.multiply(proportionPercent.divide(new BigDecimal(100))).setScale(2, RoundingMode.HALF_EVEN); log.info("订单分账:{} 分账金额: {}", orderNo, amount); if (amount > 0) { @@ -2100,16 +2100,21 @@ //分账对象 JSONArray acctInfos = new JSONArray(); - JSONObject jsonObject = new JSONObject(); - jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue())); - jsonObject.put("huifu_id", vo.getHuifuId()); - acctInfos.add(jsonObject); + if(multiply.compareTo(BigDecimal.ZERO) > 0){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue())); + jsonObject.put("huifu_id", vo.getHuifuId()); + acctInfos.add(jsonObject); + } //平台商户 - double pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); - JSONObject jsonObject1 = new JSONObject(); - jsonObject1.put("div_amt", String.format("%.2f", pt_amount)); - jsonObject1.put("huifu_id", "6666000141216769"); - acctInfos.add(jsonObject1); + BigDecimal pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN); + if(pt_amount.compareTo(BigDecimal.ZERO) > 0){ + JSONObject jsonObject1 = new JSONObject(); + jsonObject1.put("div_amt", String.format("%.2f", pt_amount.doubleValue())); + jsonObject1.put("huifu_id", "6666000141216769"); + acctInfos.add(jsonObject1); + } + R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), org_req_date, outTradeNo, acctInfos); if(hftxVoR.getCode() != 200){ throw new ServiceException(hftxVoR.getMsg()); diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/AppNearShopVo.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/AppNearShopVo.java index c9b1cae..382256e 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/AppNearShopVo.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/vo/AppNearShopVo.java @@ -12,8 +12,11 @@ @Data public class AppNearShopVo { - private Long shopId; private Float distance; + + private String longitude; + + private String latitude; } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java index 449598d..99c367f 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java @@ -55,7 +55,16 @@ * @param appNearbyShopDto * @return */ - AppNearShopVo getNearbyShop(@Param("param")AppNearbyShopDto appNearbyShopDto); + List<AppNearShopVo> getNearbyShop(@Param("param")AppNearbyShopDto appNearbyShopDto); + + + /** + * 获取最近商户 + * @param appNearbyShopDto + * @return + */ + List<AppNearShopVo> getNearbyShops(@Param("param")AppNearbyShopDto appNearbyShopDto); + /** * @description 平台获取商户分成列表 diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java index 24a94d1..76a6a30 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java @@ -36,6 +36,9 @@ import com.ruoyi.shop.service.task.ShopTaskService; import com.ruoyi.shop.util.HuiFuTianXiaUtil; import com.ruoyi.shop.util.WechatPayUtils; +import com.ruoyi.shop.util.map.MapUtil; +import com.ruoyi.shop.util.map.vo.TencentDistanceMatrix; +import com.ruoyi.shop.util.map.vo.TencentDistanceMatrixElements; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.constant.SecurityConstant; import com.ruoyi.system.api.domain.dto.*; @@ -759,8 +762,31 @@ //获取绑定商户 shop = this.getById(member.getRelationShopId()); }else if(StringUtils.isNotBlank(appNearbyShopDto.getLatitude())&&StringUtils.isNotBlank(appNearbyShopDto.getLongitude())){ - AppNearShopVo appNearShopVo = shopMapper.getNearbyShop(appNearbyShopDto); - shop = this.getById(appNearShopVo.getShopId()); + List<AppNearShopVo> appNearShopVos = shopMapper.getNearbyShops(appNearbyShopDto); + if(appNearShopVos.size() > 0){ + StringBuffer to = new StringBuffer(); + for (AppNearShopVo appNearShopVo : appNearShopVos) { + to.append(appNearShopVo.getLatitude() + "," + appNearShopVo.getLongitude() + ";"); + } + String form = appNearbyShopDto.getLatitude() + "," + appNearbyShopDto.getLongitude(); + R<List<TencentDistanceMatrix>> r = MapUtil.tencentDistanceMatrix(form, to.substring(0, to.length() - 1), "walking"); + if(r.getCode() != 200){ + throw new ServiceException(r.getMsg()); + } + List<TencentDistanceMatrix> data = r.getData(); + //存储最短距离 + BigDecimal dis = new BigDecimal(0); + AppNearShopVo appNearShopVo = null; + List<TencentDistanceMatrixElements> elements = data.get(0).getElements(); + for (int i = 0; i < elements.size(); i++) { + TencentDistanceMatrixElements matrix = elements.get(i); + if(dis.compareTo(BigDecimal.ZERO) == 0 || dis.compareTo(new BigDecimal(matrix.getDistance())) > 0){ + dis = new BigDecimal(matrix.getDistance()); + appNearShopVo = appNearShopVos.get(i); + } + } + shop = this.getById(appNearShopVo.getShopId()); + } }else{ return appNearbyShopVo; } diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/MapUtil.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/MapUtil.java new file mode 100644 index 0000000..121fde9 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/MapUtil.java @@ -0,0 +1,70 @@ +package com.ruoyi.shop.util.map; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.domain.R; +import com.ruoyi.shop.util.map.vo.TencentDistanceMatrix; +import com.ruoyi.shop.util.map.vo.TencentDistanceMatrixElements; + +import java.util.ArrayList; +import java.util.List; + +/** + * 地图工具 + * @author zhibing.pu + * @Date 2023/10/30 9:44 + */ +public class MapUtil { + + private static final String tencentKey = "FATBZ-V3AWH-7IJDS-WC7NC-QXY3Q-TQFDJ"; + + + /** + * 距离矩阵计算-腾讯 + * @param form 起点经纬度-lat,lng,[header],[roadtype],[speed],[accuracy],[timestamp]|lat,lng,[header],[roadtype],[speed],[accuracy],[timestamp]… + * @param to 终点经纬度-lat,lng;lat,lng… + * @param mode 计算方式,取值:driving:驾车 walking:步行 bicycling:自行车 + * @return + */ + public static R<List<TencentDistanceMatrix>> tencentDistanceMatrix(String form, String to, String mode){ + String url = "https://apis.map.qq.com/ws/distance/v1/matrix"; + HttpRequest get = HttpUtil.createGet(url) + .form("key", tencentKey) + .form("from", form) + .form("to", to) + .form("mode", mode); + HttpResponse execute = get.execute(); + JSONObject jsonObject = JSON.parseObject(execute.body()); + Integer status = jsonObject.getInteger("status"); + String message = jsonObject.getString("message"); + if(0 == status){ + JSONObject result = jsonObject.getJSONObject("result"); + JSONArray rows = result.getJSONArray("rows"); + List<TencentDistanceMatrix> list = new ArrayList<>(); + for (int i = 0; i < rows.size(); i++) { + TencentDistanceMatrix tencentDistanceMatrix = new TencentDistanceMatrix(); + + JSONObject jsonObject1 = rows.getJSONObject(i); + JSONArray elements = jsonObject1.getJSONArray("elements"); + List<TencentDistanceMatrixElements> elementsList = new ArrayList<>(); + for (int j = 0; j < elements.size(); j++) { + JSONObject jsonObject2 = elements.getJSONObject(j); + TencentDistanceMatrixElements elements1 = new TencentDistanceMatrixElements(); + elements1.setDistance(jsonObject2.getInteger("distance")); + elements1.setDuration(jsonObject2.getInteger("duration")); + elementsList.add(elements1); + } + tencentDistanceMatrix.setElements(elementsList); + list.add(tencentDistanceMatrix); + } + return R.ok(list); + } + return R.fail(message); + } + + +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrix.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrix.java new file mode 100644 index 0000000..e556833 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrix.java @@ -0,0 +1,15 @@ +package com.ruoyi.shop.util.map.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 距离矩阵 + * @author zhibing.pu + * @Date 2023/10/30 10:05 + */ +@Data +public class TencentDistanceMatrix { + List<TencentDistanceMatrixElements> elements; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrixElements.java b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrixElements.java new file mode 100644 index 0000000..ed3db19 --- /dev/null +++ b/ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/map/vo/TencentDistanceMatrixElements.java @@ -0,0 +1,20 @@ +package com.ruoyi.shop.util.map.vo; + +import lombok.Data; + +/** + * 距离矩阵 + * @author zhibing.pu + * @Date 2023/10/30 10:05 + */ +@Data +public class TencentDistanceMatrixElements { + /** + * 距离(米) + */ + private Integer distance; + /** + * 时间(秒) + */ + private Integer duration; +} diff --git a/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml index c26412e..6503794 100644 --- a/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml +++ b/ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml @@ -443,6 +443,22 @@ ORDER BY distance ASC LIMIT 1 </select> + + <select id="getNearbyShops" resultType="com.ruoyi.shop.domain.vo.AppNearShopVo"> + SELECT + ts.shop_id shopId, + 6378.138 * 2 * ASIN(SQRT(POW(SIN((#{param.latitude} * PI() / 180 - ts.shop_latitude * PI() / 180) / 2), 2) + + COS(#{param.latitude} * PI() / 180) * COS(ts.shop_latitude * PI() / 180) * POW( + SIN((#{param.longitude} * PI() / 180 - ts.shop_longitude * PI() / 180) / 2), 2 + ))) AS distance, + shop_longitude as longitude, + shop_latitude as latitude + FROM t_shop ts + WHERE del_flag = 0 AND shop_status = 1 + ORDER BY distance ASC LIMIT 0, 5 + </select> + + <select id="pageMgtShopProportion" resultType="com.ruoyi.shop.domain.vo.MgtShopProportionPageVo"> SELECT tsp.proportion_id proportionId, diff --git a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/RegionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/RegionServiceImpl.java index 4e85a30..36c1ea8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/RegionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/RegionServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.system.service.impl.config; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.system.api.constant.SecurityConstant; import com.ruoyi.system.domain.pojo.config.Region; @@ -7,6 +8,7 @@ import com.ruoyi.system.mapper.config.RegionMapper; import com.ruoyi.system.service.config.RegionService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.system.util.HttpUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -149,4 +151,10 @@ return regionVoList1; } } + + + +// public R renewalRegion(){ +// HttpUtils.doPost() +// } } -- Gitblit v1.7.1