| | |
| | | package com.ycl.calculate; |
| | | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.ycl.platform.domain.entity.TMonitor; |
| | | import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult; |
| | | import com.ycl.platform.service.ITMonitorService; |
| | | import com.ycl.platform.domain.result.BaseResult; |
| | | import com.ycl.platform.domain.vo.TMonitorVO; |
| | | import com.ycl.platform.mapper.TMonitorMapper; |
| | | import constant.ApiConstants; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Component; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.math.RoundingMode; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.*; |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * 计算公式 |
| | | * 抽出各区域统计数量方法 |
| | | */ |
| | | @Component |
| | | public class IndexCalculationServe { |
| | | |
| | | @Slf4j |
| | | public abstract class IndexCalculationServe<T extends BaseResult, S> extends IndexCalculationUtils { |
| | | @Autowired |
| | | private ITMonitorService monitorService; |
| | | private TMonitorMapper monitorMapper; |
| | | |
| | | //点位在线率 |
| | | public BigDecimal siteOnline(Map<String, Object> param) { |
| | | BigDecimal totalSites = new BigDecimal((Integer) param.get("totalSites")); |
| | | BigDecimal offlineSites = new BigDecimal((Integer) param.get("offlineSites")); |
| | | BigDecimal onlineSites = totalSites.subtract(offlineSites); |
| | | return onlineSites.divide(totalSites, 4, RoundingMode.HALF_UP); |
| | | } |
| | | //抽象方法,由子类编写具体逻辑算法 |
| | | protected abstract void updateAreaStats(Map<String, S> areaStatsMap, String key, T result); |
| | | |
| | | //视图库对接稳定性 |
| | | public BigDecimal viewConnectStability(Map<String, Object> param) { |
| | | BigDecimal totalDataSum = new BigDecimal((Integer) param.get("totalDataSum")); |
| | | BigDecimal avgCount = new BigDecimal((Integer) param.get("avgCount")); |
| | | return avgCount.divide(totalDataSum, 4, RoundingMode.HALF_UP); |
| | | } |
| | | protected Map<String, S> getAreaStatsMap(List<T> list, Boolean needDept) { |
| | | if (CollectionUtils.isEmpty(list)) { |
| | | log.info("数据为空"); |
| | | return null; |
| | | } |
| | | //返回以国标码为key的设备map |
| | | Map<String, TMonitorVO> monitorMap = monitorMapper.selectListByIds(list.stream().map(BaseResult::getNo).collect(Collectors.toList())) |
| | | .stream().collect(Collectors.toMap(TMonitorVO::getSerialNumber, Function.identity())); |
| | | Map<String, S> areaStatsMap = new HashMap<>(); |
| | | |
| | | //标注正确率 |
| | | public BigDecimal infoAccuracy(Map<String, Object> param) { |
| | | BigDecimal totalSitesCount = new BigDecimal((Integer) param.get("totalSites")); |
| | | BigDecimal qualifySiteCount = new BigDecimal((Integer) param.get("qualifySite")); |
| | | return qualifySiteCount.divide(totalSitesCount, 4, RoundingMode.HALF_UP); |
| | | } |
| | | for (T result : list) { |
| | | //获取设备所属部门 |
| | | TMonitorVO monitor = monitorMap.get(result.getNo()); |
| | | if (monitor == null) continue; |
| | | String deptId = monitor.getDeptId().toString(); |
| | | updateAreaStats(areaStatsMap, deptId, result); |
| | | |
| | | //数据上传及时性 |
| | | public BigDecimal snapshopDelay(Map<String, Object> param) { |
| | | BigDecimal totalCount = new BigDecimal((Integer) param.get("totalCount")); |
| | | BigDecimal delayCount1 = new BigDecimal((Integer) param.get("delayCount1")); |
| | | BigDecimal delayCount2 = new BigDecimal((Integer) param.get("delayCount2")); |
| | | BigDecimal delayCount3 = new BigDecimal((Integer) param.get("delayCount3")); |
| | | |
| | | BigDecimal result = delayCount1.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(BigDecimal.ONE) |
| | | .add(delayCount2.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("0.8"))) |
| | | .add(delayCount3.divide(totalCount, 10, RoundingMode.HALF_UP).multiply(new BigDecimal("0.6"))); |
| | | return result.setScale(4, RoundingMode.HALF_UP); |
| | | } |
| | | //返回省厅国标码集合 |
| | | public List<String> getProvince() { |
| | | // TODO: 分省厅市局 需要补充集合数据 |
| | | List<String> list = new ArrayList<>(); |
| | | return list; |
| | | // 处理省厅考核数据 |
| | | if (result.getProvinceTag() != null && result.getProvinceTag()) { |
| | | String provinceKey = ApiConstants.Province + deptId; |
| | | updateAreaStats(areaStatsMap, provinceKey, result); |
| | | } |
| | | // 处理公安部考核数据(公安部数据只有视频才有,所以这里定义了needDept来决定是否需要处理部级数据) |
| | | if (needDept) { |
| | | if (result.getDeptTag() != null && result.getDeptTag()) { |
| | | String deptKey = ApiConstants.Dept + deptId; |
| | | updateAreaStats(areaStatsMap, deptKey, result); |
| | | } |
| | | } |
| | | } |
| | | return areaStatsMap; |
| | | } |
| | | } |