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