zxl
2025-12-02 4f2c9b54c8d0f358f3b7c6821f091a493b24e006
配置新增以及bug修改
8个文件已修改
1个文件已添加
2 文件已重命名
192 ■■■■ 已修改文件
ycl-server/src/main/java/com/ycl/calculate/MonitorQualifyCalculation.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/DailyMonitorDemeritRecordMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/DemeritRecordMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckTemplateServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DailyMonitorDemeritRecordServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/UYTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/application-dev.yml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/DailyMonitorDemeritRecordMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/DemeritRecordMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/MonitorQualifyCalculation.java
@@ -10,10 +10,8 @@
import utils.DateUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 计算一机一档合格率
@@ -39,8 +37,11 @@
    @Override
    public void calculate(List<MonitorQualifyResult> list) {
        List<MonitorQualifyResult> validList = list.stream()
                .filter(Objects::nonNull) // 过滤集合中的 null 元素
                .collect(Collectors.toList());
        //获取分区域的指标数量
        Map<String, MonitorQualifyCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list,Boolean.TRUE);
        Map<String, MonitorQualifyCalculation.AreaStats> areaStatsMap = getAreaStatsMap(validList,Boolean.TRUE);
        if (areaStatsMap == null) return;
        // 查询是否index表已经存在今日数据
ycl-server/src/main/java/com/ycl/platform/mapper/DailyMonitorDemeritRecordMapper.java
File was renamed from ycl-server/src/main/java/com/ycl/system/mapper/DailyMonitorDemeritRecordMapper.java
@@ -1,12 +1,12 @@
package com.ycl.system.mapper;
package com.ycl.platform.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.platform.domain.entity.DailyMonitorDemeritRecord;
import com.ycl.platform.domain.form.DailyMonitorDemeritRecordForm;
import com.ycl.system.Result;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
/**
 * zgyw
@@ -16,6 +16,8 @@
 **/
