ycl-common/src/main/java/constant/CheckThreadConstants.java
@@ -13,7 +13,5 @@ //车辆、人脸考核,点位在线率,区县不少于40路 public final static Integer Check_Car_SiteOnline = 40; public final static Integer Check_Face_SiteOnline = 40; //车辆、人脸在线率 Redis 每月数据中断次数 Hash key public final static String Check_Car_ViewConnect = "CarViewConnectNoData"; public final static String Check_Face_ViewConnect = "FaceViewConnectNoData"; } ycl-common/src/main/java/constant/RedisConstant.java
@@ -3,4 +3,7 @@ public class RedisConstant { /** 一机一档目录一致率 多出来的设备 Set集合 */ public static final String New_Monitor_Set="New_Monitor_Set"; //车辆、人脸在线率 Redis 每月数据中断次数 Hash key public final static String Check_Car_ViewConnect = "CarViewConnectNoData"; public final static String Check_Face_ViewConnect = "FaceViewConnectNoData"; } ycl-pojo/src/main/java/com/ycl/platform/domain/entity/ContractRuleRecord.java
New file @@ -0,0 +1,38 @@ package com.ycl.platform.domain.entity; import annotation.Excel; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; /** * 合同规则记录对象 t_contract_rule_record * * @author ruoyi * @date 2024-08-21 */ @Data public class ContractRuleRecord { private static final long serialVersionUID = 1L; /** $column.columnComment */ private Long id; /** 单位id */ @Excel(name = "单位id") private Long unitId; /** 点位在线率 */ @Excel(name = "点位在线率") private Integer siteOnline; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; private Long deleted; } ycl-pojo/src/main/java/com/ycl/platform/domain/vo/CalculateRuleVO.java
New file @@ -0,0 +1,62 @@ package com.ycl.platform.domain.vo; import enumeration.general.RuleDeductCategoryEnum; import lombok.Data; import java.util.Date; @Data public class CalculateRuleVO { /** * id */ private Integer id; /** * 合同id */ private Integer contractId; /** * 规则名称 */ private String ruleName; /** * 规则条件 */ private String ruleCondition; /** * 违规最小值 */ private Double min; /** * 违规最大值 */ private Double max; /** * 扣减方式 扣指定分数/分数乘以数量/除以数量后乘以分数 */ private RuleDeductCategoryEnum deductCategory; /** * 扣除分数 */ private Double calcFraction; /** * 当方式为除以时,除以当前字段数量 */ private Integer calcUnit; private Date createTime; private Date updateTime; private Integer deleted; private Integer unitId; } ycl-server/src/main/java/com/ycl/calculate/CarSnapshopDataCalculation.java
@@ -11,6 +11,7 @@ import constant.ApiConstants; import constant.CheckSnapCountConstants; import constant.CheckThreadConstants; import constant.RedisConstant; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -21,7 +22,10 @@ import java.math.RoundingMode; import java.time.LocalDate; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @@ -74,7 +78,7 @@ // 判断今天是否是本月的第一天 if (today.equals(firstDayOfMonth)) { // 如果是,则清除Redis中记录中断次数的数据 redisTemplate.delete(CheckThreadConstants.Check_Car_ViewConnect); redisTemplate.delete(RedisConstant.Check_Car_ViewConnect); } for (SnapshotDataMonitorResult result : list) { TMonitorVO monitor = monitorMap.get(result.getExternalIndexCode()); @@ -156,7 +160,7 @@ } //视图库对接稳定性 //Redis记录该区县当月无数据上传次数 Integer noDateCount = (Integer) redisTemplate.opsForHash().get(CheckThreadConstants.Check_Car_ViewConnect, key); Integer noDateCount = (Integer) redisTemplate.opsForHash().get(RedisConstant.Check_Car_ViewConnect, key); // 如果值为null,则初始化为0 if (noDateCount == null) { noDateCount = 0; @@ -174,7 +178,7 @@ noDateCount++; } // 将新的值放回Hash中 redisTemplate.opsForHash().put(CheckThreadConstants.Check_Car_ViewConnect, key, noDateCount); redisTemplate.opsForHash().put(RedisConstant.Check_Car_ViewConnect, key, noDateCount); return checkIndexCar; } } ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java
@@ -11,10 +11,7 @@ import com.ycl.platform.service.ICheckIndexFaceService; import com.ycl.platform.service.ITMonitorService; import com.ycl.system.mapper.SysConfigMapper; import constant.ApiConstants; import constant.CheckConstants; import constant.CheckSnapCountConstants; import constant.CheckThreadConstants; import constant.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; @@ -79,7 +76,7 @@ // 判断今天是否是本月的第一天 if (today.equals(firstDayOfMonth)) { // 如果是,则清除Redis中记录中断次数的数据 redisTemplate.delete(CheckThreadConstants.Check_Face_ViewConnect); redisTemplate.delete(RedisConstant.Check_Face_ViewConnect); } for (SnapshotDataMonitorResult result : list) { TMonitorVO monitor = monitorMap.get(result.getExternalIndexCode()); @@ -153,7 +150,7 @@ } //视图库对接稳定性 //Redis记录该区县当月无数据上传次数 Integer noDateCount = (Integer) redisTemplate.opsForHash().get(CheckThreadConstants.Check_Face_ViewConnect, key); Integer noDateCount = (Integer) redisTemplate.opsForHash().get(RedisConstant.Check_Face_ViewConnect, key); // 如果值为null,则初始化为0 if (noDateCount == null) { noDateCount = 0; @@ -171,7 +168,7 @@ noDateCount++; } // 将新的值放回Hash中 redisTemplate.opsForHash().put(CheckThreadConstants.Check_Face_ViewConnect, key, noDateCount); redisTemplate.opsForHash().put(RedisConstant.Check_Face_ViewConnect, key, noDateCount); return checkIndexFace; } } ycl-server/src/main/java/com/ycl/platform/mapper/ContractRuleRecordMapper.java
New file @@ -0,0 +1,65 @@ package com.ycl.platform.mapper; import com.ycl.platform.domain.entity.ContractRuleRecord; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 合同规则记录Mapper接口 * * @author ruoyi * @date 2024-08-21 */ public interface ContractRuleRecordMapper { /** * 查询合同规则记录 * * @param id 合同规则记录主键 * @return 合同规则记录 */ public ContractRuleRecord selectContractRuleRecordById(Long id); /** * 查询合同规则记录列表 * * @param contractRuleRecord 合同规则记录 * @return 合同规则记录集合 */ public List<ContractRuleRecord> selectContractRuleRecordList(ContractRuleRecord contractRuleRecord); /** * 新增合同规则记录 * * @param contractRuleRecord 合同规则记录 * @return 结果 */ public int insertContractRuleRecord(ContractRuleRecord contractRuleRecord); public void insertBatch(@Param("list") List<ContractRuleRecord> list); /** * 修改合同规则记录 * * @param contractRuleRecord 合同规则记录 * @return 结果 */ public int updateContractRuleRecord(ContractRuleRecord contractRuleRecord); /** * 删除合同规则记录 * * @param id 合同规则记录主键 * @return 结果 */ public int deleteContractRuleRecordById(Long id); /** * 批量删除合同规则记录 * * @param ids 需要删除的数据主键集合 * @return 结果 */ public int deleteContractRuleRecordByIds(Long[] ids); } ycl-server/src/main/java/com/ycl/platform/mapper/ReportMapper.java
@@ -6,6 +6,8 @@ import com.ycl.platform.domain.query.ReportQuery; import com.ycl.platform.domain.vo.ReportVO; import com.ycl.platform.domain.form.ReportForm; import java.util.Date; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +31,6 @@ * @return */ List<ReportVO> examineRecord(@Param("id") Integer id); List<String> selectNumberList(String status, String date); } ycl-server/src/main/java/com/ycl/platform/mapper/TContractMapper.java
@@ -5,9 +5,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ycl.platform.domain.entity.TContract; import com.ycl.platform.domain.query.ContractQuery; import com.ycl.platform.domain.vo.CalculateRuleVO; import com.ycl.platform.domain.vo.ContractVO; import org.apache.ibatis.annotations.Param; import java.util.Date; import java.util.List; /** @@ -21,4 +23,5 @@ IPage<ContractVO> getPage(IPage page, @Param("query") ContractQuery query); List<CalculateRuleVO> selectByRuleName(String ruleName, String ruleCondition, Date date); } ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -1,12 +1,36 @@ package com.ycl.task; import com.ycl.platform.mapper.TContractMapper; import com.ycl.platform.mapper.TMonitorMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mongodb.client.result.DeleteResult; import com.ycl.platform.domain.entity.ContractRuleRecord; import com.ycl.platform.domain.entity.Report; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; import com.ycl.platform.domain.result.UY.VideoOnlineResult; import com.ycl.platform.domain.vo.CalculateRuleVO; import com.ycl.platform.domain.vo.ContractVO; import com.ycl.platform.domain.vo.ReportVO; import com.ycl.platform.mapper.*; import com.ycl.utils.DateUtils; import constant.ApiConstants; import constant.RedisConstant; import enumeration.ContractRule; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import javax.management.monitor.Monitor; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * 合同考核定时任务 @@ -17,20 +41,88 @@ @Autowired private MongoTemplate mongoTemplate; @Autowired private RedisTemplate redisTemplate; @Autowired private TMonitorMapper monitorMapper; @Autowired private TContractMapper contractMapper; @Autowired private YwPointMapper ywPointMapper; @Autowired private ReportMapper reportMapper; @Autowired private ContractRuleRecordMapper recordMapper; private static final Integer Online = 1; private static final Integer Offline = -1; private static final String AuditStatus_Pass = "1"; /** * 合同考核 在线率每日任务检测 * 查生效的合同关联的公司,获取unitId集合 * 根据unitId查询对应点位获取各个公司管理的设备Ids * 查询三种设备在线不在线情况,封装为一个map<国标码,在线状态> * 计算每日每家公司的在线率存入redis * 计算每日每家公司的在线率存入mysql * 月底计算平均值,根据在线率和合同标准扣减分数 */ public void onlineCheck() { // contractMapper.selectByRuleName(); List<CalculateRuleVO> ruleVos = contractMapper.selectByRuleName(ContractRule.CONTRACT_RULE_Online.getName(), null, new Date()); List<Integer> unitIds = ruleVos.stream().map(CalculateRuleVO::getUnitId).collect(Collectors.toList()); List<YwPoint> ywPoints = ywPointMapper.selectList(new QueryWrapper<YwPoint>().in("unitId", unitIds)); //key是unitId value是设备编码集合 Map<Long, List<String>> unitMap = ywPoints.stream() .collect(Collectors.groupingBy( YwPoint::getUnitId, Collectors.mapping( YwPoint::getSerialNumber, Collectors.toList() ) )); Map<String, Integer> onlineStatusMap = new HashMap<>(); //查mongo获取设备在线情况 Date date = DateUtils.getDay(2024, 7, 13); //车辆、人脸 Query query = new Query(); query.addCriteria(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List<SnapshotDataMonitorResult> results = mongoTemplate.find(query, SnapshotDataMonitorResult.class); for (SnapshotDataMonitorResult result : results) { if (ApiConstants.HK_SnapCount_ResultType_Null != result.getResultType()) { onlineStatusMap.put(result.getExternalIndexCode(), Online); } else { onlineStatusMap.put(result.getExternalIndexCode(), Offline); } } //视频 Query videoQuery = new Query(Criteria .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); List<VideoOnlineResult> videoOnlineResults = mongoTemplate.find(videoQuery, VideoOnlineResult.class); for (VideoOnlineResult videoOnlineResult : videoOnlineResults) { onlineStatusMap.put(videoOnlineResult.getDeviceId(), videoOnlineResult.getStatus()); } //查询报备列表 List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate()); //计算每个公司的点位在线率 List<ContractRuleRecord> ruleRecordList = new ArrayList<>(); unitMap.forEach((unitId, serialNumberList) -> { int totalSite = 0; int onlineSite = 0; for (String number : serialNumberList) { //报备过不纳入计算 if (!CollectionUtils.isEmpty(reportNumbers) && reportNumbers.contains(number)) continue; Integer status = onlineStatusMap.get(number); totalSite++; if (Online.equals(status)) { onlineSite++; } } ContractRuleRecord contractRuleRecord = new ContractRuleRecord(); contractRuleRecord.setSiteOnline( onlineSite / totalSite); contractRuleRecord.setCreateTime(new Date()); contractRuleRecord.setUnitId(unitId); ruleRecordList.add(contractRuleRecord); }); //存储结果 recordMapper.insertBatch(ruleRecordList); } } ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -21,6 +21,7 @@ import enumeration.general.AreaDeptEnum; import enumeration.general.PointStatus; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; @@ -59,26 +60,28 @@ @Transactional(rollbackFor = Exception.class) public void synchronize() { log.info("开始同步mongodb一机一档到数据库"); Date date = DateUtils.getDay(2024,7,13); Date date = DateUtils.getDay(2024, 7, 13); Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date))); // Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); List<MonitorQualifyResult> oneMachineFileResults = mongoTemplate.find(query, MonitorQualifyResult.class); //数据库monitor表数据 Map<String, TMonitorVO> monitorVOMap = monitorMapper.selectMonitorVOList().stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity())); //准备插入设备表的数据 List<TMonitor> monitorList = new ArrayList<>(); //准备插入点位表的数据 List<YwPoint> ywPointList = new ArrayList<>(); //新的数据,原数据库中不存在的数据 Set<TMonitor> newMonitorList = new HashSet<>(); //点位数据 Map<String, YwPoint> pointMap = ywPointService.list(new QueryWrapper<YwPoint>()).stream().collect(Collectors.toMap(YwPoint::getSerialNumber, Function.identity())); //重点点位集合字典(解析SXJCJQY字段) SysDictData sysDictData = new SysDictData(); sysDictData.setDictType("platform_important_site"); List<SysDictData> DictDataList = dictDataService.selectDictDataList(sysDictData); //采集区域为重点点位的集合 List<String> importantSite = DictDataList.stream().map(SysDictData::getDictValue).collect(Collectors.toList()); //准备插入设备表的数据 List<TMonitor> monitorList = new ArrayList<>(); //准备插入点位表的数据 List<YwPoint> ywPointList = new ArrayList<>(); //新的数据,原数据库中不存在的数据 Set<TMonitor> newMonitorList = new HashSet<>(); //全年留存 for (MonitorQualifyResult result : oneMachineFileResults) { @@ -91,6 +94,22 @@ newMonitorList.add(monitor); } } //添加老数据 List<String> numbers = CollectionUtils.isEmpty(monitorList) ? new ArrayList<>() : monitorList.stream().map(TMonitor::getSerialNumber).collect(Collectors.toList()); monitorVOMap.forEach((key, value) -> { if (!numbers.contains(key)){ TMonitor monitor = new TMonitor(); BeanUtils.copyProperties(value,monitor); monitorList.add(monitor); } }); List<String> points = CollectionUtils.isEmpty(ywPointList) ? new ArrayList<>() : ywPointList.stream().map(YwPoint::getSerialNumber).collect(Collectors.toList()); pointMap.forEach((key, value) -> { if (!points.contains(key)){ ywPointList.add(value); } }); log.info("result集合{},设备集合{},点位集合{}", oneMachineFileResults.size(), monitorList.size(), ywPointList.size()); //插入数据库 if (!CollectionUtils.isEmpty(monitorList)) { ycl-server/src/main/resources/mapper/zgyw/ContractRuleRecordMapper.xml
New file @@ -0,0 +1,81 @@ <?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.ContractRuleRecordMapper"> <resultMap type="com.ycl.platform.domain.entity.ContractRuleRecord" id="ContractRuleRecordResult"> <result property="id" column="id"/> <result property="unitId" column="unit_id"/> <result property="siteOnline" column="site_online"/> <result property="createTime" column="create_time"/> <result property="deleted" column="deleted"/> </resultMap> <sql id="selectContractRuleRecordVo"> select id, unit_id, site_online, create_time, deleted from t_contract_rule_record </sql> <select id="selectContractRuleRecordList" resultMap="ContractRuleRecordResult"> <include refid="selectContractRuleRecordVo"/> <where> <if test="unitId != null ">and unit_id = #{unitId}</if> <if test="siteOnline != null ">and site_online = #{siteOnline}</if> <if test="deleted != null ">and deleted = #{deleted}</if> </where> </select> <select id="selectContractRuleRecordById" resultMap="ContractRuleRecordResult"> <include refid="selectContractRuleRecordVo"/> where id = #{id} </select> <insert id="insertContractRuleRecord" useGeneratedKeys="true" keyProperty="id"> insert into t_contract_rule_record <trim prefix="(" suffix=")" suffixOverrides=","> <if test="unitId != null">unit_id,</if> <if test="siteOnline != null">site_online,</if> <if test="createTime != null">create_time,</if> <if test="deleted != null">deleted,</if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="unitId != null">#{unitId},</if> <if test="siteOnline != null">#{siteOnline},</if> <if test="createTime != null">#{createTime},</if> <if test="deleted != null">#{deleted},</if> </trim> </insert> <insert id="insertBatch"> inner into t_contract_rule_record (unit_id,site_online,create_time) values <foreach collection="list" item="item" separator=","> (#{item.unitId},#{item.siteOnline},#{item.createTime}) </foreach> </insert> <update id="updateContractRuleRecord"> update t_contract_rule_record <trim prefix="SET" suffixOverrides=","> <if test="unitId != null">unit_id = #{unitId},</if> <if test="siteOnline != null">site_online = #{siteOnline},</if> <if test="createTime != null">create_time = #{createTime},</if> <if test="deleted != null">deleted = #{deleted},</if> </trim> where id = #{id} </update> <delete id="deleteContractRuleRecordById"> delete from t_contract_rule_record where id = #{id} </delete> <delete id="deleteContractRuleRecordByIds"> delete from t_contract_rule_record where id in <foreach item="id" collection="array" open="(" separator="," close=")"> #{id} </foreach> </delete> </mapper> ycl-server/src/main/resources/mapper/zgyw/ReportMapper.xml
@@ -64,4 +64,10 @@ r.create_time DESC </select> <select id="selectNumberList" resultType="java.lang.String"> SELECT yp.serial_number FROM t_report r LEFT JOIN t_yw_point yp ON r.point_id = yp.id WHERE r.status = #{status} AND #{date} between r.begin_create_time and r.end_create_time </select> </mapper> ycl-server/src/main/resources/mapper/zgyw/TContractMapper.xml
@@ -15,7 +15,7 @@ <select id="getPage" resultType="com.ycl.platform.domain.vo.ContractVO"> select a.*, b.unit_name from t_contract a left join t_yw_unit b on a.unit_id = b.id and b.deleted = 0 left join t_yw_unit b on a.unit_id = b.id and b.deleted = 0 where a.deleted = 0 <if test="query.name != null and query.name != ''"> and a.name like concat('%', #{query.name}, '%') @@ -23,10 +23,10 @@ <if test="query.status != null and query.status != ''"> <choose> <when test="query.status == 'ACTIVE'"> and a.start_time < sysdate() and a.end_time > sysdate() and a.start_time < sysdate() and a.end_time > sysdate() </when> <when test="query.status == 'NOT_START'"> and a.start_time > sysdate() and a.start_time > sysdate() </when> <when test="query.status == 'FINISHED'"> and a.end_time < sysdate() @@ -36,4 +36,19 @@ order by create_time desc </select> <select id="selectByRuleName" resultType="com.ycl.platform.domain.vo.CalculateRuleVO"> select tc.unit_id ,tcr.* from t_contract tc left join t_calculate_rule tcr on tc.id = tcr.contract_id <where> tc.deleted =0 and #{time} between tc.start_time and tc.end_time <if test="ruleName !=null and ruleName!=''"> tcr.rule_name = #{ruleName} </if> <if test="ruleCondition !=null and ruleCondition!=''"> tcr.rule_condition = #{ruleCondition} </if> </where> </select> </mapper>