23302186a81c1b6f3e5f398f21b057350bfd34e8..023b2e98dffc0bc45e7bbd9205e5c0a3dc2994a4
2025-01-17 fuliqi
部级视频考核不做数量限制
023b2e 对比 | 目录
2025-01-16 fuliqi
核算导出调整+osd测试脚本
edc717 对比 | 目录
2025-01-16 fuliqi
bug
f97d15 对比 | 目录
16个文件已修改
152 ■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/CalculateExport.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/UpdateOnlineVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/api/DH/module/LoginModule.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/CalculateReportController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/CalculateReportMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/CalculateReportService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/ContractTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/HKTask.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/OsdTask.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/CalculateReportMapper.xml 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/excel/CalculateExport.java
@@ -29,6 +29,12 @@
    @ExcelProperty({"自贡市公共视频监控系统续维合同", "规则名称"})
    @ColumnWidth(130)
    private String ruleName;
    /**
     * 细则
     */
    @ExcelProperty({"自贡市公共视频监控系统续维合同", "细则"})
    @ColumnWidth(130)
    private String detailName;
    /**
     * 数量
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/UpdateOnlineVO.java
@@ -19,4 +19,5 @@
    private Date updateTime;
    private String serialNumber;
}
ycl-server/src/main/java/com/ycl/api/DH/module/LoginModule.java
@@ -160,6 +160,7 @@
//            log.error("CLIENT_QueryDeviceTime Failed!" + ToolKits.getErrorCodePrint());
            return null;
        }
        log.info("OSD时间原始数据格式,{},toString格式{}",deviceTime,deviceTime.toStringTime());
        Date checkTime = new Date();
        osdResult.setCheckTime(checkTime);
        String date = deviceTime.toStringTime();
@@ -195,6 +196,7 @@
            osdInfo.read();
            NET_GBMODE_CUSTOMTITLE_INFO[] stuCustomTitle = osdInfo.stuCustomTitle;
            for (NET_GBMODE_CUSTOMTITLE_INFO title : stuCustomTitle) {
                log.info("OSD原始数据格式{}",title);
                String position = new String(title.szPositon, StandardCharsets.UTF_8).trim();
                if("LeftDown".equals(position)) {
                    NET_TITLE_OSD_INFO[] stuOSD = title.stuOSD;
ycl-server/src/main/java/com/ycl/calculate/VideoOnlineCalculation.java
@@ -117,7 +117,7 @@
        BigDecimal siteOnline = siteOnline(param);
        checkIndexVideo.setSiteOnline(siteOnline);
        //区县不少于100路
        if(stats.totalSites < CheckThreadConstants.Check_Video_SiteOnline){
        if(!key.startsWith(ApiConstants.Dept) && stats.totalSites < CheckThreadConstants.Check_Video_SiteOnline){
            checkIndexVideo.setSiteOnline(BigDecimal.ZERO);
        }
        //调用点位在线率计算方法 计算重点点位在线率
@@ -132,7 +132,7 @@
        }
        //区县视频重点点位数不少于10路
        if(stats.importantSites<CheckThreadConstants.Check_Video_ImportantSite){
        if(!key.startsWith(ApiConstants.Dept) && stats.importantSites < CheckThreadConstants.Check_Video_ImportantSite){
            checkIndexVideo.setKeySiteOnline(BigDecimal.ZERO);
        }
ycl-server/src/main/java/com/ycl/platform/controller/CalculateReportController.java
@@ -69,8 +69,8 @@
    @PostMapping("/export")
    @ApiOperation(value = "导出", notes = "导出")
    @PreAuthorize("@ss.hasPermi('system:calculate:report:export')")
    public void export(Integer calculateId,Integer contractId, HttpServletResponse response) {
        calculateReportService.export(calculateId,contractId, response);
    public void export(Integer whichYear,Integer whichMonth,Integer contractId, HttpServletResponse response) {
        calculateReportService.export(whichYear,whichMonth,contractId, response);
    }
}
ycl-server/src/main/java/com/ycl/platform/mapper/CalculateReportMapper.java
@@ -42,5 +42,5 @@
     * 导出数据
     * @return 数据
     */
    List<CalculateExport> exportData(Integer calculateId);
    List<CalculateExport> exportData(Integer whichYear,Integer whichMonth,Integer contractId);
}
ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -169,6 +169,12 @@
     */
    void updateOnlineFromUyOrHk(@Param("onlineList") List<UpdateOnlineVO> onlineList);
    /**
     * 根据国标修改
     * @param onlineList
     */
    void updateOnlineFromHk(@Param("onlineList") List<UpdateOnlineVO> onlineList);
    /**
     * 点位在线率
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -77,7 +77,7 @@
     */
    List<DeviceInfoVO> hasErrorWorkOrderList(@Param("start") Date start, @Param("end") Date end);
    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("errorList") List<String> errorList);
    List<WorkOrderVO> selectPassOrder(@Param("startTime") LocalDateTime now, @Param("endTime")LocalDateTime thirtyDaysAgo, @Param("status") String status, @Param("errorList") List<String> errorList,@Param("auditStatus") String auditStatus);
    int addMany(@Param("workOrderList") List<WorkOrder> workOrderList);
