fuliqi
2024-10-14 e4c69bcd4ba18dd022dd4ed86da96c5e4b8b3150
动态列导出编辑完成
18个文件已修改
1个文件已添加
394 ■■■■ 已修改文件
ycl-common/src/main/java/constant/PointHeaderConstant.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DynamicColumnValue.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DynamicColumnVO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/UpdateOnlineVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/DynamicColumnMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/UYErrorTypeCheckServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java 143 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/HKTask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/MonitorTask.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/UYTask.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/DynamicColumnMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/PointHeaderConstant.java
@@ -1,13 +1,23 @@
package constant;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
 * 点位导出表头常量
 */
public class PointHeaderConstant {
    public final static String ID = "id";
    public final static String Point_Name = "点位名称(可修改)";
    public final static String Serial_Number = "国标码(不可修改)";
    public final static String IP = "点位IP(可修改)";
    public final static String Province_Tag = "是否省厅标签(可修改)";
    public final static String Impotrant_Command_Image = "是否重点指挥图像(可修改)";
    public final static String Dept_Tag = "是否部级标签(可修改)";
    // 可以将这些已知的键放入一个集合中,方便检查
    public static final Set<String> KNOWN_KEYS = new HashSet<>(Arrays.asList(
            ID,Point_Name, IP, Serial_Number, Province_Tag, Impotrant_Command_Image, Dept_Tag
    ));
}
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/DynamicColumnValue.java
New file
@@ -0,0 +1,41 @@
package com.ycl.platform.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
 * 动态列
 *
 * @author xp
 * @since 2024-08-16
 */
