Ver código fonte

Merge branch 'master' into lcy

云殇忆 1 ano atrás
pai
commit
a1683e7128

+ 2 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/mapper/StoreWdOpcloseDao.java

@@ -14,4 +14,6 @@ public interface StoreWdOpcloseDao extends BaseMapper<StoreWdOpclose> {
     List<OpcloseTimeVo> selectWdCloseTimes(@Param("addrCodes") List<String> addrCodes, @Param("typeCodeBys") List<String> typeCodeBys);
     List<OpcloseTimeVo> selectBrandOpenTimes(@Param("brandIds") List<String> brandIds, @Param("addrCodes") List<String> addrCodes, @Param("typeCodeBys") List<String> typeCodeBys);
     List<OpcloseTimeVo> selectBrandCloseTimes(@Param("brandIds") List<String> brandIds, @Param("addrCodes") List<String> addrCodes, @Param("typeCodeBys") List<String> typeCodeBys);
+    List<String> selectIns();
+    List<StoreWdOpclose> selectStatistics(@Param("notIns") List<String> notIns);
 }

+ 123 - 129
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/WdRedisStoreage.java

@@ -1,12 +1,9 @@
 package com.ruoyi.demo.utils;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-
-import com.ruoyi.common.utils.redis.RedisUtils;
 import com.ruoyi.demo.constant.RedisContant;
 import com.ruoyi.demo.entity.WdInfo;
 import com.ruoyi.demo.mapper.WdInfoDao;