ycl-server/src/main/java/com/ycl/platform/service/CalculateReportService.java
@@ -92,5 +92,5 @@
     * 导出
     * @param response 响应
     */
    void export(Integer calculateId,Integer contractId, HttpServletResponse response);
    void export(Integer whichYear,Integer whichMonth,Integer contractId, HttpServletResponse response);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/CalculateReportServiceImpl.java
@@ -225,9 +225,9 @@
    @Override
    @SneakyThrows
    public void export(Integer calculateId,Integer contractId, HttpServletResponse response) {
    public void export(Integer whichYear,Integer whichMonth,Integer contractId, HttpServletResponse response) {
        // 获取数据
        List<CalculateExport> list = baseMapper.exportData(calculateId);
        List<CalculateExport> list = baseMapper.exportData(whichYear,whichMonth,contractId);
        CalculateExport calculateExport = new CalculateExport();
        calculateExport.setRuleName("合计");
        calculateExport.setNum(list.stream().mapToInt(CalculateExport::getNum).sum());
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -200,7 +200,7 @@
        deductErrorType.add(ErrorType.ABNORMAL_PIC.getValue());
        deductErrorType.add(ErrorType.POINT_INFO_ERROR.getValue());
        deductErrorType.add(ErrorType.CLOCK_SKEW.getValue());
        List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(),deductErrorType);
        List<WorkOrderVO> workOrders = workOrderMapper.selectPassOrder(startTime, endTime, WorkOrderStatusEnum.AUDITING_SUCCESS.getValue(),deductErrorType,"审核通过");
        //存在有两种扣分的故障 只扣减第一个故障
        Map<String, WorkOrderVO> map = workOrders.stream()
                .collect(Collectors.toMap(
ycl-server/src/main/java/com/ycl/task/HKTask.java
@@ -173,7 +173,6 @@
        faceParam.setDataType(ApiConstants.HK_DataType_FACE);
        List<SnapshotDataMonitorResult> faceList = HkApiUtil.sendAPI(host, appKey, appSecret, "/api/dqd/service/rs/v1/data/snapCountDetail/query", faceParam, SnapshotDataMonitorResult.class);
        if (!CollectionUtils.isEmpty(faceList)) {
            log.info("结果数据大小:{}", faceList.size());
            //如果今天存在之前的数据先删除
            Query query = new Query(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))
@@ -189,22 +188,38 @@
            faceList.forEach(item -> item.setDataType(ApiConstants.HK_DataType_FACE));
            mongoTemplate.insertAll(faceList);
        }
        //修改online状态以及生成工单
        //修改online状态
        List<SnapshotDataMonitorResult> totalResult = new ArrayList<>();
        totalResult.addAll(carList);
        totalResult.addAll(faceList);
        if (!CollectionUtils.isEmpty(totalResult)) {
            List<String> numbers = totalResult.stream().map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList());
            Map<String, TMonitor> map = monitorMapper.selectList(new QueryWrapper<TMonitor>().in("serial_number", numbers))
                    .stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
            Date now = new Date();
            //过滤
            totalResult = totalResult.stream().filter(item -> map.get(item.getExternalIndexCode()) != null).collect(Collectors.toList());
            totalResult.forEach(item -> {
                TMonitor monitor = map.get(item.getExternalIndexCode());
                item.setIp(monitor.getIp());
            });
            //海康不做在线监测
            //先拿优云的在线,过滤掉优云已有的国标码
            Query query = new Query();
            query.addCriteria(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
            List<VideoOnlineResult> results = mongoTemplate.find(query, VideoOnlineResult.class);
            if (!CollectionUtils.isEmpty(results)) {
                Date now = new Date();
                List<String> uyNoList = results.stream().map(VideoOnlineResult::getNo).collect(Collectors.toList());
                List<String> numbers = totalResult.stream().filter(result->!uyNoList.contains(result.getExternalIndexCode()))
                        .map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList());
                //排除掉优云且不包含视频设备的国标
                Map<String, TMonitor> map = monitorMapper.selectList(new QueryWrapper<TMonitor>()
                                .in("serial_number", numbers))
                        .stream().filter(monitor -> monitor.getCameraFunType()!=null && !monitor.getCameraFunType().contains("1"))
                        .collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
                List<UpdateOnlineVO> willUpdateList = new ArrayList<>();
                totalResult.forEach(item -> {
                    TMonitor monitor = map.get(item.getExternalIndexCode());
                    if(monitor!=null) {
                        UpdateOnlineVO vo = new UpdateOnlineVO();
                        vo.setOnline(item.getDataCount() > 0 ? 1 : -1);
                        vo.setSerialNumber(monitor.getSerialNumber());
                        vo.setUpdateTime(now);
                        willUpdateList.add(vo);
                    }
                });
                if(!CollectionUtils.isEmpty(willUpdateList)) monitorMapper.updateOnlineFromHk(willUpdateList);
//            List<UpdateOnlineVO> willUpdateList = totalResult.stream().map(item -> {
//                UpdateOnlineVO vo = new UpdateOnlineVO();
//                vo.setOnline(item.getDataCount() > 0 ? 1 : -1);
@@ -222,6 +237,7 @@
//                            (existing, replacement) -> existing // 如果遇到相同的 IP,保留第一个(existing)
//                    )).values());
//            uyErrorTypeCheckService.hkOnlineCheck(workOrders);
            }
        }
        log.info("结束抓拍数据量检测结果数据同步");
    }