@Mapper
public interface DailyMonitorDemeritRecordMapper extends BaseMapper<DailyMonitorDemeritRecord> {
    int deleteByDailyRecord(@Param("startTime") Date startTime,
                          @Param("endTime") Date endTime
    );
}
ycl-server/src/main/java/com/ycl/platform/mapper/DemeritRecordMapper.java
@@ -8,8 +8,20 @@
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
@Mapper
public interface DemeritRecordMapper extends BaseMapper<DemeritRecord> {
    IPage<DemeritRecordVO> getPage(@Param("query") DemeritRecordQuery query, IPage<DemeritRecordVO> page);
    /**
     * 按时间段物理删除记录(分批)
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 删除的记录数
     */
    int deleteByTimeRange(@Param("startTime") Date startTime,
                          @Param("endTime") Date endTime
                          );
}
ycl-server/src/main/java/com/ycl/platform/service/impl/CheckTemplateServiceImpl.java
@@ -166,7 +166,18 @@
        checkTemplateMapper.updateCheckTemplate(checkTemplate);
        return i;
    }
    public static BigDecimal safeConvert(String str) {
        // 处理空值/空字符串
        if (str == null || str.trim().isEmpty()) {
            return BigDecimal.ZERO;
        }
        try {
            return new BigDecimal(str.trim());
        } catch (NumberFormatException e) {
            System.out.println("字符串格式非法,无法转为BigDecimal:" + str);
            return BigDecimal.ZERO;
        }
    }
    /**
     * 修改考核模板
     *
@@ -178,6 +189,8 @@
    public AjaxResult updateCheckTemplate(CheckTemplateQuery checkTemplateDTO) throws SchedulerException, TaskException {
        CheckTemplate checkTemplate = new CheckTemplate();
        BeanUtils.copyProperties(checkTemplateDTO, checkTemplate);
        BigDecimal bigDecimal = safeConvert(checkTemplateDTO.getAlarmScore());
        checkTemplate.setAlarmScore(bigDecimal);
        checkTemplate.setUpdateUserName(SecurityUtils.getUsername());
        List<Integer> deptId = checkTemplateDTO.getDeptId();
        Collections.sort(deptId);
ycl-server/src/main/java/com/ycl/platform/service/impl/DailyMonitorDemeritRecordServiceImpl.java
@@ -6,12 +6,10 @@
import com.ycl.platform.domain.entity.DailyMonitorDemeritRecord;
import com.ycl.platform.domain.entity.DemeritRecord;
import com.ycl.platform.domain.entity.MonitorConstruction;
import com.ycl.platform.domain.excel.DailyMonitorDemeritRecordExp;
import com.ycl.platform.service.IDailyMonitorDemeritRecordService;
import com.ycl.platform.service.IDemeritRecordService;
import com.ycl.platform.service.IMonitorConstructionService;
import com.ycl.system.mapper.DailyMonitorDemeritRecordMapper;
import com.ycl.platform.mapper.DailyMonitorDemeritRecordMapper;
import com.ycl.utils.DateUtils;
import enumeration.ConstructionTypeEnum;
import enumeration.general.AreaDeptEnum;
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -150,14 +150,76 @@
        List<String> serialNumberList = workOrderList.stream().map(WorkOrder::getSerialNumber).collect(Collectors.toList());
        // 查出数据库中国标码对应的未完成的工单
        List<WorkOrder> inDatabaseWorkOrderList = baseMapper.getNotFinishedWorkOrders(serialNumberList);
        inDatabaseWorkOrderList.stream().forEach(item -> {
            if (StringUtils.hasText(item.getErrorType())) {
                item.setErrorTypeList(List.of(item.getErrorType().split(",")));
        log.info("打印出inDatabaseWorkOrderList:{}",inDatabaseWorkOrderList);
        // 2. 按 serialNumber 分组,合并错误类型
        Map<String, WorkOrder> mergedWorkOrders = new LinkedHashMap<>();
        for (WorkOrder order : inDatabaseWorkOrderList) {
            String serialNumber = order.getSerialNumber();
            if (mergedWorkOrders.containsKey(serialNumber)) {
                // 如果序列号已存在,合并错误类型
                WorkOrder existingOrder = mergedWorkOrders.get(serialNumber);
                //判断时间先后
                boolean isExistingNewer = existingOrder.getCreateTime() != null &&
                        order.getCreateTime() != null &&
                        existingOrder.getCreateTime().after(order.getCreateTime());
                WorkOrder latestOrder = isExistingNewer ? existingOrder : order;
                WorkOrder olderOrder = isExistingNewer ? order : existingOrder;
                List<String> latestErrorTypes = latestOrder.getErrorTypeList() != null
                        ? new ArrayList<>(latestOrder.getErrorTypeList())
                        : new ArrayList<>();
                if (StringUtils.hasText(olderOrder.getErrorType())) {
                    List<String> olderErrorTypes = Arrays.asList(olderOrder.getErrorType().split(","));
                    latestErrorTypes.addAll(olderErrorTypes);
                }
                // 去重并更新错误类型
                List<String> uniqueErrorTypes = latestErrorTypes.stream()
                        .distinct()
                        .collect(Collectors.toList());
                latestOrder.setErrorTypeList(uniqueErrorTypes);
                latestOrder.setErrorType(String.join(",", uniqueErrorTypes));
                // 更新Map中的工单为最新的工单
                mergedWorkOrders.put(serialNumber, latestOrder);
            } else {
                item.setErrorTypeList(new ArrayList<>(1));
                // 如果序列号不存在,初始化错误类型列表并添加到Map
                if (StringUtils.hasText(order.getErrorType())) {
                    order.setErrorTypeList(Arrays.asList(order.getErrorType().split(",")));
                } else {
                    order.setErrorTypeList(new ArrayList<>(1));
                }
                mergedWorkOrders.put(serialNumber, order);
            }
        });
        Map<String, WorkOrder> mapping = inDatabaseWorkOrderList.stream().collect((Collectors.toMap(WorkOrder::getSerialNumber, workOrder -> workOrder)));
        }
        log.info("打印出mergedWorkOrders合并后:{}",inDatabaseWorkOrderList);
// 3. 获取合并后的工单列表(保持顺序)
//        List<WorkOrder> finalWorkOrderList = new ArrayList<>(mergedWorkOrders.values());
//        Map<String, WorkOrder> mapping = null;
//        try {
//            mapping = finalWorkOrderList.stream()
//                    .collect(Collectors.toMap(WorkOrder::getSerialNumber, workOrder -> workOrder));
//        } catch (IllegalStateException e) {
//            // 捕获键重复异常
//            System.err.println("错误:发现重复的序列号,无法创建映射");
//            System.err.println("异常详情:" + e.getMessage());
//
//            // 可选:你可以在这里处理异常,比如返回一个空Map或者使用备用策略
//            // 方案1:返回空Map
//            mapping = new HashMap<>(); // Java 9+
//
//        }
        List<WorkOrder> waitAddList = new ArrayList<>(48);
        List<WorkOrderErrorType> waitAddErrorTypeList = new ArrayList<>(48);
        Integer updateNum = 0;
@@ -169,7 +231,7 @@
        // 即将要添加的错误类型
        List<WorkOrderErrorType> willAddErrorType = new ArrayList<>(96);
        for (WorkOrder workOrder : workOrderList) {
            WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber());
            WorkOrder databaseWorkOrder = mergedWorkOrders.get(workOrder.getSerialNumber());
            if (Objects.nonNull(databaseWorkOrder)) {
                //判断是否是今天的工单
                if (!isSameDay(databaseWorkOrder.getCreateTime(), now)) {
ycl-server/src/main/java/com/ycl/task/DemeritRecordTask.java
@@ -9,6 +9,7 @@
import com.ycl.platform.domain.entity.MonitorConstruction;
import com.ycl.platform.domain.entity.Report;
import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
import com.ycl.platform.mapper.DailyMonitorDemeritRecordMapper;
import com.ycl.platform.mapper.DemeritRecordMapper;
import com.ycl.platform.mapper.IMonitorConstructionMapper;
import com.ycl.platform.mapper.ReportMapper;
@@ -56,7 +57,11 @@
    private final IMonitorConstructionMapper monitorConstructionMapper;
    private final IDailyMonitorDemeritRecordService dailyMonitorDemeritRecordService;
    private final DailyMonitorDemeritRecordMapper dailyMonitorDemeritRecordMapper;
    private final DemeritRecordMapper demeritRecordMapper;
    private static final ExecutorService executorService = new ThreadPoolExecutor(16,
            128,
@@ -373,19 +378,16 @@
        }
        //处理完数据插入数据库中
        //先删除需要插入时间是否存在数据
        LambdaQueryWrapper<DemeritRecord> demeritRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        demeritRecordLambdaQueryWrapper.ge(DemeritRecord::getCreateTime,DateUtils.getDayStart(today))
                        .le(DemeritRecord::getCreateTime,DateUtils.getDayEnd(today));
        demeritRecordService.remove(demeritRecordLambdaQueryWrapper);
        demeritRecordMapper.deleteByTimeRange(DateUtils.getDayStart(today),DateUtils.getDayEnd(today));
        // 物理删除
        demeritRecordService.saveBatch(demeritRecords);
        log.info("结束计算每日扣分记录情况:插入数据量{},数据信息:{}",demeritRecords.size(),demeritRecords);
        //填充设备录像情况扣分详情结果
        LambdaQueryWrapper<DailyMonitorDemeritRecord> dailyMonitorDemeritRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        dailyMonitorDemeritRecordLambdaQueryWrapper.ge(DailyMonitorDemeritRecord::getCreateTime,DateUtils.getDayStart(today))
                .le(DailyMonitorDemeritRecord::getCreateTime,DateUtils.getDayEnd(today));
        iDailyMonitorDemeritRecordService.remove(dailyMonitorDemeritRecordLambdaQueryWrapper);
        dailyMonitorDemeritRecordMapper.deleteByDailyRecord(DateUtils.getDayStart(today),DateUtils.getDayEnd(today));
        // 物理删除
        iDailyMonitorDemeritRecordService.saveBatch(dailyMonitorDemeritRecords);
        log.info("结束计算每日扣分记录详情情况:插入数据量{},数据信息:{}",dailyMonitorDemeritRecords.size(),dailyMonitorDemeritRecords);
ycl-server/src/main/java/com/ycl/task/UYTask.java
@@ -194,6 +194,10 @@
        }
        // 先查出设备IP集合,剔除掉在线情况是未知的,并且只检测正在考核的设备避免多余工单
        // Todo
        //  1.个别录像不存在是否是因因为点位同步优云后,一部分点位被改为了未在运营范围的原因,
        //  2.导致pingOnline时查询运维点位获得ip时不包含在内,导致没有对应设备的数据
        //  3.当前问题暂无能解决的方法,
        List<TMonitorResult> monitorList = monitorMapper.getDistinctIP();
        //补充错误时间点
        Query onlineQuery = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
ycl-server/src/main/resources/application-dev.yml
@@ -37,15 +37,26 @@
spring:
  # 数据源配置
  datasource:
#    url: jdbc:mysql://101.35.247.188:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true
    #    url: jdbc:mysql://101.35.247.188:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true
#    username: root
#    password: ycl@202466
    url: jdbc:mysql://localhost:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true
    url: jdbc:mysql://localhost:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true&connectTimeout=60000&socketTimeout=120000&keepAlive=true&keepAliveInterval=60000
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    druid:
      initial-size: 5             # 初始化连接数
      min-idle: 5                 # 最小空闲连接数
      max-active: 20              # 最大活跃连接数
      max-wait: 60000             # 获取连接的最大等待时间(ms)
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: true
      test-on-return: false
  jpa:
    show-sql: true
    generate-ddl: true
@@ -85,7 +96,8 @@
    # 端口,默认为6379
    port: 6379
#    password: ycl2018
    password: 123456
#    password: 123456
    password:
    # 数据库索引
    database: 0
    # 密码(如没有密码请注释掉)
ycl-server/src/main/resources/mapper/zgyw/DailyMonitorDemeritRecordMapper.xml
New file
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycl.platform.mapper.DailyMonitorDemeritRecordMapper">
    <delete id="deleteByDailyRecord">
        DELETE FROM t_daily_monitor_demerit_record
        WHERE create_time BETWEEN #{startTime} AND #{endTime}
    </delete>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/DemeritRecordMapper.xml
File was renamed from ycl-server/src/main/resources/mapper/zgyw/DemeritREcordMapper.xml
@@ -11,6 +11,12 @@
        <result property="constructionType" column="construction_type"/>
    </resultMap>
    <delete id="deleteByTimeRange">
        DELETE FROM t_demerit_record
        WHERE create_time BETWEEN #{startTime} AND #{endTime}
    </delete>
    <select id="getPage" resultMap="baseResult">
        select