wenhongquan 2 лет назад
Родитель
Сommit
e23d9d7612

+ 9 - 0
ruoyi-modules/ruoyi-khy/src/main/java/org/dromara/system/controller/TblCarInfoController.java

@@ -47,6 +47,15 @@ public class TblCarInfoController extends BaseController {
     }
 
     /**
+     * 查询车辆人流量列表
+     */
+    @GetMapping("/liststaticFlow")
+    public TableDataInfo<TblCarInfoVo> liststaticFlow(TblCarInfoBo bo, PageQuery pageQuery) {
+        return tblCarInfoService.queryFlowList(bo, pageQuery);
+    }
+
+
+    /**
      * 导出车辆信息列表
      */
     //@SaCheckPermission("system:carInfo:export")

+ 141 - 22
ruoyi-modules/ruoyi-khy/src/main/java/org/dromara/system/controller/TblGpsDataController.java

@@ -1,32 +1,16 @@
 package org.dromara.system.controller;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
-import org.dromara.system.domain.CountData;
-import org.dromara.system.domain.GpsData;
-import org.dromara.system.domain.bo.CountDataBo;
-import org.dromara.system.domain.bo.GpsDataBo;
-import org.dromara.system.domain.bo.TblCarInfoBo;
-import org.dromara.system.domain.vo.CountDataVo;
-import org.dromara.system.domain.vo.GpsDataVo;
-import org.dromara.system.domain.vo.TblCarInfoVo;
-import org.dromara.system.service.ITblCarInfoService;
-import org.dromara.system.service.ITblCountDataService;
-import org.dromara.system.service.ITblGpsDataService;
-import org.dromara.util.MessageUtils;
+import org.dromara.system.domain.bo.*;
+import org.dromara.system.domain.vo.*;
+import org.dromara.system.service.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -34,6 +18,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * 车辆信息
@@ -51,6 +36,11 @@ public class TblGpsDataController extends BaseController {
 
     private final ITblCountDataService countDataService;
 
+    private final ISysDictDataService sysDictDataService;
+
+    private final ITblCarScheduleService carScheduleService;
+    private final ITblCarInfoService carInfoService;
+
     /**
      * 查询车辆信息列表
      */
@@ -61,6 +51,9 @@ public class TblGpsDataController extends BaseController {
     }
 
 
+    /**
+     * 查询设备人流量
+     */
     @GetMapping("/peoplecount/list")
     public Object list(CountDataBo bo) {
         if(bo.getParams()!=null && bo.getParams().get("times")!=null){
@@ -104,4 +97,130 @@ public class TblGpsDataController extends BaseController {
 
     }
 
+
+    /**
+     * 查询站点人流量列表
+     */
+    @GetMapping("/sites/flow")
+    public TableDataInfo<SysDictDataVo> listFalow(SysDictDataBo bo, PageQuery pageQuery) {
+
+        bo.setDictType("tbl_sites");
+        //查询站点
+        TableDataInfo<SysDictDataVo>  sites = sysDictDataService.selectPageDictDataList(bo, pageQuery);
+
+
+        List<TblCarScheduleVo> usedSchedule = new ArrayList<>();
+        //查询时间段内包含上述站点的排班
+        TblCarScheduleBo bo1 = new TblCarScheduleBo();
+        bo1.setParams(bo.getParams());
+        List<TblCarScheduleVo> scheduleVos =  carScheduleService.queryList(bo1);
+        scheduleVos.forEach(item->{
+            if(!StrUtil.isEmptyIfStr(item.getExt1())){
+                for (int i = 0; i < sites.getRows().size(); i++) {
+                    SysDictDataVo site = sites.getRows().get(i);
+                    if(item.getExt1().contains(site.getDictLabel())){
+                        usedSchedule.add(item);
+                        break;
+                    }
+                }
+            }
+        });
+        if(usedSchedule.size()<1) return sites;
+        //获取车牌
+        TblCarInfoBo bo3 = new TblCarInfoBo();
+        bo3.getParams().put("carNums",usedSchedule.stream().map(TblCarScheduleVo::getCarNum).toList());
+        List<TblCarInfoVo> carInfoVos =  carInfoService.queryList(bo3);
+        //  站点        设备     时间范围
+        Map<String,Map<String,List<Map<String,String>>>> sitesMap = new HashMap<>();
+        //车牌设备
+        Map<String,List<String>> deviceMap = new HashMap<>();
+        carInfoVos.forEach(item->{
+            JSONUtil.parseArray(item.getDeviceInfos()).toList(JSONObject.class).forEach(deviceInfo -> {
+                if(deviceInfo.getStr("type").contains("people_count")){
+                    if(deviceMap.get(item.getCarNum())==null) deviceMap.put(item.getCarNum(),new ArrayList<>());
+                    deviceMap.get(item.getCarNum()).add(deviceInfo.getStr("code"));
+                }
+            });
+        });
+        //{
+        //    "程家垄": {
+        //        "intime": "2024-05-07 10:48:34",
+        //        "outtime": "2024-05-07 10:48:39"
+        //    },
+        //    "福安客运站": {
+        //        "intime": "2024-05-07 10:47:42",
+        //        "outtime": "2024-05-07 10:48:01"
+        //    }
+        //}
+        usedSchedule.forEach(item->{
+            if(deviceMap.get(item.getCarNum())!=null) {
+                JSONObject ext1 = JSONUtil.parseObj(item.getExt1());
+                for (String key : ext1.keySet()) {
+                    if (sitesMap.get(key) == null) {
+                        sitesMap.put(key, new HashMap<>());
+                    }
+                    Map<String, List<Map<String, String>>> ideviceMap = sitesMap.get(key);
+                    deviceMap.get(item.getCarNum()).forEach(deviceCode->{
+                        if(ideviceMap.get(deviceCode)==null) ideviceMap.put(deviceCode,new ArrayList<>());
+                        ideviceMap.get(deviceCode).add(ext1.get(key, Map.class));
+                    });
+                }
+            }
+        });
+        Map<String,Map<String,Object>> sitesc = new HashMap<>();
+        sitesMap.forEach((key,value)->{
+            AtomicReference<Integer> incount = new AtomicReference<>(0);
+            AtomicReference<Integer> outcount = new AtomicReference<>(0);
+            value.forEach((deviceCode,times)->{
+                times.forEach(time->{
+                    CountDataBo bo2 = new CountDataBo();
+                    bo2.getParams().put("starttime",time.get("intime"));
+                    bo2.getParams().put("endtime",time.get("outtime"));
+                    bo2.setDevicecode(deviceCode);
+                    List<CountDataVo> countDataVos = countDataService.queryList(bo2);
+                    countDataVos.forEach(item1->{
+                        incount.updateAndGet(v -> v + item1.getIncount());
+                        outcount.updateAndGet(v -> v + item1.getOutcount());
+                    });
+                });
+            });
+            sitesc.put(key,Map.of("incount",incount.get(),"outcount",outcount.get()));
+        });
+
+        sites.getRows().forEach(item->{
+            item.setOthers(new HashMap<>());
+            if(sitesc.get(item.getDictLabel())!=null){
+                item.setOthers(sitesc.get(item.getDictLabel()));
+            }else{
+                item.getOthers().put("incount",0);
+                item.getOthers().put("outcount",0);
+            }
+        });
+
+
+//        //查询人流量数据
+//        CountDataBo bo2 = new CountDataBo();
+//        bo2.getParams().put("starttime",bo.getParams().get("starttime"));
+//        bo2.getParams().put("endtime",bo.getParams().get("endtime"));
+//        bo2.getParams().put("deviceCodes",);
+//        countDataService.queryList(bo2)
+//
+//
+//
+//        //根据排班查询车辆在站点时间
+//        for (TblCarScheduleVo scheduleVo : usedSchedule) {
+//
+//        }
+
+
+        //根据车辆查人流量数据
+
+        //统计
+
+        return sites;
+
+//        return gpsDataService.queryPageList(bo, pageQuery);
+    }
+
+
 }

+ 3 - 1
ruoyi-modules/ruoyi-khy/src/main/java/org/dromara/system/domain/vo/TblCarInfoVo.java

@@ -11,7 +11,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
-
+import java.util.Map;
 
 
 /**
@@ -109,5 +109,7 @@ public class TblCarInfoVo implements Serializable {
 
     private Object location;
 
+    private Map<String,Object> others;
+
 
 }

+ 2 - 0
ruoyi-modules/ruoyi-khy/src/main/java/org/dromara/system/service/ITblCarInfoService.java

@@ -32,6 +32,8 @@ public interface ITblCarInfoService {
      */
     List<TblCarInfoVo> queryList(TblCarInfoBo bo);
 
+    TableDataInfo<TblCarInfoVo> queryFlowList(TblCarInfoBo bo, PageQuery pageQuery);
+
     /**
      * 新增车辆信息
      */

+ 69 - 5
ruoyi-modules/ruoyi-khy/src/main/java/org/dromara/system/service/impl/TblCarInfoServiceImpl.java

@@ -11,9 +11,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.system.domain.CountData;
 import org.dromara.system.domain.GpsData;
 import org.dromara.system.domain.TblCarSchedule;
+import org.dromara.system.domain.bo.CountDataBo;
+import org.dromara.system.domain.vo.CountDataVo;
+import org.dromara.system.mapper.TblCountDataMapper;
 import org.dromara.system.mapper.TblGpsDataMapper;
+import org.dromara.system.service.ITblCountDataService;
 import org.dromara.util.CamelDataUtil;
 import org.dromara.util.MessageUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,10 +29,7 @@ import org.dromara.system.domain.TblCarInfo;
 import org.dromara.system.mapper.TblCarInfoMapper;
 import org.dromara.system.service.ITblCarInfoService;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.util.*;
 
 /**
  * 车辆信息Service业务层处理
@@ -43,6 +45,8 @@ public class TblCarInfoServiceImpl implements ITblCarInfoService {
 
 
     private final TblGpsDataMapper gpsDataMapper;
+
+    private final ITblCountDataService countDataMapper;
     /**
      * 查询车辆信息
      */
@@ -92,6 +96,61 @@ public class TblCarInfoServiceImpl implements ITblCarInfoService {
         return list;
     }
 
+    @Override
+    public TableDataInfo<TblCarInfoVo> queryFlowList(TblCarInfoBo bo, PageQuery pageQuery){
+        LambdaQueryWrapper<TblCarInfo> lqw = buildQueryWrapper(bo);
+        Page<TblCarInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<String> codes = new ArrayList<>();
+        result.getRecords().forEach(carInfoVo -> {
+            JSONUtil.parseArray(carInfoVo.getDeviceInfos()).toList(JSONObject.class).forEach(deviceInfo -> {
+                if(deviceInfo.getStr("type").equals("people_count")){
+                    codes.add( deviceInfo.getStr("code"));
+                }
+            });
+        });
+        Map<String,List<CountDataVo>> countDataMap = new HashMap<>();
+        //查流量
+        if(codes.size()>0){
+            CountDataBo q = new CountDataBo();
+            q.setParams(bo.getParams());
+            q.getParams().put("deviceCodes",codes);
+           List<CountDataVo> countDataList = countDataMapper.queryList(q);
+            if(countDataList.size()>0){
+                countDataList.forEach(countData -> {
+                    if(countDataMap.get(countData.getDevicecode())==null){
+                        List<CountDataVo> countDataList1 = new ArrayList<>();
+                        countDataList1.add(countData);
+                        countDataMap.put(countData.getDevicecode(),countDataList1);
+                    }else{
+                        countDataMap.get(countData.getDevicecode()).add(countData);
+                    }
+                });
+            }
+        }
+        try {
+
+            result.getRecords().forEach(carInfoVo -> {
+                carInfoVo.setOthers(new HashMap<>());
+                carInfoVo.getOthers().put("incount",0);
+                carInfoVo.getOthers().put("outcount",0);
+                JSONUtil.parseArray(carInfoVo.getDeviceInfos()).toList(JSONObject.class).forEach(deviceInfo -> {
+                    if(deviceInfo.getStr("type").equals("people_count")){
+                        if(countDataMap.get(deviceInfo.getStr("code"))!=null && countDataMap.get(deviceInfo.getStr("code")).size()>0){
+                            List<CountDataVo> countDataList = countDataMap.get(deviceInfo.getStr("code"));
+                            if(countDataList.size()>0){
+                                countDataList.stream().reduce((a,b)->{a.setIncount(a.getIncount()+b.getIncount());a.setOutcount(a.getOutcount()+b.getOutcount());return a;});
+                                carInfoVo.getOthers().put("incount",countDataList.get(0).getIncount());
+                                carInfoVo.getOthers().put("outcount",countDataList.get(0).getOutcount());
+                            }
+                        }
+                    }
+                });
+            });
+        }catch (Exception e){}
+
+        return TableDataInfo.build(result);
+    }
+
     private LambdaQueryWrapper<TblCarInfo> buildQueryWrapper(TblCarInfoBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<TblCarInfo> lqw = Wrappers.lambdaQuery();
@@ -106,10 +165,15 @@ public class TblCarInfoServiceImpl implements ITblCarInfoService {
         lqw.eq(StringUtils.isNotBlank(bo.getTrafficAccidentInfo()), TblCarInfo::getTrafficAccidentInfo, bo.getTrafficAccidentInfo());
         lqw.eq(StringUtils.isNotBlank(bo.getViolationInfo()), TblCarInfo::getViolationInfo, bo.getViolationInfo());
         lqw.eq(StringUtils.isNotBlank(bo.getChangeInfo()), TblCarInfo::getChangeInfo, bo.getChangeInfo());
+
+        if(bo.getParams()!=null && bo.getParams().get("carNums")!=null){
+            lqw.in(TblCarInfo::getCarNum,String.join(",",(List) bo.getParams().get("carNums")));
+        }
+
         //lqw.eq(StringUtils.isNotBlank(bo.getExt1()), TblCarInfo::getExt1, bo.getExt1());
         //lqw.eq(StringUtils.isNotBlank(bo.getExt2()), TblCarInfo::getExt2, bo.getExt2());
 
-        if(bo.getParams().get("driverInfo")!=null && bo.getParams().get("driverInfo")!=null){
+        if(bo.getParams()!=null && bo.getParams().get("driverInfo")!=null){
             lqw.apply(StringUtils.format("ext2->'$.driverInfo'={}",bo.getParams().get("driverInfo")));
 //            lqw.like(bo.getParams().get("driverInfo")!=null, TblCarInfo::getExt2, bo.getParams().get("driverInfo"));
         }

+ 4 - 0
ruoyi-modules/ruoyi-khy/src/main/java/org/dromara/system/service/impl/TblCountDataServiceImpl.java

@@ -69,7 +69,11 @@ public class TblCountDataServiceImpl implements ITblCountDataService {
                 lqw.gt(bo.getParams().get("starttime") != null, CountData::getTs, bo.getParams().get("starttime"));
                 lqw.lt(bo.getParams().get("endtime") != null, CountData::getTs, bo.getParams().get("endtime"));
             }
+            if(bo.getParams().get("deviceCodes")!=null){
+                lqw.in(CountData::getDevicecode, String.join(",",(List) bo.getParams().get("deviceCodes")));
+            }
         }
+
         return lqw;
     }
 

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java

@@ -11,6 +11,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.Map;
 
 
 /**
@@ -85,4 +86,6 @@ public class SysDictDataVo implements Serializable {
     @ExcelProperty(value = "创建时间")
     private Date createTime;
 
+    private Map<String,Object> others;
+
 }