ycl-server/src/main/java/com/ycl/task/OsdTask.java
@@ -2,6 +2,11 @@
import com.mongodb.client.result.DeleteResult;
import com.ycl.api.DH.lib.NetSDKLib;
import com.ycl.api.DH.lib.structure.NET_CFG_GBMODE_INFO;
import com.ycl.api.DH.lib.structure.NET_GBMODE_CUSTOMTITLE_INFO;
import com.ycl.api.DH.lib.structure.NET_TITLE_OSD_INFO;
import com.ycl.api.DH.module.LoginModule;
import com.ycl.api.DH.utils.DHApi;
import com.ycl.api.HK.HKApi;
import com.ycl.api.YS.YSApi;
@@ -29,6 +34,9 @@
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.nio.charset.StandardCharsets;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -36,6 +44,8 @@
import java.util.concurrent.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static com.ycl.api.DH.lib.enumeration.NET_EM_CFG_OPERATE_TYPE.NET_EM_CFG_GBMODE;
@Slf4j
@Component("OsdTask")
@@ -60,6 +70,7 @@
    public String YSUserName;
    @Value("${YS.password}")
    public String YSPassword;
    /**
     * 通过查mongoDB每日一机一档数据获取设备ip
     * 筛选视频设备
@@ -86,7 +97,7 @@
        List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class);
        //需要考核的数据
        List<String> serialNumbers = oneMachineFileResults.stream().map(result -> result.getSerialNumber().getValue()).collect(Collectors.toList());
        if(!CollectionUtils.isEmpty(serialNumbers)) {
        if (!CollectionUtils.isEmpty(serialNumbers)) {
            ExecutorService executorService = new ThreadPoolExecutor(16,
                    128,
                    5000,
@@ -116,7 +127,7 @@
            List<OsdCheckResult> checkResults = new ArrayList<>();
            Map<String, TMonitor> monitorMap = monitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
            for (OSDResult osdResult : osdResultList) {
                if(osdResult!=null) {
                if (osdResult != null) {
                    TMonitor monitor = monitorMap.get(osdResult.getSerialNumber());
                    //封装OsdCheckResult
                    OsdCheckResult osdCheckResult = getOsdCheckResult(osdResult, monitor);
@@ -132,7 +143,7 @@
                Query pyQuery = new Query(Criteria
                        .where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date())));
                DeleteResult result = mongoTemplate.remove(pyQuery, OsdCheckResult.class);
                pointService.setDeviceTagByGB(checkResults,CheckConstants.Rule_Category_Video);
                pointService.setDeviceTagByGB(checkResults, CheckConstants.Rule_Category_Video);
                //存放在mongo中
                mongoTemplate.insertAll(checkResults);
                // 工单生成
@@ -170,7 +181,7 @@
            } else {
                osdCheckResult.setOsdTimeCorrect(ApiConstants.OSD_Error);
            }
        }else {
        } else {
            osdCheckResult.setOsdTimeCorrect(ApiConstants.OSD_Unknown);
        }
        //检查通道名是否正确
@@ -181,7 +192,7 @@
            } else {
                osdCheckResult.setOsdNameCorrect(ApiConstants.OSD_Error);
            }
        }else {
        } else {
            osdCheckResult.setOsdNameCorrect(ApiConstants.OSD_Unknown);
        }
        //检查省是否正确
@@ -191,7 +202,7 @@
            } else {
                osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Error);
            }
        }else {
        } else {
            osdCheckResult.setOsdProvinceCorrect(ApiConstants.OSD_Unknown);
        }
        //检查市是否正确
@@ -201,7 +212,7 @@
            } else {
                osdCheckResult.setOsdCityCorrect(ApiConstants.OSD_Error);
            }
        }else {
        } else {
            osdCheckResult.setOsdCityCorrect(ApiConstants.OSD_Unknown);
        }
        //检查区县是否正确
@@ -212,10 +223,15 @@
            } else {
                osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Error);
            }
        }else {
        } else {
            osdCheckResult.setOsdPartCorrect(ApiConstants.OSD_Unknown);
        }
    }
    public void test() throws ExecutionException, InterruptedException {
        log.info("测试获取OSD");
        OSDResult osd3 = DHApi.getOsd("51030446001320141102","51.95.68.3", DHUserName, DHPassword);
        log.info("大华结果数据:{}",osd3);
    }
}
ycl-server/src/main/resources/mapper/zgyw/CalculateReportMapper.xml
@@ -122,6 +122,7 @@
                AND tcr.status=#{status}
            </if>
        </where>
        group by tcr.id
        ORDER BY
        tcr.create_time
    </select>
@@ -146,14 +147,26 @@
    </select>
    <select id="exportData" resultType="com.ycl.platform.domain.excel.CalculateExport">
        SELECT a.rule_name,
               COUNT(b.id)              AS num,
               IFNULL(-SUM(b.score), 0) AS score
        SELECT
        a.rule_name as ruleName,
        a.rule_condition as detailName,
        COUNT(b.id) AS num,
        IFNULL(-SUM(b.score), 0) AS score
        FROM t_calculate_rule a
        LEFT JOIN t_calculate_record tcr ON a.contract_id = tcr.contract_id And tcr.id = #{calculateId}
        LEFT JOIN t_contract_score b ON b.rule_id = a.id AND auditing_status = 'PASS' AND b.deleted = 0 AND YEAR (b.create_time) = tcr.which_year
        WHERE a.deleted = 0
        GROUP BY a.rule_name
        LEFT JOIN t_calculate_record tcr ON a.contract_id = tcr.contract_id
        LEFT JOIN t_contract_score b ON b.rule_id = a.id AND auditing_status = 'PASS' AND b.deleted = 0
            AND MONTH(b.create_time) = tcr.which_month
            AND YEAR(b.create_time) = tcr.which_year
        <where>
            a.deleted = 0 and a.contract_id = #{contractId}
            <if test="whichMonth!=null">
                and tcr.which_month = #{whichMonth}
            </if>
            <if test="whichYear!=null">
                and tcr.which_year = #{whichYear}
            </if>
        </where>
        GROUP BY a.id
    </select>
</mapper>
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -691,6 +691,18 @@
            AND t_monitor.serial_number = t_yw_point.serial_number )
        </foreach>
    </update>
    <update id="updateOnlineFromHk">
        <foreach collection="onlineList" item="online" separator=";">
            UPDATE
            t_yw_point
            SET
            online = #{online.online},
            update_time = #{online.updateTime}
            WHERE
            serial_number = #{online.serialNumber}
        </foreach>
    </update>
    <update id="batchUpdateOnline">
            UPDATE
            t_yw_point p
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -362,13 +362,13 @@
        SELECT wo.id,wo.work_order_no,wo.unit_id,woet.error_name as errorType,woet.create_time as distributeTime
        FROM t_work_order wo
        LEFT JOIN t_work_order_error_type woet ON woet.work_order_no = wo.work_order_no
        LEFT JOIN t_work_order_auditing_record woar ON woar.work_order_no = wo.work_order_no
        LEFT JOIN t_work_order_auditing_record woar ON woar.work_order_no = wo.work_order_no and woar.result = #{auditStatus}
        WHERE wo.deleted = 0 AND wo.deduct = 0 AND wo.status = #{status}
        AND woet.error_name in
        <foreach collection="errorList" item="error" separator="," open="(" close=")">
            #{error}
        </foreach>
        AND woar.create_time between #{startTime} and #{endTime} and woar.result = #{auditStatus}
        AND woar.create_time between #{startTime} and #{endTime}
    </select>
    <update id="updateMany">