-import com.ruoyi.demo.service.WriteService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.data.geo.Distance;
@@ -18,11 +15,9 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
@@ -34,18 +29,26 @@ public class WdRedisStoreage {
     @Autowired
     public WdInfoDao wdInfoDao;
 
-
     @Autowired
-    WriteService writeService;
+    @Qualifier("executor")
+    private ExecutorService executorService;
+
+
+
+
+    //@Autowired
+    //WriteService writeService;
 
 
     /***
-     * +
+     * 获取中心网点的周边标签
      * @param wdInfo 中心网点信息
      * @return
      */
     public  List<String> getWdTag(WdInfo wdInfo){
         List<String> tag = (List<String>) redisTemplate.boundValueOps(RedisContant.WD_TAG+"_"+wdInfo.getWdId()).get();
+        System.out.println(RedisContant.WD_TAG+"_"+wdInfo.getWdId());
+        System.out.println(tag);
         return tag;
     }
 
@@ -54,67 +57,61 @@ public class WdRedisStoreage {
         return list;
     }
 
-//    /***
-//     * 分析网点周边标签,并把分析结果存入redis(默认范围:1km)
-//     * @param wdInfo 中心网点信息
-//     * @return
-//     */
-//    public  List<String> wdTagAnalyse(WdInfo wdInfo){
-//        //1. 找到距离中心网点半径1km的所有网点Id
-//        Distance distance = new Distance(1, RedisGeoCommands.DistanceUnit.KILOMETERS);
-//        GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(wdInfo.getAddrCode().substring(0, 4)).radius(wdInfo.getWdId(), distance);
-//        List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> content = radius.getContent();
-//        List<String> aroundWdId = content.stream().map(item -> {
-//            String name = (String) item.getContent().getName();
-//            return name;
-//        }).collect(Collectors.toList());
-//
-//        //2. 查询周边网点标签的Set集
-//        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
-//        queryWrapper.select("type_name_by")
-//                .in("wd_id",aroundWdId)
-//                    .groupBy("type_name_by");
-//        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
-//
-//        //3. 打标签
-//        List<String> tag = new ArrayList<>();
-//        wdInfos.stream().forEach(item -> {
-//            if(item != null){
-//                String typeNameBy = item.getTypeNameBy();
-//                if(typeNameBy != null && !typeNameBy.equals("")){
-//                    String[] split = typeNameBy.split(":");
-//                    if (split.length > 0)
-//                        tag.add(split[split.length-1]);
-//                }
-//            }
-//        });
-//        redisTemplate.boundValueOps(RedisContant.WD_TAG+"_"+wdInfo.getWdId()).set(tag);
-//        return tag;
-//    }
-//
-//    /**
-//     * 将网点数据库 导入 redis
-//     * */
-//    public void writeWdGeoRedis(){
-//        //清重
-//        clearSql2();
-//        try {
-//            Thread.sleep(1000*60*10);
-//        } catch (InterruptedException e) {
-//            throw new RuntimeException(e);
-//        }
-//
-//        //将所有网点坐标导入redis
-//        writeWdGeoRedis1();
-//
-//        try {
-//            Thread.sleep(1000*60*10);
-//        } catch (InterruptedException e) {
-//            throw new RuntimeException(e);
-//        }
-//        //给网点打标签并存入redis中
-//        writeWdGeoRedis2();
-//    }
+    /***
+     * 分析网点周边标签,并把分析结果存入redis(默认范围:1km)
+     * @param wdInfo 中心网点信息
+     * @return
+     */
+    public  List<String> wdTagAnalyse(WdInfo wdInfo){
+        //1. 找到距离中心网点半径1km的所有网点Id
+        Distance distance = new Distance(1, RedisGeoCommands.DistanceUnit.KILOMETERS);
+        GeoResults<RedisGeoCommands.GeoLocation<Object>> radius = redisTemplate.boundGeoOps(wdInfo.getAddrCode().substring(0, 4)).radius(wdInfo.getWdId(), distance);
+        List<GeoResult<RedisGeoCommands.GeoLocation<Object>>> content = radius.getContent();
+        List<String> aroundWdId = content.stream().map(item -> {
+            String name = (String) item.getContent().getName();
+            return name;
+        }).collect(Collectors.toList());
+
+        //2. 查询周边网点标签的Set集
+        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("type_name_by")
+                .in("wd_id",aroundWdId)
+                    .groupBy("type_name_by");
+        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
+        //释放内存
+        aroundWdId = null;
+        aroundWdId = null;
+
+        //3. 打标签
+        List<String> tag = new ArrayList<>();
+        wdInfos.stream().forEach(item -> {
+            if(item != null){
+                String typeNameBy = item.getTypeNameBy();
+                if(typeNameBy != null && !typeNameBy.equals("")){
+                    String[] split = typeNameBy.split(":");
+                    if (split.length > 0)
+                        tag.add(split[split.length-1]);
+                }
+            }
+        });
+        redisTemplate.boundValueOps(RedisContant.WD_TAG+"_"+wdInfo.getWdId()).set(tag);
+
+        return tag;
+    }
+
+    /**
+     * 将网点数据库 导入 redis
+     * */
+    public void writeWdGeoRedis(){
+        //清重
+        //clearSql2();
+
+        //将所有网点坐标导入redis
+        //writeWdGeoRedis1("2023-09-25");
+
+        //给网点打标签并存入redis中
+        //writeWdGeoRedis2();
+    }
 //
 //    public void clearSql2(){
 //        List<String> wdId = new ArrayList<>();
@@ -142,6 +139,7 @@ public class WdRedisStoreage {
 //            hashMap1.put("total",1);
 //            CompletableFuture<Void> future = null;
 //            for (String s : hashMap.keySet()) {
+//                FutureTask
 //                future = CompletableFuture.runAsync(()->{
 //                    synchronized (this){
 //                        if(hashMap1.get("total")%1000 == 0){
@@ -199,65 +197,61 @@ public class WdRedisStoreage {
 //
 //
 //    }
-//
-//    private void writeWdGeoRedis1(){
-//        //1.将网点坐标存入redis中
-//        long start = System.currentTimeMillis();
-//        System.out.println("开始将网点坐标存入redis");
-//        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
-//        queryWrapper.likeRight("collect_time","2023-09-");
-//
-//        HashMap<String,Integer> hashMap = new HashMap<>();
-//        hashMap.put("total",1);
-//        CompletableFuture<Void> future = null;
-//        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
-//        for (WdInfo wdInfo : wdInfos) {
-//            //开启线程
-//            future = CompletableFuture.runAsync(()->{
-//                redisTemplate.boundGeoOps(wdInfo.getAddrCode().substring(0,4)).add(new Point(wdInfo.getLng().doubleValue(),wdInfo.getLat().doubleValue()),wdInfo.getWdId());
-//                 System.out.println("进度:"+wdInfos.size()+"/"+hashMap.get("total"));
-//                 hashMap.put("total",hashMap.get("total")+1);
-//            },executorService);
-//        }
-//        try {
-//            future.get();
-//        } catch (InterruptedException e) {
-//            throw new RuntimeException(e);
-//        } catch (ExecutionException e) {
-//            throw new RuntimeException(e);
-//        }
-//        long end = System.currentTimeMillis();
-//        System.out.println("完成存入 "+(end-start)/(1000*60));
-//    }
-//
-//    private void writeWdGeoRedis2(){
-//        //2.对所有网点坐标进行分析打标签
-//        long start = System.currentTimeMillis();
-//        System.out.println("开始打标签");
-//        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
-//        queryWrapper.in("wd_type_code", Arrays.asList("1","2","3","5"));
-//        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
-//        CompletableFuture<Void> future = null;
-//        HashMap<String,Integer> hashMap = new HashMap<>();
-//        hashMap.put("total",1);
-//        for (WdInfo wdInfo : wdInfos) {
-//            //开启线程
-//            future = CompletableFuture.runAsync(()->{
-//                wdTagAnalyse(wdInfo);
-//                System.out.println("进度:"+wdInfos.size()+"/"+hashMap.get("total"));
-//                hashMap.put("total",hashMap.get("total")+1);
-//            },executorService);
-//        }
-//        try {
-//            future.get();
-//        } catch (InterruptedException e) {
-//            throw new RuntimeException(e);
-//        } catch (ExecutionException e) {
-//            throw new RuntimeException(e);
-//        }
-//        long end = System.currentTimeMillis();
-//        System.out.println("完成打标签 "+(end-start)/(1000*60));
-//    }
+
+    public void writeWdGeoRedis1(String time) throws Exception{
+        //1.将网点坐标存入redis中
+        long start = System.currentTimeMillis();
+        System.out.println("开始将网点坐标存入redis");
+        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("wd_id","addr_code","lng","lat");
+        queryWrapper.ge("collect_time",time);
+
+        Hashtable<String,Integer> hashtable = new Hashtable<>();
+        hashtable.put("total",0);
+        List<CompletableFuture<Void>> completableFutureList = new ArrayList<>();
+        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
+        for (WdInfo wdInfo : wdInfos) {
+            //开启线程
+            completableFutureList.add(CompletableFuture.runAsync(()->{
+                redisTemplate.boundGeoOps(wdInfo.getAddrCode().substring(0,4)).add(new Point(wdInfo.getLng().doubleValue(),wdInfo.getLat().doubleValue()),wdInfo.getWdId());
+                wdTagAnalyse(wdInfo);
+                System.out.println("进度:"+wdInfos.size()+"/"+hashtable.get("total"));
+                hashtable.put("total",hashtable.get("total")+1);
+            },executorService));
+        }
+        CompletableFuture.allOf(completableFutureList.toArray(new CompletableFuture[0])).join();
+        long end = System.currentTimeMillis();
+        System.out.println("完成存入 "+(end-start)/(1000*60));
+    }
+
+    public void writeWdGeoRedis2(String[] wdTypeCodes){
+        //对所有网点坐标进行分析打标签
+        long start = System.currentTimeMillis();
+        System.out.println("开始打标签");
+
+        //开始
+        QueryWrapper<WdInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("wd_id","addr_code");
+        queryWrapper.in("wd_type_code", wdTypeCodes);
+        List<WdInfo> wdInfos = wdInfoDao.selectList(queryWrapper);
+
+        ArrayList<CompletableFuture<Void>> list = new ArrayList<>();
+        Hashtable<String,Integer> hashtable = new Hashtable<>();
+        hashtable.put("total",1);
+        for (WdInfo wdInfo : wdInfos) {
+            //开启线程
+            CompletableFuture<Void> future = CompletableFuture.runAsync(()->{
+                wdTagAnalyse(wdInfo);
+                System.out.println("进度:"+wdInfos.size()+"/"+hashtable.get("total"));
+                hashtable.put("total",hashtable.get("total")+1);
+            },executorService);
+            list.add(future);
+        }
+        CompletableFuture.allOf(list.toArray(new CompletableFuture[list.size()])).join();
+        long end = System.currentTimeMillis();
+        System.out.println("完成打标签 "+(end-start)/(1000*60));
+
+    }
 
 
 }

+ 41 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/AttentionPoolStat.java

@@ -0,0 +1,41 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.ruoyi.benyun.entity.AttentionPoolStatistics;
+import com.ruoyi.benyun.mapper.AttentionPoolDao;
+import com.ruoyi.benyun.mapper.AttentionPoolStatisticsDao;
+import com.ruoyi.benyun.mapper.BusinessOpportunitiesDao;
+import com.ruoyi.benyun.mapper.FollowUpDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class AttentionPoolStat {
+    @Autowired
+    AttentionPoolDao poolDao;
+    @Autowired
+    BusinessOpportunitiesDao opportunitiesDao;
+    @Autowired
+    FollowUpDao followUpDao;
+    @Autowired
+    AttentionPoolStatisticsDao statisticsDao;
+
+    public void insert(){
+        List<String> ins = poolDao.selectAllUser();
+        for (String userId : ins){
+            AttentionPoolStatistics statistics = new AttentionPoolStatistics();
+            statistics.setStatId(UUID.randomUUID().toString().replace("-",""));
+            statistics.setAttentionCount(poolDao.selectCount(userId));
+            statistics.setClueCount(opportunitiesDao.selectCount(userId));
+            statistics.setOnlineCount(followUpDao.selectCountByWay(userId,"线上电话"));
+            statistics.setOfflineCount(followUpDao.selectCountByWay(userId,"线下实地"));
+            statistics.setUserId(userId);
+            statistics.setStatTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+            statisticsDao.insert(statistics);
+        }
+    }
+}

+ 30 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/BrandBusinessStat.java

@@ -0,0 +1,30 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.ruoyi.demo.entity.BrandBusiness;
+import com.ruoyi.demo.mapper.BrandBusinessDao;
+import com.ruoyi.demo.mapper.BrandZoneDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+public class BrandBusinessStat {
+    @Autowired
+    BrandBusinessDao brandBusinessDao;
+    @Autowired
+    BrandZoneDao zoneDao;
+
+    public void continueInsert(){
+//        List<String> ins = brandBusinessDao.selectIns();
+//        System.out.println("已经处理:" + ins.size() + "个");
+        List<String> ins = zoneDao.selectIns();
+        List<BrandBusiness> brandBusinesses = brandBusinessDao.selectByStatistics(ins);
+        int i = 0;
+        int total = brandBusinesses.size();
+        for (BrandBusiness business : brandBusinesses){
+            i += brandBusinessDao.insert(business);
+            System.out.println(i + "/" + total);
+        }
+    }
+}

+ 59 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/BrandCityStat.java

@@ -0,0 +1,59 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.benyun.entity.Brand;
+import com.ruoyi.benyun.entity.BrandCity;
+import com.ruoyi.benyun.mapper.BrandCityDao;
+import com.ruoyi.benyun.mapper.BrandDao;
+import com.ruoyi.benyun.mapper.BrandZoneDao;
+import com.ruoyi.benyun.mapper.StoreDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class BrandCityStat {
+    @Autowired
+    BrandDao brandDao;
+    @Autowired
+    BrandCityDao brandCityDao;
+    @Autowired
+    BrandZoneDao brandZoneDao;
+    @Autowired
+    StoreDao storeDao;
+
+    public void continueInsert(){
+//        List<String> ins = brandCityDao.selectIns();
+//        System.out.println("已处理:" + notIns.size() + "个");
+//        List<Brand> brands = brandDao.searchNotIns(notIns);
+        List<String> ins = brandZoneDao.selectIns();
+        QueryWrapper<Brand> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("brand_id",ins);
+        List<Brand> brands = brandDao.selectList(queryWrapper);
+        int index = 1;
+        int total = brands.size();
+        for (Brand brand : brands){
+//            统计本月
+            String month = LocalDateTime.now(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM"));
+            List<BrandCity> cities = brandCityDao.searchByBrandIdOrderByCity(brand.getBrandId(),month);
+            if (cities.isEmpty()){
+                System.out.println(index+"/"+total);
+                index++;
+                continue;
+            }
+            for (BrandCity city : cities){
+                city.setDisId(UUID.randomUUID().toString().replace("-",""));
+                city.setBrandId(brand.getBrandId());
+                city.setUpdateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+            }
+            brandCityDao.insertAll(cities);
+            System.out.println(index+"/"+total);
+            index++;
+        }
+    }
+}

+ 26 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/BrandEvolveStat.java

@@ -0,0 +1,26 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.ruoyi.benyun.entity.BrandEvolve;
+import com.ruoyi.benyun.mapper.BrandEvolveDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class BrandEvolveStat {
+    @Autowired
+    BrandEvolveDao brandEvolveDao;
+
+    public void insertAll(){
+        List<BrandEvolve> evolves = brandEvolveDao.selectAllByStatistics();
+        int total = evolves.size();
+        int i = 0;
+        for (BrandEvolve evolve : evolves){
+            evolve.setStatId(UUID.randomUUID().toString().replace("-",""));
+            i += brandEvolveDao.insert(evolve);
+            System.out.println(i+"/"+total);
+        }
+    }
+}

+ 56 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/BrandProvinceStat.java

@@ -0,0 +1,56 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.benyun.entity.Brand;
+import com.ruoyi.benyun.entity.BrandProvince;
+import com.ruoyi.benyun.mapper.BrandCityDao;
+import com.ruoyi.benyun.mapper.BrandDao;
+import com.ruoyi.benyun.mapper.BrandProvinceDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class BrandProvinceStat {
+    @Autowired
+    BrandDao brandDao;
+    @Autowired
+    BrandProvinceDao brandProvinceDao;
+    @Autowired
+    BrandCityDao cityDao;
+
+    public void continueInsert(){
+//        List<String> notIns = brandProvinceDao.selectIns();
+//        System.out.println("已处理:" + notIns.size() + "个");
+//        List<Brand> brands = brandDao.searchNotIns(notIns);
+        List<String> ins = cityDao.selectIns();
+        QueryWrapper<Brand> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("brand_id",ins);
+        List<Brand> brands = brandDao.selectList(queryWrapper);
+        int index = 1;
+        int total = brands.size();
+        for (Brand brand : brands){
+//            统计本月
+            String month = LocalDateTime.now(ZoneId.of("Asia/Shanghai")).format(DateTimeFormatter.ofPattern("yyyy-MM"));
+            List<BrandProvince> provinces = brandProvinceDao.searchByBrandIdOrderByProvince(brand.getBrandId(),month);
+            if (provinces.isEmpty()){
+                System.out.println(index+"/"+total);
+                index++;
+                continue;
+            }
+            for (BrandProvince bp : provinces){
+                bp.setDisId(UUID.randomUUID().toString().replace("-",""));
+                bp.setBrandId(brand.getBrandId());
+                bp.setUpdateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+            }
+            brandProvinceDao.insertAll(provinces);
+            System.out.println(index+"/"+total);
+            index++;
+        }
+    }
+}

+ 89 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/BrandStat.java

@@ -0,0 +1,89 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.benyun.entity.Brand;
+import com.ruoyi.benyun.entity.BrandBusiness;
+import com.ruoyi.benyun.entity.BrandStatistics;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class BrandStat {
+    @Autowired
+    BrandDao brandMapper;
+    @Autowired
+    BrandZoneDao brandZoneDao;
+    @Autowired
+    StoreDao storeDao;
+    @Autowired
+    BrandStatisticsDao brandStatisticsDao;
+    @Autowired
+    BrandCityDao cityDao;
+    @Autowired
+    BrandProvinceDao provinceDao;
+    @Autowired
+    BrandBusinessDao businessDao;
+
+    public void continueInsertPlus2(){
+//        查询已统计的品牌
+//        List<String> notIns = brandStatisticsDao.searchStated();
+//        System.out.println("已处理品牌:"+notIns.size()+"个");
+//        处理剩下的
+//        List<Brand> brands = brandMapper.searchNotIns(notIns);
+        List<String> ins = brandZoneDao.selectIns();
+        QueryWrapper<Brand> queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("brand_id",ins);
+        List<Brand> brands = brandMapper.selectList(queryWrapper);
+        int index = 0;
+        int total = brands.size();
+        for (Brand brand : brands){
+            BrandStatistics statistics = new BrandStatistics();
+            statistics.setStatId(UUID.randomUUID().toString().replace("-",""));
+            statistics.setBrandId(brand.getBrandId());
+            statistics.setBrandName(brand.getBrandName());
+            statistics.setCoverProvinceCount(provinceDao.selectCountByBrandId(brand.getBrandId()));
+            statistics.setCoverCityCount(cityDao.selectCountByBrandId(brand.getBrandId()));
+            statistics.setCoverZoneCount(brandZoneDao.searchZoneCountByBrandId(brand.getBrandId()));
+
+            QueryWrapper<BrandBusiness> nomalStatusQueryWrapper = new QueryWrapper<>();
+            nomalStatusQueryWrapper.eq("brand_id",brand.getBrandId());
+            nomalStatusQueryWrapper.eq("business_status","正常");
+            BrandBusiness nomalStatus = businessDao.selectOne(nomalStatusQueryWrapper);
+            if (nomalStatus == null)
+                statistics.setBusinessCount(0);
+            else
+                statistics.setBusinessCount(nomalStatus.getCount());
+//            statistics.setBusinessCount(storeDao.searchNomalStatusByBrandId(brand.getBrandId()));
+
+            QueryWrapper<BrandBusiness> pauseStatusQueryWrapper = new QueryWrapper<>();
+            pauseStatusQueryWrapper.eq("brand_id",brand.getBrandId());
+            pauseStatusQueryWrapper.eq("business_status","暂停");
+            BrandBusiness pauseStatus = businessDao.selectOne(pauseStatusQueryWrapper);
+            if (pauseStatus == null)
+                statistics.setPauseBusinessCount(0);
+            else
+                statistics.setPauseBusinessCount(pauseStatus.getCount());
+//            statistics.setPauseBusinessCount(storeDao.searchPauseStatusByBrandId(brand.getBrandId()));
+
+            QueryWrapper<BrandBusiness> noStatusQueryWrapper = new QueryWrapper<>();
+            noStatusQueryWrapper.eq("brand_id",brand.getBrandId());
+            noStatusQueryWrapper.eq("business_status","尚未营业");
+            BrandBusiness noStatus = businessDao.selectOne(noStatusQueryWrapper);
+            if (noStatus == null)
+                statistics.setNoBusinessCount(0);
+            else
+                statistics.setNoBusinessCount(noStatus.getCount());
+//            statistics.setNoBusinessCount(storeDao.searchNoStatusByBrandId(brand.getBrandId()));
+
+            statistics.setTotal(statistics.getBusinessCount() + statistics.getPauseBusinessCount() + statistics.getNoBusinessCount());
+            statistics.setUpdateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+            index += brandStatisticsDao.insert(statistics);
+            System.out.println(index + "/" + total);
+        }
+    }
+}

+ 53 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/BrandZoneStat.java

@@ -0,0 +1,53 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ruoyi.benyun.entity.AddrCategory;
+import com.ruoyi.benyun.entity.BrandZone;
+import com.ruoyi.benyun.mapper.AddrCategoryDao;
+import com.ruoyi.benyun.mapper.BrandDao;
+import com.ruoyi.benyun.mapper.BrandZoneDao;
+import com.ruoyi.benyun.mapper.StoreDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.List;
+import java.util.UUID;
+
+@Component
+public class BrandZoneStat {
+    @Autowired
+    StoreDao storeDao;
+    @Autowired
+    BrandZoneDao brandZoneDao;
+    @Autowired
+    AddrCategoryDao addrCategoryDao;
+    @Autowired
+    BrandDao brandDao;
+
+    public void continueQuicklyInsert(){
+        List<String> ins = brandDao.selectAllId();
+        List<BrandZone> zones = brandZoneDao.searchQuicklyStatistics(ins);
+        int total = zones.size();
+        int i = 0;
+        for (BrandZone zone : zones) {
+            zone.setDisId(UUID.randomUUID().toString().replace("-",""));
+            zone.setUpdateTime(LocalDateTime.now(ZoneId.of("Asia/Shanghai")));
+
+            QueryWrapper<AddrCategory> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("addr_code",zone.getAddrCode());
+            AddrCategory one = addrCategoryDao.selectOne(queryWrapper);
+            if (one != null){
+                zone.setZone(one.getDistrict());
+                zone.setCity(one.getCity());
+                zone.setProvince(one.getProvince());
+                zone.setLat(one.getLatGd());
+                zone.setLng(one.getLngGd());
+            }
+
+            i += brandZoneDao.insert(zone);
+            System.out.println(i+"/"+total);
+        }
+    }
+}

+ 58 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/StoreWdOpcloseStat.java

@@ -0,0 +1,58 @@
+package com.ruoyi.demo.utils.statistics;
+
+import com.ruoyi.demo.entity.StoreWdOpclose;
+import com.ruoyi.demo.mapper.StoreWdOpcloseDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@Component
+public class StoreWdOpcloseStat {
+    @Autowired
+    StoreWdOpcloseDao storeWdOpcloseDao;
+
+    public void continueInsertAll(){
+        // 已分析的门店
+        List<String> ins = storeWdOpcloseDao.selectIns();
+        System.out.println("已处理:" + ins.size() + "个");
+        // 未分析的门店
+        List<StoreWdOpclose> storeWdOpcloses = storeWdOpcloseDao.selectStatistics(ins);
+        int total = storeWdOpcloses.size();
+        int i = 0;
+        for (StoreWdOpclose storeWd : storeWdOpcloses) {
+            if (storeWd.getBusinessTime().equals("24小时营业")) {
+                storeWd.setStartTime("00:00");
+                storeWd.setEndTime("24:00");
+            } else {
+//            String str = "周一至周日:07:00-17:00 18:00-23:00";
+                Pattern pattern = Pattern.compile("\\d{2}:\\d{2}");
+//            Matcher matcher = pattern.matcher(str);
+                Matcher matcher = pattern.matcher(storeWd.getBusinessTime());
+
+                String minTime = null, maxTime = null;
+                while (matcher.find()) {
+                    String time = matcher.group();
+                    if (minTime == null || time.compareTo(minTime) < 0) {
+                        // 如果当前时间小于最小时间,则更新最小时间
+                        minTime = time;
+                    }
+                    if (maxTime == null || time.compareTo(maxTime) > 0) {
+                        // 如果当前时间大于最大时间,则更新最大时间
+                        maxTime = time;
+                    }
+                }
+
+//            System.out.println("最小时间:" + minTime);
+//            System.out.println("最大时间:" + maxTime);
+                storeWd.setStartTime(minTime);
+                storeWd.setEndTime(maxTime);
+                i += storeWdOpcloseDao.insert(storeWd);
+                System.out.println(i + "/" + total);
+            }
+        }
+
+    }
+}

+ 59 - 0
ruoyi-demo/src/main/java/com/ruoyi/demo/utils/statistics/Together.java

@@ -0,0 +1,59 @@
+package com.ruoyi.demo.utils.statistics;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class Together {
+    @Autowired
+    StoreWdOpcloseStat opcloseStat;
+    @Autowired
+    StoreWdOpcloseDao opcloseDao;
+    @Autowired
+    BrandZoneStat zoneStat;
+    @Autowired
+    BrandZoneDao zoneDao;
+    @Autowired
+    BrandCityStat cityStat;
+    @Autowired
+    BrandCityDao cityDao;
+    @Autowired
+    BrandProvinceStat provinceStat;
+    @Autowired
+    BrandProvinceDao provinceDao;
+    @Autowired
+    BrandBusinessStat businessStat;
+    @Autowired
+    BrandBusinessDao businessDao;
+    @Autowired
+    BrandStat stat;
+    @Autowired
+    BrandStatisticsDao statisticsDao;
+
+    public void start(){
+        System.out.println("开关时间统计开始······");
+        opcloseDao.delete(null);
+        opcloseStat.continueInsertAll();
+        System.out.println("开关时间统计结束······");
+        System.out.println("品牌区统计开始······");
+        zoneDao.delete(null);
+        zoneStat.continueQuicklyInsert();
+        System.out.println("品牌区统计结束······");
+        System.out.println("品牌市统计开始······");
+        cityDao.delete(null);
+        cityStat.continueInsert();
+        System.out.println("品牌市统计结束······");
+        System.out.println("品牌省统计开始······");
+        provinceDao.delete(null);
+        provinceStat.continueInsert();
+        System.out.println("品牌省统计结束······");
+        System.out.println("品牌营业状态统计开始······");
+        businessDao.delete(null);
+        businessStat.continueInsert();
+        System.out.println("品牌营业状态统计结束······");
+        System.out.println("品牌总体统计开始······");
+        statisticsDao.delete(null);
+        stat.continueInsertPlus2();
+        System.out.println("品牌总体统计结束······");
+    }
+}

+ 27 - 0
ruoyi-demo/src/main/resources/mapper/demo/StoreWdOpcloseMapper.xml

@@ -113,4 +113,31 @@
         ORDER BY
             count DESC;
     </select>
+    <select id="selectIns" resultType="java.lang.String">
+        SELECT
+            wd_id
+        FROM
+            `bl_store_wd_opclose`;
+    </select>
+    <select id="selectStatistics" resultType="com.ruoyi.demo.entity.StoreWdOpclose">
+        SELECT
+        dwi.wd_id,
+        addr_code,
+        type_code_by,
+        brand_id,
+        brand_name,
+        business_time
+        FROM
+        `ddt_wd_info` dwi,
+        `ddt_store_wd` dsw
+        WHERE
+        dwi.wd_id = dsw.wd_id
+        <if test="notIns != null">
+            <foreach collection="notIns" item="notIn" open="AND dwi.wd_id NOT IN (" separator="," close=")">
+                #{notIn,jdbcType=VARCHAR}
+            </foreach>
+        </if>
+        AND business_time <![CDATA[<>]]> ''
+        AND business_time <![CDATA[<>]]> '[]';
+    </select>
 </mapper>

+ 0 - 0
ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-prod.yml → ruoyi-extend/ruoyi-xxl-job-admin/src/main/resources/application-test.yml


+ 5 - 0
ruoyi-job/pom.xml

@@ -29,6 +29,11 @@
             <artifactId>xxl-job-core</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-demo</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 96 - 0
ruoyi-job/src/main/java/com/ruoyi/job/service/BenyunService.java

@@ -0,0 +1,96 @@
+package com.ruoyi.job.service;
+
+import com.ruoyi.demo.mapper.WdInfoDao;
+import com.ruoyi.demo.utils.WdRedisStoreage;
+import com.ruoyi.demo.utils.statistics.AttentionPoolStat;
+import com.ruoyi.demo.utils.statistics.Together;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+
+@Slf4j
+@Service
+public class BenyunService {
+
+    @Autowired
+    WdRedisStoreage wdRedisStoreage;
+
+    @Autowired
+    WdInfoDao wdInfoDao;
+    @Autowired
+    RedisTemplate redisTemplate;
+
+    @Autowired
+    AttentionPoolStat stat;
+
+    @Autowired
+    Together together;
+
+
+    /**
+     * 将网点数据加载到redis中
+     * */
+    @XxlJob("WriteRedisJob")
+    public void WriteRedisJob(){
+        Boolean aBoolean = redisTemplate.hasKey("4501");
+        if (aBoolean){
+            //将当天新的网点信息加载redis
+            XxlJobHelper.log("WriteRedisJob-day start");
+            LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
+            LocalDateTime localDateTime = now.plusDays(-1);
+            try {
+                wdRedisStoreage.writeWdGeoRedis1(localDateTime.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+                XxlJobHelper.log("WriteRedisJob-day ERROR:"+e.getMessage());
+            }
+        }else {
+            //将所有信息放入redis中心
+            XxlJobHelper.log("WriteRedisJob-full start");
+            LocalDateTime localDateTime = LocalDateTime.of(2023, 6, 1, 0,0);
+            try {
+                wdRedisStoreage.writeWdGeoRedis1(localDateTime.toString());
+            } catch (Exception e) {
+                e.printStackTrace();
+                XxlJobHelper.log("WriteRedisJob-full ERROR:"+e.getMessage());
+                redisTemplate.boundValueOps("4501").set(1);
+            }
+            AnalyseJob();
+        }
+    }
+
+    /**
+     * 网点标签分析定时任务
+     */
+    @XxlJob("AnalyseJob")
+    public void AnalyseJob(){
+        System.out.println("大统计.....");
+        wdRedisStoreage.writeWdGeoRedis2(new String[]{"1"});
+        wdRedisStoreage.writeWdGeoRedis2(new String[]{"2","3","5"});
+        System.out.println("大统计.....结束");
+    }
+
+
+    /**
+     * 关注池定时任务
+     */
+    @XxlJob("AttentionPoolJob")
+    public void AttentionPoolJob(){
+        stat.insert();
+    }
+
+    /**
+     * 品牌统计定时任务
+     * */
+    @XxlJob("BrandStatsiticsJob")
+    public void BrandStatsiticsJob(){
+        together.start();
+    }
+
+}

+ 1 - 0
ruoyi-job/src/main/java/com/ruoyi/job/service/SampleService.java

@@ -38,6 +38,7 @@ public class SampleService {
 
         for (int i = 0; i < 5; i++) {
             XxlJobHelper.log("beat at:" + i);
+            System.out.println("123456");
         }
         // default success
     }

+ 1 - 1
ruoyi-ui/vue.config.js

@@ -35,7 +35,7 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://192.168.2.38:8080`,
+        target: `http://127.0.0.1:8080`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: '/jzyx'