@Data
@TableName("t_dynamic_column_value")
public class DynamicColumnValue {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @TableField("dynamic_column_id")
    /** 关联动态列ID */
    private Integer dynamicColumnId;
    @TableField("column_value")
    /** elementui table prop */
    private String columnValue;
    @TableField("ref_id")
    /** 关联的数据id */
    private Integer refId;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/entity/YwPoint.java
@@ -75,9 +75,9 @@
    @TableField("dept_tag")
    private Boolean deptTag;
    @ApiModelProperty("是否在线:true 在线")
    @ApiModelProperty("1在线 0未知 -1离线")
    @TableField("online")
    private Boolean online;
    private Integer online;
    @TableField("serial_number")
    private String serialNumber;
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/PointExport.java
@@ -58,9 +58,11 @@
    @ColumnWidth(20)
    @ExcelProperty("是否部级标签(可修改)")
    private String deptTag;
    private String deptTagString;
    @ExcelIgnore
    private Boolean deptTag;
    @ExcelIgnore
    private Boolean importantTag;
    @ExcelProperty("是否重点点位")
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DynamicColumnVO.java
@@ -14,19 +14,21 @@
 */
@Data
public class DynamicColumnVO extends AbsVo {
    /** 关联一机一档id */
    /** 表名 */
    private String tableName;
    /** elementui table prop */
    private String propName;
    /** elementui table label */
    /** elementui 字段名 */
    private String labelValue;
    /** 值 */
    /** 字段值 */
    private String columnValue;
    /** 关联数据的id */
    private Integer refId;
    /** value表的id */
    private Integer valueId;
    public static DynamicColumnVO getVoByEntity(@NonNull DynamicColumn entity, DynamicColumnVO vo) {
        if(vo == null) {
            vo = new DynamicColumnVO();
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/UpdateOnlineVO.java
@@ -15,7 +15,7 @@
    private String ip;
    /** 是否在线 */
    private Boolean online;
    private Integer online;
    private Date updateTime;
}
ycl-server/src/main/java/com/ycl/platform/controller/YwPointController.java
@@ -16,6 +16,8 @@
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import org.springframework.validation.annotation.Validated;
import jakarta.validation.constraints.NotEmpty;
import io.swagger.annotations.Api;
@@ -124,7 +126,7 @@
                             Integer unitId,
                             String startTime,
                             Boolean needUpdateUnit,
                             String endTime) throws IOException, ParseException {
                             String endTime) throws IOException, ParseException, ExecutionException, InterruptedException {
        Date start = null;
        Date end = null;
        if (-1 == unitId) {
ycl-server/src/main/java/com/ycl/platform/mapper/DynamicColumnMapper.java
@@ -3,6 +3,7 @@
import com.ycl.platform.domain.entity.DynamicColumn;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.platform.domain.entity.DynamicColumnValue;
import com.ycl.platform.domain.query.DynamicColumnQuery;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import com.ycl.platform.domain.form.DynamicColumnForm;
@@ -39,4 +40,8 @@
    */
    IPage getPage(IPage page, @Param("query") DynamicColumnQuery query);
    void saveBatch( @Param("insertList") List<DynamicColumnValue> insertList);
    void updateBatch( @Param("updateList") List<DynamicColumnValue> updateList);
}
ycl-server/src/main/java/com/ycl/platform/service/YwPointService.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.platform.domain.entity.ReportAuditingRecord;
import com.ycl.platform.domain.entity.YwPoint;
import com.ycl.platform.domain.excel.PointExport;
import com.ycl.platform.domain.form.BatchEditPointForm;
import com.ycl.platform.domain.form.YwPointForm;
import com.ycl.platform.domain.query.YwPointQuery;
@@ -16,6 +17,7 @@
import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
/**
 * 运维点位 服务类
@@ -125,7 +127,7 @@
     * @param unitId 运维单位id
     * @return
     */
    Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime, Boolean needUpdateUnit) throws IOException;
    Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime, Boolean needUpdateUnit) throws IOException, ExecutionException, InterruptedException;
    /**
     * 获取报备是否审核通过(最新一条)
@@ -149,4 +151,8 @@
     * @return
     */
    <T extends BaseResult> void setNew(List<T> dataList);
    void updatePoint(List<PointExport> dataList, Integer unitId, Date startTime, Date endTime, Boolean needUpdateUnit) throws ExecutionException, InterruptedException;
    void updateDynamic(List<PointExport> dataList);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/UYErrorTypeCheckServiceImpl.java
@@ -106,11 +106,12 @@
    public void videoOnlineCheck(List<VideoOnlineResult> dataList) {
        List<WorkOrder> workOrderList = dataList.stream().map(item -> {
            WorkOrder workOrder = new WorkOrder();
            if (-1 == item.getStatus()) {
            if (ApiConstants.UY_OnlineSite_Offline.equals(item.getStatus()) ) {
                this.genWorkOrder(workOrder, ErrorType.DEVICE_OFFLINE, item.getDeviceId());
            } else if (0 == item.getStatus()) {
                this.genWorkOrder(workOrder, ErrorType.UNKNOWN, item.getDeviceId());
            }
//            else if (0 == item.getStatus()) {
//                this.genWorkOrder(workOrder, ErrorType.UNKNOWN, item.getDeviceId());
//            }
            return workOrder;
        }).collect(Collectors.toList());
        workOrderService.innerAddWorkOrder(workOrderList);
ycl-server/src/main/java/com/ycl/platform/service/impl/YwPointServiceImpl.java
@@ -9,9 +9,7 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.dataListener.CurrencyDataListener;
import com.ycl.platform.base.AbsVo;
import com.ycl.platform.domain.entity.ReportAuditingRecord;
import com.ycl.platform.domain.entity.YwPeople;
import com.ycl.platform.domain.entity.YwPoint;
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.excel.PointExport;
import com.ycl.platform.domain.form.BatchEditPointForm;
import com.ycl.platform.domain.form.YwPointForm;
@@ -25,6 +23,7 @@
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.YwPeopleMapper;
import com.ycl.platform.mapper.YwPointMapper;
import com.ycl.platform.service.DynamicColumnService;
import com.ycl.platform.service.YwPointService;
import com.ycl.platform.service.YwUnitService;
import com.ycl.system.Result;
@@ -34,11 +33,13 @@
import com.ycl.utils.DateUtils;
import com.ycl.utils.SecurityUtils;
import com.ycl.utils.poi.EasyExcelImportUtils;
import com.ycl.utils.uuid.IdUtils;
import constant.PointHeaderConstant;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
@@ -67,6 +68,7 @@
    private final SysDeptMapper sysDeptMapper;
    private final TMonitorMapper monitorMapper;
    private final DynamicColumnMapper dynamicColumnMapper;
    private final ApplicationContext context;
    /**
     * 添加
@@ -250,10 +252,11 @@
        List<DynamicColumnVO> dynamics = dynamicColumnMapper.getData();
        Map<Integer, List<DynamicColumnVO>> dynamicMap = new HashMap<>();
        if (!CollectionUtils.isEmpty(dynamics)) {
            dynamicMap = dynamics.stream().filter(vo ->vo.getId()!=null).collect(Collectors.groupingBy(AbsVo::getId));
            dynamicMap = dynamics.stream().filter(vo -> vo.getRefId() != null).collect(Collectors.groupingBy(DynamicColumnVO::getRefId));
        }
        //定义表头列表
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointHeaderConstant.ID);
        headers.add(PointHeaderConstant.Point_Name);
        headers.add(PointHeaderConstant.Serial_Number);
        headers.add(PointHeaderConstant.IP);
@@ -271,12 +274,13 @@
        for (PointExport export : exportData) {
            List<Object> list = new ArrayList<>();
            //需要保证顺序一致
            list.add(export.getId());
            list.add(export.getPointName());
            list.add(export.getSerialNumber());
            list.add(export.getPointIP());
            list.add(export.getProvinceTagString());
            list.add(export.getImportantCommandImageTagString());
            list.add(export.getDeptTag());
            list.add(export.getDeptTagString());
            for (String header : headersList) {
                //创建一个变量记录找没找到这个header
                boolean flag = false;
@@ -308,27 +312,50 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result importData(MultipartFile file, Integer unitId, Date startTime, Date endTime, Boolean
            needUpdateUnit) throws IOException {
//        List<Map<String,String>> list = EasyExcelImportUtils.makeData(file);
        Consumer<List<PointExport>> consumer = (dataList) -> {
            try {
                this.updatePoint(dataList, unitId, startTime, endTime, needUpdateUnit);
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            needUpdateUnit) throws IOException, ExecutionException, InterruptedException {
        List<Map<String, String>> list = EasyExcelImportUtils.makeData(file);
        List<PointExport> dataList = new ArrayList<>();
//        Consumer<List<PointExport>> consumer = (dataList) -> {
//            try {
//                this.updatePoint(dataList, unitId, startTime, endTime, needUpdateUnit);
//            } catch (ExecutionException e) {
//                e.printStackTrace();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        };
//        EasyExcel.read(file.getInputStream(), PointExport.class, new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll();
        for (Map<String, String> map : list) {
            PointExport pointExport = new PointExport();
            pointExport.setId(Integer.valueOf(map.get(PointHeaderConstant.ID)));
            pointExport.setPointName(map.get(PointHeaderConstant.Point_Name));
            pointExport.setPointIP(map.get(PointHeaderConstant.IP));
            pointExport.setSerialNumber(map.get(PointHeaderConstant.Serial_Number));
            pointExport.setProvinceTag("是".equals(map.get(PointHeaderConstant.Province_Tag)));
            pointExport.setImportantCommandImageTag("是".equals(map.get(PointHeaderConstant.Impotrant_Command_Image)));
            pointExport.setDeptTag("是".equals(map.get(PointHeaderConstant.Dept_Tag)));
            List<DynamicColumnVO> dynamics = new ArrayList<>();
            // 处理动态列
            for (Map.Entry<String, String> entry : map.entrySet()) {
                String key = entry.getKey();
                if (!PointHeaderConstant.KNOWN_KEYS.contains(key)) {
                    DynamicColumnVO dynamicColumnVO = new DynamicColumnVO();
                    dynamicColumnVO.setRefId(pointExport.getId());
                    dynamicColumnVO.setLabelValue(entry.getKey());
                    dynamicColumnVO.setColumnValue(entry.getValue());
                    dynamicColumnVO.setPropName(IdUtils.randomNO(new Date()));
                    dynamicColumnVO.setTableName("t_yw_point");
                    dynamics.add(dynamicColumnVO);
                }
            }
        };
        EasyExcel.read(file.getInputStream(), PointExport.class, new CurrencyDataListener(consumer)).headRowNumber(1).doReadAll();
//        for (Map<String, String> map : list) {
//            PointExport pointExport = new PointExport();
//            pointExport.setPointName(map.get(PointHeaderConstant.Point_Name));
//            pointExport.setPointIP(map.get(PointHeaderConstant.IP));
//            pointExport.setSerialNumber(map.get(PointHeaderConstant.Serial_Number));
//        }
//        this.updatePoint(dataList, unitId, startTime, endTime, needUpdateUnit);
//        System.out.println(list);
            pointExport.setDynamicData(dynamics);
            dataList.add(pointExport);
        }
        YwPointServiceImpl self = context.getBean(YwPointServiceImpl.class);
        self.updatePoint(dataList, unitId, startTime, endTime, needUpdateUnit);
        self.updateDynamic(dataList);
        return Result.ok();
    }
@@ -343,7 +370,6 @@
     * @param dataList
     * @param unitId
     */
    @Transactional(rollbackFor = Exception.class)
    public void updatePoint(List<PointExport> dataList, Integer unitId, Date startTime, Date endTime, Boolean
            needUpdateUnit) throws ExecutionException, InterruptedException {
        if (CollectionUtils.isEmpty(dataList)) {
@@ -351,9 +377,9 @@
        }
        List<YwPoint> pointList = dataList.stream().map(item -> {
            YwPoint point = new YwPoint();
            point.setImportantCommandImageTag("是".equals(item.getImportantCommandImageTagString()));
            point.setProvinceTag("是".equals(item.getProvinceTagString()));
            point.setDeptTag("是".equals(item.getDeptTag()));
            point.setImportantCommandImageTag(item.getImportantCommandImageTag());
            point.setProvinceTag(item.getProvinceTag());
            point.setDeptTag(item.getDeptTag());
            if (needUpdateUnit) {
                if (Objects.nonNull(unitId)) {
                    point.setUnitId(Long.valueOf(unitId));
@@ -373,6 +399,67 @@
        this.waitAllFinishAndGetResult(pointList);
    }
    @Override
    public void updateDynamic(List<PointExport> dataList) {
        List<DynamicColumnValue> insertList = new ArrayList<>();
        List<DynamicColumnValue> updateList = new ArrayList<>();
        List<Integer> deleteList = new ArrayList<>();
        //查出所有种类动态列作为字典
        Map<String, Integer> dictionary = new LambdaQueryChainWrapper<>(dynamicColumnMapper)
                .list().stream().collect(Collectors.toMap(DynamicColumn::getLabelValue, DynamicColumn::getId));
        //查出点位表的所有动态列
        List<DynamicColumnVO> dynamicVOList = dynamicColumnMapper.getData();
        Map<Integer, List<DynamicColumnVO>> dynamicVOMap = new HashMap<>();
        if (!CollectionUtils.isEmpty(dynamicVOList)) {
            dynamicVOMap = dynamicVOList.stream().filter(vo -> vo.getRefId() != null).collect(Collectors.groupingBy(DynamicColumnVO::getRefId));
        }
        //根据label_value和ref_id判断是否是同一数据
        for (PointExport pointExport : dataList) {
            //得到excel中动态列名作为key的map
            Map<String, DynamicColumnVO> exportMap = pointExport.getDynamicData().stream().collect(Collectors.toMap(DynamicColumnVO::getLabelValue, Function.identity()));
            //查出数据库中这个点位的动态列
            List<DynamicColumnVO> dynamicColumnVOS = dynamicVOMap.get(pointExport.getId());
            if (!CollectionUtils.isEmpty(dynamicColumnVOS)) {
                //遍历数据库中这个点位的动态列,并根据动态列名找出excel中的值
                for (DynamicColumnVO vo : dynamicColumnVOS) {
                    DynamicColumnVO dynamicColumnVO = exportMap.get(vo.getLabelValue());
                    //存在说明excel有这个数据,将数据库这个数据的值改为excel的值
                    if (dynamicColumnVO.getColumnValue() != null) {
                        DynamicColumnValue entity = new DynamicColumnValue();
                        entity.setColumnValue(dynamicColumnVO.getColumnValue());
                        entity.setDynamicColumnId(vo.getId());
                        entity.setRefId(vo.getRefId());
                        entity.setId(vo.getValueId());
                        updateList.add(entity);
                    } else {
                        //不存在则取消标签,删除
                        deleteList.add(vo.getValueId());
                    }
                }
            } else {
                //数据库里查不到excel里面的这个点位动态列,全为新增
                List<DynamicColumnVO> dynamicData = pointExport.getDynamicData();
                for (DynamicColumnVO excelData : dynamicData) {
                    if(excelData.getColumnValue()!=null) {
                        Integer dynamicId = dictionary.get(excelData.getLabelValue());
                        DynamicColumnValue entity = new DynamicColumnValue();
                        entity.setColumnValue(excelData.getColumnValue());
                        entity.setDynamicColumnId(dynamicId);
                        entity.setRefId(pointExport.getId());
                        insertList.add(entity);
                    }
                }
            }
        }
        //插入
        if(!CollectionUtils.isEmpty(insertList)) dynamicColumnMapper.saveBatch(insertList);
        //更新
        if(!CollectionUtils.isEmpty(updateList)) dynamicColumnMapper.updateBatch(updateList);
        //删除
        if(!CollectionUtils.isEmpty(deleteList)) dynamicColumnMapper.deleteBatchIds(deleteList);
    }
    public void waitAllFinishAndGetResult(List<YwPoint> dataList) {
        Date startTime = new Date();
        this.baseMapper.updatePoint(dataList);
ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -123,6 +123,7 @@
            //存放在mongo中
            carList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_CAR));
            mongoTemplate.insertAll(carList);
            //TODO:更新point表在线状态
        }
        /** 人脸数据 */
@@ -148,7 +149,9 @@
            //存放在mongo中
            faceList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
            mongoTemplate.insertAll(faceList);
            //TODO:更新point表在线状态
        }
        log.info("结束抓拍数据量检测结果数据同步");
    }
ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -21,6 +21,7 @@
import com.ycl.system.service.ISysDictDataService;
import com.ycl.utils.DateUtils;
import com.ycl.utils.StringUtils;
import constant.ApiConstants;
import constant.CheckConstants;
import constant.RedisConstant;
import enumeration.general.AreaDeptEnum;
@@ -62,18 +63,18 @@
    private RedisTemplate redisTemplate;
    //同步点位在线率到mongo(弃用)
    public void siteOnline() {
        log.info("开始同步点位在线率到mongo");
        List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(null);
        if (!CollectionUtils.isEmpty(tMonitorResults)) {
            //如果存在之前的数据先删除
            Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
            DeleteResult result = mongoTemplate.remove(query, TMonitorResult.class);
            //存放在mongo中
            mongoTemplate.insertAll(tMonitorResults);
            log.info("结束同步点位在线率到mongo");
        }
    }
//    public void siteOnline() {
//        log.info("开始同步点位在线率到mongo");
//        List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(null);
//        if (!CollectionUtils.isEmpty(tMonitorResults)) {
//            //如果存在之前的数据先删除
//            Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
//            DeleteResult result = mongoTemplate.remove(query, TMonitorResult.class);
//            //存放在mongo中
//            mongoTemplate.insertAll(tMonitorResults);
//            log.info("结束同步点位在线率到mongo");
//        }
//    }
    //同步mongodb一机一档到数据库
    @Transactional(rollbackFor = Exception.class)
@@ -161,6 +162,7 @@
            ywPoint.setImportantCommandImageTag(Boolean.FALSE);
            ywPoint.setCreateTime(new Date());
            ywPoint.setUpdateTime(new Date());
            ywPoint.setOnline(ApiConstants.UY_OnlineSite_Unknown);
        }
        //状态设置为考核设备
        ywPoint.setExamineStatus(Boolean.TRUE);
ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -172,9 +172,9 @@
    }
    /**
     * 点位在线检测
     * 点位在线PING检测
     */
    //TODO:视频离线次数、监测次数(修改逻辑只针对工单,检测在线的)
    //TODO:点位在线(修改逻辑只针对工单)
    public void pointOnline() throws ExecutionException, InterruptedException {
        log.info("开始检测点位在线");
        Integer times = 2;
@@ -186,25 +186,16 @@
        } else {
            log.error("请配置离线次数,此次设置为默认值2");
        }
        // 先查出设备IP集合
        // 先查出在线的设备IP集合,剔除掉在线情况是未知的,并且只检测正在考核的设备避免多余工单
        List<TMonitorResult> monitorList = monitorMapper.getDistinctIP();
//        List<Future<TMonitorResult>> futureList = new ArrayList<>(48);
        List<TMonitorResult> dataList = new ArrayList<>(48);
//        for (TMonitorResult monitor : monitorList) {
//            OnlineCheckThread thread = new OnlineCheckThread(monitor, checkPointUtil, times);
//            Future<TMonitorResult> future = executorService.submit(thread);
//            futureList.add(future);
//        }
//        for (Future<TMonitorResult> future : futureList) {
//            dataList.add(future.get()); // get方法会阻塞,知道拿到结果才继续执行for
//        }
        Integer time = times;
        List<CompletableFuture<TMonitorResult>> futureList = monitorList.stream()
                .map(monitor -> CompletableFuture.supplyAsync(() -> {
                            OnlineCheckThread thread = new OnlineCheckThread(monitor, checkPointUtil, time);
                            return thread.call(); // 假设 OnlineCheckThread 实现了 Callable 接口
                        }, executorService)
                        .orTimeout(40, TimeUnit.SECONDS)
                        .orTimeout(60, TimeUnit.SECONDS)
                        .exceptionally(ex -> {
                            if (ex instanceof TimeoutException) {
                                log.error("任务执行超时:"+monitor.getIp());
@@ -239,7 +230,7 @@
                futureList.toArray(new CompletableFuture[0])
        );
        try {
            allOf.get(35, TimeUnit.SECONDS); // 给予额外的5秒来收集结果
            allOf.get(60, TimeUnit.SECONDS); // 给予额外的5秒来收集结果
        } catch (TimeoutException e) {
            log.warn("部分任务未在指定时间内完成");
        } catch (Exception e2){
@@ -248,19 +239,19 @@
        dataList = futureList.stream()
                .map(CompletableFuture::join)
                .filter(result -> result != null)
                .filter(Objects::nonNull)
                .collect(Collectors.toList());
        // 更新point表的在线标识
        //筛选出ping离线的设备,更改数据库为离线
        Date now = new Date();
        List<UpdateOnlineVO> willUpdateList = dataList.stream().map(item -> {
        List<UpdateOnlineVO> willUpdateList = dataList.stream().filter(result->!result.getOnline()).map(item -> {
            UpdateOnlineVO vo = new UpdateOnlineVO();
            vo.setOnline(item.getOnline());
            vo.setOnline(item.getOnline()?ApiConstants.UY_OnlineSite_Online:ApiConstants.UY_OnlineSite_Offline);
            vo.setIp(item.getIp());
            vo.setUpdateTime(now);
            return vo;
        }).collect(Collectors.toList());
        monitorMapper.updateOnline(willUpdateList);
        // 工单
        //工单
        List<WorkOrder> workOrderList = dataList.stream()
                .filter(item -> Objects.nonNull(item.getWorkOrder()))
                .map(TMonitorResult::getWorkOrder)
@@ -305,8 +296,19 @@
                        pointService.setDeviceTagByGB(records);
                        //存放在mongo中
                        mongoTemplate.insertAll(records);
                        // 工单生成
                        uyErrorTypeCheckService.videoOnlineCheck(records);
                        //更新point表在线状态
                        Date now = new Date();
                        List<UpdateOnlineVO> willUpdateList = records.stream().map(item -> {
                            UpdateOnlineVO vo = new UpdateOnlineVO();
                            vo.setOnline(item.getStatus());
                            vo.setIp(item.getIpAddr());
                            vo.setUpdateTime(now);
                            return vo;
                        }).collect(Collectors.toList());
                        monitorMapper.updateOnline(willUpdateList);
                        //离线生成工单
                        List<VideoOnlineResult> workOrders = records.stream().filter(item -> ApiConstants.UY_OnlineSite_Offline.equals(item.getStatus())).collect(Collectors.toList());
                        uyErrorTypeCheckService.videoOnlineCheck(workOrders);
                    } else {
                        log.error("点位在线结果数据为空{}", data);
                    }
ycl-server/src/main/java/com/ycl/thread/OnlineCheckThread.java
@@ -73,7 +73,6 @@
            workOrder.setStatus(WorkOrderStatusEnum.DISTRIBUTED);
            result.setWorkOrder(workOrder);
        }
        log.info("监测对象:"+result);
        return result;
    }
ycl-server/src/main/java/com/ycl/utils/CheckPointUtil.java
@@ -49,7 +49,6 @@
    public TMonitorResult check(TMonitorResult monitor) {
        // 先检测能否访问该ip的网页
        ResponseEntity<String> res = null;
        log.info("监测IP:" + monitor.getIp());
        String prefix = "http://";
        if ("127.0.0.1".equals(monitor.getIp())) {
            monitor.setOnline(Boolean.FALSE);
@@ -74,7 +73,7 @@
        }
        if (!monitor.getOnline()) {
            try {
                reachable = InetAddress.getByName(monitor.getIp()).isReachable(3000);
                reachable = InetAddress.getByName(monitor.getIp()).isReachable(5000);
            } catch (IOException e) {
                e.printStackTrace();
            }
ycl-server/src/main/resources/mapper/zgyw/DynamicColumnMapper.xml
@@ -28,10 +28,12 @@
    </select>
    <select id="getData" resultType="com.ycl.platform.domain.vo.DynamicColumnVO">
        SELECT
        TDCV.ref_id as id,
        TDC.id,
        TDCV.ref_id,
        TDC.prop_name,
        TDC.label_value,
        TDCV.column_value
        TDCV.column_value,
        TDCV.id as value_id
        FROM
        t_dynamic_column TDC
        LEFT JOIN t_dynamic_column_value TDCV ON TDC.id =TDCV.dynamic_column_id
@@ -46,6 +48,7 @@
        </where>
    </select>
    <select id="getPage" resultMap="BaseResultMap">
        SELECT TDC.ref_id,
               TDC.prop_name,
@@ -56,4 +59,17 @@
        WHERE TDC.deleted = 0
    </select>
    <insert id="saveBatch">
        insert into t_dynamic_column_value (dynamic_column_id,column_value,ref_id) values
        <foreach collection="insertList" item="item" separator=",">
            (#{item.dynamicColumnId},#{item.columnValue},#{item.refId})
        </foreach>
    </insert>
    <update id="updateBatch">
        <foreach collection="updateList" separator=";" item="item">
            UPDATE t_dynamic_column_value
            SET column_value = #{item.columnValue}
            WHERE id = #{item.id}
        </foreach>
    </update>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -342,8 +342,9 @@
    <select id="getVideoCount" resultType="java.util.Map">
        SELECT count(*) AS totalPosts,
        IFNULL(SUM(IF(p.online = 1, 1, 0)), 0) AS totalMembers,
        IFNULL(SUM(IF(p.online = 0, 1, 0)), 0) AS postsPercentage,
        IFNULL(ROUND(SUM(IF(p.online, 1, 0)) / count(*) * 100, 2), 0) as viewsPercentage FROM t_monitor m
        IFNULL(SUM(IF(p.online = -1, 1, 0)), 0) AS postsPercentage,
        IFNULL(SUM(IF(p.online = 0, 1, 0)), 0) AS unknownNumbers,
        IFNULL(ROUND(SUM(IF(p.online = 1 , 1, 0)) / count(*) * 100, 2), 0) as viewsPercentage FROM t_monitor m
        left join t_yw_point p on m.serial_number = p.serial_number
        left join sys_dept d on p.dept_id = d.dept_id and d.del_flag = 0
        <where>
@@ -439,30 +440,33 @@
            'video' as type,
            COUNT(p1.id) AS totalNum,
            COUNT(p2.id) AS errorNum,
            COUNT(p1.id) - COUNT(p2.id) AS normalNum
            COUNT(p3.id)  AS normalNum
        FROM t_monitor
        LEFT JOIN t_yw_point p1 ON t_monitor.serial_number = p1.serial_number AND p1.examine_status = 1<if test="dataScope == 1"> AND p1.province_tag = 1 </if><if test="dataScope == 3"> AND p1.dept_tag = 1 </if><if test="deptId != null"> AND p1.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p2 ON t_monitor.serial_number = p2.serial_number  AND p2.examine_status = 1 AND p2.online = 0 AND p1.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if><if test="deptId != null"> AND p2.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p2 ON t_monitor.serial_number = p2.serial_number  AND p2.examine_status = 1 AND p2.online = -1 AND p1.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if><if test="deptId != null"> AND p2.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p3 ON t_monitor.serial_number = p3.serial_number  AND p3.examine_status = 1 AND p3.online = 1  AND p1.id = p3.id<if test="dataScope == 1"> AND p3.province_tag = 1 </if><if test="dataScope == 3"> AND p3.dept_tag = 1 </if><if test="deptId != null"> AND p3.dept_id = #{deptId} </if>
        WHERE INSTR(camera_fun_type, 1)
        UNION ALL
        SELECT
            'car' as type,
            COUNT(p1.id) AS totalNum,
            COUNT(p2.id) AS errorNum,
            COUNT(p1.id) - COUNT(p2.id) AS normalNum
            COUNT(p3.id) AS normalNum
        FROM t_monitor
        LEFT JOIN t_yw_point p1 ON t_monitor.serial_number = p1.serial_number AND p1.examine_status = 1 <if test="dataScope == 1"> AND p1.province_tag = 1 </if><if test="dataScope == 3"> AND p1.dept_tag = 1 </if><if test="deptId != null"> AND p1.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p2 ON t_monitor.serial_number = p2.serial_number AND p2.examine_status = 1 AND p2.online = 0 AND p1.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = '1' </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if><if test="deptId != null"> AND p2.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p2 ON t_monitor.serial_number = p2.serial_number AND p2.examine_status = 1 AND p2.online = -1 AND p1.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if><if test="deptId != null"> AND p2.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p3 ON t_monitor.serial_number = p3.serial_number  AND p3.examine_status = 1 AND p3.online = 1 AND p1.id = p3.id <if test="dataScope == 1"> AND p3.province_tag = 1 </if><if test="dataScope == 3"> AND p3.dept_tag = 1 </if><if test="deptId != null"> AND p3.dept_id = #{deptId} </if>
        WHERE INSTR(camera_fun_type, 2)
        UNION ALL
        SELECT
            'face' as type,
            COUNT(p1.id) AS totalNum,
            COUNT(p2.id) AS errorNum,
            COUNT(p1.id) - COUNT(p2.id) AS normalNum
            COUNT(p3.id) AS normalNum
        FROM t_monitor
        LEFT JOIN t_yw_point p1 ON t_monitor.serial_number = p1.serial_number  AND p1.examine_status = 1 <if test="dataScope == 1"> AND p1.province_tag = 1 </if><if test="dataScope == 3"> AND p1.dept_tag = 1 </if><if test="deptId != null"> AND p1.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p2 ON t_monitor.serial_number = p2.serial_number  AND p2.examine_status = 1 AND p2.online = 0 AND p1.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if><if test="deptId != null"> AND p2.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p2 ON t_monitor.serial_number = p2.serial_number  AND p2.examine_status = 1 AND p2.online = -1 AND p1.id = p2.id<if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if><if test="deptId != null"> AND p2.dept_id = #{deptId} </if>
        LEFT JOIN t_yw_point p3 ON t_monitor.serial_number = p3.serial_number  AND p3.examine_status = 1 AND p3.online = 1  AND p1.id = p3.id<if test="dataScope == 1"> AND p3.province_tag = 1 </if><if test="dataScope == 3"> AND p3.dept_tag = 1 </if><if test="deptId != null"> AND p3.dept_id = #{deptId} </if>
        WHERE INSTR(camera_fun_type, 3)
    </select>
    <select id="monitorRate" resultType="com.ycl.platform.domain.vo.screen.MonitorRateVO">
@@ -473,15 +477,17 @@
            (
                SELECT
                    d.area,
                    IFNULL(ROUND((COUNT(m.id) - COUNT(m2.id)) / COUNT(m.id) * 100, 2), 0) AS faceRate,
                    COUNT(m.id) - COUNT(m2.id) AS faceNormalNum,
                    IFNULL(ROUND(COUNT(m3.id)/ COUNT(m.id) * 100, 2), 0) AS faceRate,
                    COUNT(m3.id) AS faceNormalNum,
                    COUNT(m2.id) AS faceErrorNum
                FROM
                    sys_dept d
                        LEFT JOIN t_yw_point p ON p.dept_id = d.dept_id AND p.deleted = 0  AND p.examine_status = 1 <if test="dataScope == 1"> AND p.province_tag = 1 </if><if test="dataScope == 3"> AND p.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p2 ON p2.dept_id = d.dept_id AND p2.deleted = 0 AND p2.online = 0 AND p2.examine_status = 1 AND p.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p2 ON p2.dept_id = d.dept_id AND p2.deleted = 0 AND p2.online = -1 AND p2.examine_status = 1 AND p.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p3 ON p3.dept_id = d.dept_id AND p3.deleted = 0 AND p3.online = 1 AND p3.examine_status = 1 AND p.id = p3.id <if test="dataScope == 1"> AND p3.province_tag = 1 </if><if test="dataScope == 3"> AND p3.dept_tag = 1 </if>
                        LEFT JOIN t_monitor m ON m.serial_number = p.serial_number AND INSTR(m.camera_fun_type, 3)
                        LEFT JOIN t_monitor m2 ON m2.serial_number = p2.serial_number AND INSTR(m2.camera_fun_type, 3)
                        LEFT JOIN t_monitor m3 ON m3.serial_number = p3.serial_number AND INSTR(m3.camera_fun_type, 3)
                WHERE d.del_flag = 0 AND d.area IS NOT NULL
                GROUP BY d.area, d.dept_id
                ORDER BY d.area_code
@@ -491,15 +497,17 @@
            (
                SELECT
                    d.area,
                    IFNULL(ROUND((COUNT(m.id) - COUNT(m2.id)) / COUNT(m.id) * 100, 2), 0) AS carRate,
                    COUNT(m.id) - COUNT(m2.id) AS carNormalNum,
                    IFNULL(ROUND(COUNT(m3.id) / COUNT(m.id) * 100, 2), 0) AS carRate,
                    COUNT(m3.id) AS carNormalNum,
                    COUNT(m2.id) AS carErrorNum
                FROM
                    sys_dept d
                        LEFT JOIN t_yw_point p ON p.dept_id = d.dept_id AND p.deleted = 0 AND p.examine_status = 1 <if test="dataScope == 1"> AND p.province_tag = 1 </if><if test="dataScope == 3"> AND p.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p2 ON p2.dept_id = d.dept_id AND p2.deleted = 0 AND p2.examine_status = 1 AND p2.online = 0 AND p.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p2 ON p2.dept_id = d.dept_id AND p2.deleted = 0 AND p2.examine_status = 1 AND p2.online = -1 AND p.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p3 ON p3.dept_id = d.dept_id AND p3.deleted = 0 AND p3.examine_status = 1 AND p3.online = 1 AND p.id = p3.id <if test="dataScope == 1"> AND p3.province_tag = 1 </if><if test="dataScope == 3"> AND p3.dept_tag = 1 </if>
                        LEFT JOIN t_monitor m ON m.serial_number = p.serial_number AND INSTR(m.camera_fun_type, 2)
                        LEFT JOIN t_monitor m2 ON m2.serial_number = p2.serial_number AND INSTR(m2.camera_fun_type, 2)
                        LEFT JOIN t_monitor m3 ON m3.serial_number = p3.serial_number AND INSTR(m3.camera_fun_type, 2)
                WHERE d.del_flag = 0 AND d.area IS NOT NULL
                GROUP BY d.area, d.dept_id, d.area_code
                ORDER BY d.area_code
@@ -509,15 +517,17 @@
            (
                SELECT
                    d.area,
                    IFNULL(ROUND((COUNT(m.id) - COUNT(m2.id)) / COUNT(m.id) * 100, 2), 0) AS videoRate,
                    COUNT(m.id) - COUNT(m2.id) AS videoNormalNum,
                    IFNULL(ROUND(COUNT(m3.id) / COUNT(m.id) * 100, 2), 0) AS videoRate,
                    COUNT(m3.id) AS videoNormalNum,
                    COUNT(m2.id) AS videoErrorNum
                FROM
                    sys_dept d
                        LEFT JOIN t_yw_point p ON p.dept_id = d.dept_id AND p.deleted = 0 AND p.examine_status = 1 <if test="dataScope == 1"> AND p.province_tag = 1 </if><if test="dataScope == 3"> AND p.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p2 ON p2.dept_id = d.dept_id AND p2.deleted = 0 AND p2.examine_status = 1 AND p2.online = 0 AND p.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p2 ON p2.dept_id = d.dept_id AND p2.deleted = 0 AND p2.examine_status = 1 AND p2.online = -1 AND p.id = p2.id <if test="dataScope == 1"> AND p2.province_tag = 1 </if><if test="dataScope == 3"> AND p2.dept_tag = 1 </if>
                        LEFT JOIN t_yw_point p3 ON p3.dept_id = d.dept_id AND p3.deleted = 0 AND p3.examine_status = 1 AND p3.online = 1 AND p.id = p3.id <if test="dataScope == 1"> AND p3.province_tag = 1 </if><if test="dataScope == 3"> AND p3.dept_tag = 1 </if>
                        LEFT JOIN t_monitor m ON m.serial_number = p.serial_number AND INSTR(m.camera_fun_type, 1)
                        LEFT JOIN t_monitor m2 ON m2.serial_number = p2.serial_number AND INSTR(m2.camera_fun_type, 1)
                        LEFT JOIN t_monitor m3 ON m3.serial_number = p3.serial_number AND INSTR(m3.camera_fun_type, 1)
                WHERE d.del_flag = 0 AND d.area IS NOT NULL
                GROUP BY d.area, d.area_code, d.dept_id
                ORDER BY d.area_code
@@ -645,6 +655,7 @@
        from t_monitor m
            left join t_yw_point p on m.serial_number = p.serial_number
            left join sys_dept d on p.dept_id = d.dept_id
            where p.online != 0 and p.examine_status = 1
    </select>
    <update id="updateOnline">
@@ -655,7 +666,7 @@
                online = #{online.online},
                update_time = #{online.updateTime}
            WHERE
                EXISTS (SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number)
                EXISTS (SELECT 1 FROM t_monitor WHERE ip = #{online.ip} AND t_monitor.serial_number = t_yw_point.serial_number )
        </foreach>
    </update>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/YwPointMapper.xml
@@ -95,9 +95,9 @@
        LEFT JOIN t_dynamic_column dc ON dc.id = dcv.dynamic_column_id AND dc.table_name = #{tableName}
        WHERE
        dcv.ref_id = #{id}
        <if test="pointName != null and pointName != ''">
            and dcv.column_value like concat('%', #{pointName}, '%')
        </if>
<!--        <if test="pointName != null and pointName != ''">-->
<!--            and dcv.column_value like concat('%', #{pointName}, '%')-->
<!--        </if>-->
    </select>
    <select id="dataCenterPage" resultType="com.ycl.platform.domain.vo.PointDetailVO">
@@ -233,7 +233,7 @@
        CASE WHEN yp.province_tag = 0 THEN '否' ELSE '是' END AS provinceTagString,
        CASE WHEN yp.important_tag = 0 THEN '否' ELSE '是' END AS importantTagString,
        CASE WHEN yp.important_command_image_tag = 0 THEN '否' ELSE '是' END AS importantCommandImageTagString,
        CASE WHEN yp.dept_tag = 0 THEN '否' ELSE '是' END AS deptTag
        CASE WHEN yp.dept_tag = 0 THEN '否' ELSE '是' END AS deptTagString
        FROM
        t_yw_point yp
        INNER JOIN t_monitor m ON yp.serial_number = m.serial_number