zxl
2025-04-22 f0a6462c539e217186d6fee31dfec6d2aba2e92a
点位在线率
6个文件已修改
2个文件已添加
1 文件已重命名
471 ■■■■■ 已修改文件
ycl-common/src/main/java/constant/PointOnlineHeaders.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/RecordingAvailabilityHeaders.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/TableNameConstants.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/DynamicColumnController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/DataCenterService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java 386 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DynamicColumnServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/MongoUtil.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/PointOnlineHeaders.java
New file
@@ -0,0 +1,14 @@
package constant;
public class PointOnlineHeaders {
    public static final String  no = "国标码";
    public static final String name = "设备名";
    public static final String ip = "IP";
    public static final String onlineStr = "设备状态";
    public static final String pingOnlineStr = "最近Ping监测状态";
    public static final String checkCount = "当日监测次数";
    public static final String offLineCount = "当日离线次数";
    public static final String offLineTimeStr = "离线时间点";
    public static final String mongoCreateTime = "监测时间";
}
ycl-common/src/main/java/constant/RecordingAvailabilityHeaders.java
File was renamed from ycl-common/src/main/java/constant/RecordingAvailability.java
@@ -1,6 +1,6 @@
package constant;
public class RecordingAvailability {
public class RecordingAvailabilityHeaders {
    public final static String arealayername = "行政区域";
    public final static String arealayerno = "行政区域ID";
ycl-common/src/main/java/constant/TableNameConstants.java
New file
@@ -0,0 +1,12 @@
package constant;
import lombok.Data;
@Data
public class TableNameConstants {
    public final static String COLUMN_NAME_VIDEO = "uy_record_meta_d_sum";
    public final static String COLUMN_NAME_FACE_POINT = "t_monitor_online_FACE";
    public final static String COLUMN_NAME_CAR_POINT = "t_monitor_online_CAR";
    public final static String COLUMN_NAME_VIDEO_POINT = "t_monitor_online_VIDEO";
}
ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java
@@ -199,12 +199,23 @@
        dataCenterService.recordingAvailabilityExport(response, query);
    }
    @PostMapping("/pointOnline/export")
    public void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException {
    @PostMapping("/pointOnlineVideo/export")
    public void pointOnlineVideoExport(HttpServletResponse response,DataCenterQuery query) throws IOException {
        query.setTime();
         dataCenterService.pointOnlineExport(response,query);
        dataCenterService.pointOnlineVideoExport(response,query);
    }
    @PostMapping("/pointOnlineCar/export")
    public void pointOnlineCarExport(HttpServletResponse response,DataCenterQuery query) throws IOException {
        query.setTime();
        dataCenterService.pointOnlineCarExport(response,query);
    }
    @PostMapping("/pointOnlineFace/export")
    public void pointOnlineFaceExport(HttpServletResponse response,DataCenterQuery query) throws IOException {
        query.setTime();
        dataCenterService.pointOnlineFaceExport(response,query);
    }
    /**
     * 视频:导出重点点位标注正确率
ycl-server/src/main/java/com/ycl/platform/controller/DynamicColumnController.java
@@ -2,6 +2,7 @@
import com.ycl.system.Result;
import com.ycl.system.domain.group.Add;
import constant.TableNameConstants;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
@@ -13,6 +14,8 @@
import com.ycl.platform.service.DynamicColumnService;
import com.ycl.platform.domain.form.DynamicColumnForm;
import org.springframework.web.bind.annotation.*;
import static constant.TableNameConstants.COLUMN_NAME_VIDEO;
/**
 * 动态列 前端控制器
@@ -69,22 +72,28 @@
        return dynamicColumnService.addByTableName(tableName,form);
    }
    private final static String COLUMN_NAME_VIDEO = "uy_record_meta_d_sum";
    private final static String COLUMN_NAME_POINT = "";
    @PutMapping("/updateByTableName")
    @ApiOperation(value = "修改", notes = "修改")
    public Result updateByTableName(@RequestParam @NotNull(message = "路径名不能为空")String pathName, @RequestBody @NotEmpty(message = "数据为空,无法保存") List<DynamicColumnForm> columnList){
        String tableName = getTableNameByPathNane(pathName);
        if ("".equals(tableName)){
            return null;
        }
        return dynamicColumnService.updateByTableName(tableName,columnList);
    }
    private String getTableNameByPathNane(String pathName) {
        String tableName = "";
        if ("录像可用率".equals(pathName)){
            tableName = COLUMN_NAME_VIDEO;
        }else if("点位在线率".equals(pathName)){
            tableName = COLUMN_NAME_POINT;
            tableName = TableNameConstants.COLUMN_NAME_VIDEO;
        }else if("车辆点位在线率".equals(pathName)){
            tableName = TableNameConstants.COLUMN_NAME_CAR_POINT;
        }else if("人脸点位在线率".equals(pathName)){
            tableName = TableNameConstants.COLUMN_NAME_FACE_POINT;
        }else if("视频点位在线率".equals(pathName)){
            tableName = TableNameConstants.COLUMN_NAME_VIDEO_POINT;
        }
        return tableName;
    }
ycl-server/src/main/java/com/ycl/platform/service/DataCenterService.java
@@ -24,7 +24,10 @@
    void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery query) throws IOException;
    void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException ;
    void pointOnlineFaceExport(HttpServletResponse response,DataCenterQuery query) throws IOException ;
    void pointOnlineVideoExport(HttpServletResponse response, DataCenterQuery query) throws IOException;
    void pointOnlineCarExport(HttpServletResponse response, DataCenterQuery query) throws IOException;
    Result updateDynamicValue(UpdateDynamicValueForm form);
@@ -299,4 +302,6 @@
    Result faceAvailabilityOfLargeImg(DataCenterQuery query);
    Result videoImageResourceSecurity(DataCenterQuery query);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -2,8 +2,6 @@
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
@@ -11,8 +9,6 @@
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.excel.RecordingAvailabilityExport;
import com.ycl.platform.domain.excel.TMonitorExp;
import com.ycl.platform.domain.form.UpdateDynamicValueForm;
import com.ycl.platform.domain.query.DataCenterQuery;
import com.ycl.platform.domain.result.HK.*;
@@ -22,22 +18,17 @@
import com.ycl.platform.domain.vo.DataCenter.MonitorQualifyResultVO;
import com.ycl.platform.domain.vo.DataCenter.SnapClockVO;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import com.ycl.platform.domain.vo.PointDetailVO;
import com.ycl.platform.domain.vo.home.HomeFaceVO;
import com.ycl.platform.mapper.DynamicColumnMapper;
import com.ycl.platform.mapper.ImageResourceSecurityDetailMapper;
import com.ycl.platform.mapper.YwPointMapper;
import com.ycl.platform.service.*;
import com.ycl.system.Result;
import com.ycl.system.page.PageUtil;
import com.ycl.utils.DateUtils;
import com.ycl.utils.MongoUtil;
import com.ycl.utils.StringUtils;
import com.ycl.utils.bean.BeanUtils;
import com.ycl.utils.poi.ExcelUtil;
import constant.ApiConstants;
import constant.CheckConstants;
import constant.RecordingAvailability;
import constant.*;
import enumeration.general.AreaDeptEnum;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
@@ -49,7 +40,6 @@
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.stereotype.Service;
import java.io.IOException;
@@ -95,28 +85,28 @@
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
        }
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName("uy_record_meta_d_sum");
        //翻译行政区域
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName());
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_VIDEO);
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        //提那家固定表头
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(RecordingAvailability.arealayername);
        headers.add(RecordingAvailability.arealayerno);
        headers.add(RecordingAvailability.createTime);
        headers.add(RecordingAvailability.deviceId);
        headers.add(RecordingAvailability.missDuration);
        headers.add(RecordingAvailability.platId);
        headers.add(RecordingAvailability.recordDuration);
        headers.add(RecordingAvailability.recordStatusText);
        headers.add(RecordingAvailability.statTime);
        headers.add(RecordingAvailabilityHeaders.arealayername);
        headers.add(RecordingAvailabilityHeaders.arealayerno);
        headers.add(RecordingAvailabilityHeaders.createTime);
        headers.add(RecordingAvailabilityHeaders.deviceId);
        headers.add(RecordingAvailabilityHeaders.missDuration);
        headers.add(RecordingAvailabilityHeaders.platId);
        headers.add(RecordingAvailabilityHeaders.recordDuration);
        headers.add(RecordingAvailabilityHeaders.recordStatusText);
        headers.add(RecordingAvailabilityHeaders.statTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader("uy_record_meta_d_sum");
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_VIDEO);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
@@ -168,8 +158,342 @@
    }
    @Override
    public void pointOnlineExport(HttpServletResponse response,DataCenterQuery query) throws IOException  {
    public void pointOnlineFaceExport(HttpServletResponse response, DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查人脸设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Face + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(sort);
        MongoUtil.setNoPage(query, params, TIME_FIELD);
        //分页数量
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(0, 2);
                }
                item.setOffLineTimeStr(offLineTime);
            }
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_FACE_POINT);
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointOnlineHeaders.no);
        headers.add(PointOnlineHeaders.name);
        headers.add(PointOnlineHeaders.ip);
        headers.add(PointOnlineHeaders.onlineStr);
        headers.add(PointOnlineHeaders.pingOnlineStr);
        headers.add(PointOnlineHeaders.checkCount);
        headers.add(PointOnlineHeaders.offLineCount);
        headers.add(PointOnlineHeaders.offLineTimeStr);
        headers.add(PointOnlineHeaders.mongoCreateTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_FACE_POINT);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        List<List<Object>> data = new ArrayList<>();
        for (TMonitorResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getNo());
            row.add(result.getName());
            row.add(result.getIp());
            row.add(result.getOnlineStr());
            row.add(result.getPingOnlineStr());
            row.add(result.getCheckCount());
            row.add(result.getOffLineCount());
            if (CollectionUtils.isEmpty(result.getOffLineTimeStr())){
                row.add(null);
            }else {
                row.add(result.getOffLineTimeStr().toString());
            }
            row.add(result.getMongoCreateTime());
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getNo());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("人脸点位在线率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    @Override
    public void pointOnlineVideoExport(HttpServletResponse response, DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(sort);
        MongoUtil.setNoPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(offLineTime.size() - 2, offLineTime.size());
                }
                item.setOffLineTimeStr(offLineTime);
            }
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_VIDEO_POINT);
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointOnlineHeaders.no);
        headers.add(PointOnlineHeaders.name);
        headers.add(PointOnlineHeaders.ip);
        headers.add(PointOnlineHeaders.onlineStr);
        headers.add(PointOnlineHeaders.pingOnlineStr);
        headers.add(PointOnlineHeaders.checkCount);
        headers.add(PointOnlineHeaders.offLineCount);
        headers.add(PointOnlineHeaders.offLineTimeStr);
        headers.add(PointOnlineHeaders.mongoCreateTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_VIDEO_POINT);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        List<List<Object>> data = new ArrayList<>();
        for (TMonitorResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getNo());
            row.add(result.getName());
            row.add(result.getIp());
            row.add(result.getOnlineStr());
            row.add(result.getPingOnlineStr());
            row.add(result.getCheckCount());
            row.add(result.getOffLineCount());
            if (CollectionUtils.isEmpty(result.getOffLineTimeStr())){
                row.add(null);
            }else {
                row.add(result.getOffLineTimeStr().toString());
            }
            row.add(result.getMongoCreateTime());
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getNo());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("视频点位在线率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    @Override
    public void pointOnlineCarExport(HttpServletResponse response, DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查车辆设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Car + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(sort);
        //分页数量
        //系统ping的结果
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(0, 2);
                }
                item.setOffLineTimeStr(offLineTime);
            }
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_CAR_POINT);
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointOnlineHeaders.no);
        headers.add(PointOnlineHeaders.name);
        headers.add(PointOnlineHeaders.ip);
        headers.add(PointOnlineHeaders.onlineStr);
        headers.add(PointOnlineHeaders.pingOnlineStr);
        headers.add(PointOnlineHeaders.checkCount);
        headers.add(PointOnlineHeaders.offLineCount);
        headers.add(PointOnlineHeaders.offLineTimeStr);
        headers.add(PointOnlineHeaders.mongoCreateTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_CAR_POINT);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        List<List<Object>> data = new ArrayList<>();
        for (TMonitorResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getNo());
            row.add(result.getName());
            row.add(result.getIp());
            row.add(result.getOnlineStr());
            row.add(result.getPingOnlineStr());
            row.add(result.getCheckCount());
            row.add(result.getOffLineCount());
            if (CollectionUtils.isEmpty(result.getOffLineTimeStr())){
                row.add(null);
            }else {
                row.add(result.getOffLineTimeStr().toString());
            }
            row.add(result.getMongoCreateTime());
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getNo());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("车辆点位在线率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    @Override
@@ -238,6 +562,7 @@
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
@@ -260,7 +585,12 @@
                }
                item.setOffLineTimeStr(offLineTime);
            }
            //添加动态数据
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_VIDEO_POINT,item.getNo());
            item.setDynamicColumnList(list);
        });
        params.setDeptTag(-1);
        params.setDeviceType(1);
@@ -956,7 +1286,7 @@
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName());
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable("uy_record_meta_d_sum",item.getId());
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_VIDEO,item.getId());
            item.setDynamicColumnList(list);
        });
@@ -1712,6 +2042,9 @@
                }
                item.setOffLineTimeStr(offLineTime);
            }
            //添加动态数据
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_CAR_POINT,item.getNo());
            item.setDynamicColumnList(list);
        });
        // 统计设备数量
@@ -2583,6 +2916,9 @@
                }
                item.setOffLineTimeStr(offLineTime);
            }
            //添加动态数据
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_FACE_POINT,item.getNo());
            item.setDynamicColumnList(list);
        });
        params.setDeptTag(-1);
        params.setDeviceType(3);
ycl-server/src/main/java/com/ycl/platform/service/impl/DynamicColumnServiceImpl.java
@@ -132,9 +132,11 @@
    @Override
    public Result removeById(String id) {
        baseMapper.deleteById(id);
        //todo 删除字段对应值
        return Result.ok("删除成功");
    }
    /**
     * 列表
     * @return
ycl-server/src/main/java/com/ycl/utils/MongoUtil.java
@@ -114,7 +114,17 @@
        query.with(Sort.by(Sort.Order.desc(timeFiled))).skip(params.getSkipNum()).limit(Math.toIntExact(params.getPageSize()));
    }
    /**
     * 构造数据中心搜索的条件
     *
     * @param query 查询条件
     * @param timeFiled 时间字段是哪一个
     * @param params 请求参数
     */
    public static void setNoPage(Query query,DataCenterQuery params, String timeFiled) {
        // 排序分页
        query.with(Sort.by(Sort.Order.desc(timeFiled))).skip(params.getSkipNum());
    }
    /**
     * 构造数据中心搜索的条件
     *