wucl преди 4 месеца
родител
ревизия
896a58e767

+ 3 - 3
src/main/java/com/leeroa/dydb/datasource/lianjia/schedule/LianjiaUpSchedule.java

@@ -22,7 +22,7 @@ public class LianjiaUpSchedule {
     /**
      * 抓取挂牌价,每8分钟请求一次最新的挂牌数据。只抓取前80页的数据
      */
-    @Scheduled(fixedDelay = 5000 * 60)
+    //@Scheduled(fixedDelay = 5000 * 60)
     public void dailyFetchUpPrice() {
         if (CommunityPriceLock.running) {
             return;
@@ -36,7 +36,7 @@ public class LianjiaUpSchedule {
     /**
      * 每30秒执行一次
      */
-    @Scheduled(fixedDelay = 1000 * 40)
+    //@Scheduled(fixedDelay = 1000 * 40)
     public void fetchHouse() {
         if (CommunityPriceLock.running) {
             return;
@@ -47,7 +47,7 @@ public class LianjiaUpSchedule {
     /**
      * 每30秒抓取一次详情
      */
-    @Scheduled(fixedDelay = 1000 * 10)
+    //@Scheduled(fixedDelay = 1000 * 10)
     public void fetchDetail() {
         dataLianjiaUpRemoteService.fetchDetail();
     }

+ 1 - 1
src/main/java/com/leeroa/dydb/datasource/loanorder/schedule/LoanOrderSchedule.java

@@ -20,7 +20,7 @@ public class LoanOrderSchedule {
     private DataLoanOrderService dataLoanOrderService;
 
     // 每10分钟执行一次
-    @Scheduled(fixedDelay = 1000 * 60 * 10)
+    //@Scheduled(fixedDelay = 1000 * 60 * 10)
     public void dailyFetch() {
         int errorTimes = 0;
         while (errorTimes < 5) {

Файловите разлики са ограничени, защото са твърде много
+ 1 - 1
src/main/java/com/leeroa/dydb/datasource/utils/SpiderUtils.java


+ 1 - 1
src/main/java/com/leeroa/dydb/price/schedule/CommunityPriceSchedule.java

@@ -36,7 +36,7 @@ public class CommunityPriceSchedule {
             communityPriceService.dailyInit();
 
             //更新小区地址
-           // communityPriceService.updateAddressByAMap();
+           communityPriceService.updateAddressByAMap();
 
             // 重新缓存:因为已经更新了数据。所以这里需要重新缓存
             CommunityPriceCache.getInstance().reloadAllCommunityPrice();

+ 28 - 0
src/main/java/com/leeroa/dydb/utils/amap/AMapDateDTO.java

@@ -0,0 +1,28 @@
+package com.leeroa.dydb.utils.amap;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2024/6/4
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class AMapDateDTO {
+
+    private String status;
+
+    private String info;
+
+    private String count;
+
+    private String infocode;
+
+    private List<AMapPOI> pois;
+
+
+}

+ 42 - 0
src/main/java/com/leeroa/dydb/utils/amap/AMapPOI.java

@@ -0,0 +1,42 @@
+package com.leeroa.dydb.utils.amap;
+
+import lombok.Data;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2024/6/4
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class AMapPOI {
+
+    private String id;
+
+    private String location;
+
+    private String name;
+
+    private String citycode;
+
+    private String adname;
+
+    private String typecode;
+
+    private String type;
+
+    private String cityname;
+
+    private String pname;
+
+    private String adcode;
+
+    private String pcode;
+
+    private String distance;
+
+    private String address;
+
+    private String parent;
+}

+ 91 - 0
src/main/java/com/leeroa/dydb/utils/amap/AMapTask.java

@@ -0,0 +1,91 @@
+package com.leeroa.dydb.utils.amap;
+
+
+import com.google.common.collect.Lists;
+import com.leeroa.base.log.LogHelper;
+import com.michael.utils.gson.GsonUtils;
+import lombok.Data;
+import org.apache.http.client.fluent.Request;
+import org.springframework.util.StringUtils;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2024/6/4
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class AMapTask implements Callable<List<String>> {
+
+    private final String AMAP_PALCE_API = "https://restapi.amap.com/v5/place/text";
+
+    //private final String KEY = "aa09edada6571ba7c2577a377a5b0156";
+    private final String KEY = "188fa1e706a273756610ca8624294d39";
+
+    private String cityName;
+
+    private String houseName;
+
+    public AMapTask(String cityName, String houseName) {
+        this.cityName = cityName;
+        this.houseName = houseName;
+    }
+
+    /**
+     * 高德API 通过小区名称查询小区地址
+     * @return
+     */
+    private  List<String> getAddressByCityNameAndHouseName(){
+        List<String> addresses = Lists.newArrayList();
+        try {
+            if (!StringUtils.isEmpty(cityName) && !StringUtils.isEmpty(houseName)){
+                String url = new StringBuffer(AMAP_PALCE_API).append("?key=")
+                        .append(KEY).append("&types=120000")
+                        .append("&region=").append(cityName)
+                        .append("&keywords=")
+                        .append(houseName).toString();
+
+                LogHelper.info("高德API获取地址信息:%s", houseName);
+                String ret = Request.Get(url).execute().returnContent().toString();
+                AMapDateDTO aMapDateDTO = GsonUtils.fromJson(ret, AMapDateDTO.class);
+
+                if (aMapDateDTO.getStatus().equals("1") && aMapDateDTO.getInfocode().equals("10000")){
+                    List<AMapPOI> pois = aMapDateDTO.getPois();
+                    if (pois.size()==1){
+                        String address = pois.get(0).getAddress();
+                        addresses.add(address);
+                    }else if(pois.size()>1) {
+                        //获取最精确的地址
+                        pois.stream().forEach(x->{
+                            if (houseName.equals(x.getName())){
+                                addresses.add(x.getAddress());
+                            }
+                        });
+                        if (addresses.size()==0){
+                            //周边地址
+                            addresses.addAll(pois.stream().map(AMapPOI::getAddress).collect(Collectors.toList()));
+                        }
+
+                    }
+                }else {
+                    return null;
+                }
+
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return addresses;
+    }
+
+    @Override
+    public List<String> call() throws Exception {
+        return getAddressByCityNameAndHouseName();
+    }
+}

+ 59 - 0
src/main/java/com/leeroa/dydb/utils/amap/Address.java

@@ -0,0 +1,59 @@
+package com.leeroa.dydb.utils.amap;
+
+import lombok.Data;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2025/3/10
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class Address {
+
+    /**
+     * 省、自治区、省级市
+     */
+    private String province;
+    /**
+     * 地级市、自治州
+     */
+    private String city;
+    /**
+     * 区、县、旗
+     */
+    private String district;
+    /**
+     * 街道、乡、镇
+     */
+    private String town;
+    /**
+     * 社区、村
+     */
+    private String community;
+    /**
+     * 路、街、段、巷
+     */
+    private String road;
+    /**
+     * 路号
+     */
+    private String roadNumber;
+    /**
+     * 栋、幢、楼
+     */
+    private String building;
+    /**
+     * 单元
+     */
+    private String unit;
+    /**
+     * 层
+     */
+    private String floor;
+    /**
+     * 室、号
+     */
+    private String room;
+}

+ 127 - 0
src/main/java/com/leeroa/dydb/utils/amap/AddressUtils.java

@@ -0,0 +1,127 @@
+package com.leeroa.dydb.utils.amap;
+
+import cn.hutool.core.util.StrUtil;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2025/3/10
+ * created with IntelliJ IDEA.
+ */
+public class AddressUtils {
+
+    private static final Pattern PROVINCE_PATTERN = Pattern.compile("(?<province>.+省|.+自治区|.+市)");
+    private static final Pattern CITY_PATTERN = Pattern.compile("(?<city>.+市|.+自治州|.+盟)");
+    private static final Pattern DISTRICT_PATTERN = Pattern.compile("(?<district>.+区|.+县|.+旗)");
+    private static final Pattern TOWN_PATTERN = Pattern.compile("(?<town>.+街道|.+镇|.+乡)");
+    private static final Pattern COMMUNITY_PATTERN = Pattern.compile("(?<community>.+社区|.+村)");
+    private static final Pattern ROAD_PATTERN = Pattern.compile("(?<road>.+路.+?段|.+路|.+巷|.+?街.+?段|.+?街)");
+    private static final Pattern ROAD_NUMBER_PATTERN = Pattern.compile("(?<roadNumber>\\d+号)");
+    private static final Pattern BUILDING_PATTERN = Pattern.compile("(?<building>\\d+楼|\\d+栋|\\d+幢)");
+    private static final Pattern UNIT_PATTERN = Pattern.compile("(?<unit>\\d+单元)");
+    private static final Pattern FLOOR_PATTERN = Pattern.compile("(?<floor>-?\\d+层|-?\\d+楼)");
+    private static final Pattern ROOM_PATTERN = Pattern.compile("(?<room>\\d+室\\d+号|\\d+室|\\d+号)");
+
+    private static final List<String> BIG_CHENGDU  = Arrays.asList("锦江区","武侯区","青羊区","郫都区","金牛区","高新区","温江区","成华区","新都区"
+            ,"龙泉驿区","青白江区","双流区","都江堰市","崇州市","邛崃市","简阳市","彭州市","郫县","金堂县","大邑县","浦江县"
+            ,"新津县","成都天府新区直管区","成都高新技术产业开发区","成都经济技术开发区","郫县","双流县");
+    /**
+     *
+     * @param address 地址字符串
+     * @return 标准地址对象
+     */
+    public static Address parseAddress(String address) {
+        Address result = new Address();
+
+        // 依次匹配每个级别的地址部分,并从剩余字符串中继续解析
+        String remaining = address;
+        result.setProvince(extractAndRemove(PROVINCE_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getProvince());
+
+        result.setCity(extractAndRemove(CITY_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getCity());
+
+        result.setDistrict(extractAndRemove(DISTRICT_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getDistrict());
+
+        result.setTown(extractAndRemove(TOWN_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getTown());
+
+        result.setCommunity(extractAndRemove(COMMUNITY_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getCommunity());
+
+        result.setRoad(extractAndRemove(ROAD_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getRoad());
+
+        result.setRoadNumber(extractAndRemove(ROAD_NUMBER_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getRoadNumber());
+
+        result.setBuilding(extractAndRemove(BUILDING_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getBuilding());
+
+        result.setUnit(extractAndRemove(UNIT_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getUnit());
+
+        result.setFloor(extractAndRemove(FLOOR_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getFloor());
+
+        result.setRoom(extractAndRemove(ROOM_PATTERN, remaining));
+        remaining = removePrefix(remaining, result.getRoom());
+
+        return result;
+    }
+
+    public static List<Address> parseAddress(List<String> addresses) {
+        return addresses.stream().map(addr -> {
+            return parseAddress(addr);
+        }).collect(Collectors.toList());
+    }
+
+    private static String extractAndRemove(Pattern pattern, String input) {
+        Matcher matcher = pattern.matcher(input);
+        if (matcher.find()) {
+            return matcher.group().trim();
+        }
+        return "";
+    }
+
+    private static String removePrefix(String input, String prefix) {
+        if (prefix == null || input == null) {
+            return input;
+        }
+        return input.replaceFirst(Pattern.quote(prefix), "").trim();
+    }
+
+
+
+    /**
+     * 判断是否属于大成都范围
+     * @param address
+     * @return
+     */
+    public static Boolean isInChengdu(String address){
+        Address addr = parseAddress(address);
+        if (addr!=null){
+            String city = addr.getCity();
+            if (StrUtil.isNotBlank(city) && city.contains("成都")){
+                return true;
+            }
+            String district = addr.getDistrict();
+
+            for (String str : BIG_CHENGDU){
+                if (StrUtil.isNotBlank(district) && (str.contains(district) || district.contains(str))){
+                    return true;
+                }
+            }
+        }
+        return false;
+
+    }
+}

+ 40 - 15
src/main/java/com/leeroa/dydb/zhaoshang/service/impl/QueryLogServiceImpl.java

@@ -15,10 +15,13 @@ import com.leeroa.dydb.datasource.utils.HouseUtils;
 import com.leeroa.dydb.price.domain.CommunityPrice;
 import com.leeroa.dydb.price.domain.CommunityQuery;
 import com.leeroa.dydb.utils.DoubleUtils;
+import com.leeroa.dydb.utils.amap.Address;
+import com.leeroa.dydb.utils.amap.AddressUtils;
 import com.leeroa.dydb.zhaoshang.bo.QueryLogBo;
 import com.leeroa.dydb.zhaoshang.dao.QueryLogDao;
 import com.leeroa.dydb.zhaoshang.domain.QueryLog;
 import com.leeroa.dydb.zhaoshang.service.QueryLogService;
+import com.leeroa.dydb.zhaoshang.utils.SignUtils;
 import com.leeroa.dydb.zhaoshang.vo.QueryLogVo;
 import com.michael.core.beans.BeanWrapBuilder;
 import com.michael.core.beans.BeanWrapCallback;
@@ -247,10 +250,16 @@ public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<Qu
         cq.setQueryTime(DateUtils.formatDatetime(now));
 
         String address = ql.getAddress();
-        String houseName = ql.getName();
+        String houseName = SignUtils.removeInvalidNumbers(ql.getName());
 
-        // 获取城市,如果不是成都市的,则返回
-        String cityName = HouseUtils.getCity(address);
+
+        String cityName = null;
+
+        if (address.contains("成都")){
+            cityName = "成都市";
+        }else {
+            cityName = AddressUtils.isInChengdu(address)?"成都市":null;
+        }
 //        if (cityName != null && !cityName.contains("成都")) {
 //            log.info("招商查询,非成都地区,直接返回:{}", address);
 //            cq.setStatus("N");
@@ -260,7 +269,10 @@ public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<Qu
 
  //       }
         // 获取区县,如果不是成都市的,也返回
-        String areaName = HouseUtils.getArea(address);
+//        String areaName = HouseUtils.getArea(address);
+//        if (StringUtils.isNotEmpty(areaName)){
+//            areaName = areaName.substring(0,areaName.length()-1);
+//        }
 //        if (StringUtils.isNotEmpty(areaName) && HouseUtils.AREA_OTHER.contains(areaName)) {
 //            log.info("招商查询,非成都地区,直接返回:{}", address);
 //            cq.setStatus("N");
@@ -316,6 +328,7 @@ public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<Qu
 
         // 根据小区名称获取小区的数据
         CommunityPrice communityPrice = null;
+
         while (true) {
 //            communityPrice = (CommunityPrice) session.createCriteria(CommunityPrice.class)
 //                    .add(Restrictions.eq("houses", houseName))
@@ -329,9 +342,9 @@ public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<Qu
             if (StringUtils.isNotEmpty(cityName)){
                 criteria.add(Restrictions.eq("cityName",cityName));
             }
-            if (StringUtils.isNotEmpty(areaName)){
-                criteria.add(Restrictions.eq("areaName",areaName));
-            }
+//            if (StringUtils.isNotEmpty(areaName)){
+//                criteria.add(Restrictions.like("areaName",areaName,MatchMode.START));
+//            }
             criteria.addOrder(Order.desc("priceUpdateTime"));
             criteria.setMaxResults(1);
             communityPrice = (CommunityPrice) criteria.uniqueResult();
@@ -362,9 +375,9 @@ public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<Qu
             if (StringUtils.isNotEmpty(cityName)){
                 criteria1.add(Restrictions.eq("cityName",cityName));
             }
-            if (StringUtils.isNotEmpty(areaName)){
-                criteria1.add(Restrictions.eq("areaName",areaName));
-            }
+//            if (StringUtils.isNotEmpty(areaName)){
+//                criteria1.add(Restrictions.eq("areaName",areaName));
+//            }
             criteria1.addOrder(Order.desc("priceUpdateTime"));
             criteria1.setMaxResults(1);
             communityPrice = (CommunityPrice) criteria1.uniqueResult();
@@ -457,15 +470,27 @@ public class QueryLogServiceImpl implements QueryLogService, BeanWrapCallback<Qu
 //                    .addOrder(Order.desc("priceUpdateTime"))
 //                    .setMaxResults(1)
 //                    .uniqueResult();
-
+            Address add = AddressUtils.parseAddress(address);
+            StringBuffer addx = new StringBuffer();
+            if (StringUtils.isNotEmpty(add.getRoad())){
+                addx.append(add.getRoad());
+            }
+            if (StringUtils.isNotEmpty(add.getRoadNumber())){
+                addx.append(add.getRoadNumber());
+            }
             Criteria criteria = session.createCriteria(CommunityPrice.class);
-            criteria.add(Restrictions.like("address", houseName,MatchMode.ANYWHERE));
+
+            if (StringUtils.isNotEmpty(addx.toString())){
+                criteria.add(Restrictions.like("address", addx.toString(),MatchMode.ANYWHERE));
+            }else {
+                criteria.add(Restrictions.like("address", houseName,MatchMode.ANYWHERE));
+            }
             if (StringUtils.isNotEmpty(cityName)){
                 criteria.add(Restrictions.eq("cityName",cityName));
             }
-            if (StringUtils.isNotEmpty(areaName)){
-                criteria.add(Restrictions.eq("areaName",areaName));
-            }
+//            if (StringUtils.isNotEmpty(areaName)){
+//                criteria.add(Restrictions.like("areaName",areaName,MatchMode.START));
+//            }
             criteria.addOrder(Order.desc("priceUpdateTime"));
             criteria.setMaxResults(1);
             communityPrice = (CommunityPrice) criteria.uniqueResult();

+ 14 - 0
src/main/java/com/leeroa/dydb/zhaoshang/utils/SignUtils.java

@@ -49,5 +49,19 @@ public class SignUtils {
     public static void main(String[] args) {
         ZhaoShangRequestData data = signByZS();
         System.out.println(GsonUtils.toJson(data));
+//        System.out.println(removeInvalidNumbers("大同上郡112701")); // 大同上郡
+//        System.out.println(removeInvalidNumbers("翡翠滨江7704"));       // abc
+//        System.out.println(removeInvalidNumbers("瑞丰园16503"));         // 空字符串
+//        System.out.println(removeInvalidNumbers("花样年江山1311803"));   // 小区3期
+//        System.out.println(removeInvalidNumbers("天誉珑城11"));
+    }
+
+    //去掉小区名称后无效数字例: "大同上郡112701" => "大同上郡"
+    public static String removeInvalidNumbers(String input) {
+        if (input == null || input.isEmpty()) {
+            return input;
+        }
+        // 使用正则表达式匹配末尾的数字并替换为空字符串
+        return input.replaceAll("\\d+$", "");
     }
 }

+ 1 - 0
src/main/java/com/leeroa/dydb/zhaoshang/web/ZSCtrl.java

@@ -6,6 +6,7 @@ import com.leeroa.dydb.price.service.CommunityQueryService;
 import com.leeroa.dydb.zhaoshang.domain.QueryLog;
 import com.leeroa.dydb.zhaoshang.service.QueryLogService;
 import com.leeroa.dydb.zhaoshang.utils.GsonHelper;
+import com.leeroa.dydb.zhaoshang.utils.SignUtils;
 import com.michael.core.web.BaseController;
 import com.michael.utils.gson.GsonUtils;
 import com.michael.utils.md5.MD5Utils;