package com.ycl.platform.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ycl.platform.domain.entity.CalculateReport;
|
import com.ycl.platform.domain.entity.CheckIndexCar;
|
import com.ycl.platform.domain.entity.TMonitor;
|
import com.ycl.platform.domain.result.HK.SnapshotDataMonitorResult;
|
import com.ycl.platform.mapper.CalculateReportMapper;
|
import com.ycl.platform.mapper.CheckIndexCarMapper;
|
import com.ycl.platform.service.ICheckIndexCarService;
|
import com.ycl.platform.service.ITMonitorService;
|
import com.ycl.system.entity.SysDept;
|
import com.ycl.system.mapper.SysDeptMapper;
|
import constant.ApiConstants;
|
import constant.CheckConstants;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.CollectionUtils;
|
import utils.DateUtils;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
/**
|
* 车辆指标概率数据Service业务层处理
|
*
|
* @author ruoyi
|
* @date 2024-04-29
|
*/
|
@Service
|
@Slf4j
|
public class CheckIndexCarServiceImpl extends ServiceImpl<CheckIndexCarMapper, CheckIndexCar> implements ICheckIndexCarService {
|
@Autowired
|
private CheckIndexCarMapper checkIndexCarMapper;
|
@Autowired
|
private ITMonitorService monitorService;
|
@Autowired
|
private SysDeptMapper deptMapper;
|
|
/**
|
* 查询车辆指标概率数据
|
*
|
* @param id 车辆指标概率数据主键
|
* @return 车辆指标概率数据
|
*/
|
@Override
|
public CheckIndexCar selectCheckIndexCarById(Long id) {
|
return checkIndexCarMapper.selectCheckIndexCarById(id);
|
}
|
|
/**
|
* 查询车辆指标概率数据列表
|
*
|
* @param checkIndexCar 车辆指标概率数据
|
* @return 车辆指标概率数据
|
*/
|
@Override
|
public List<CheckIndexCar> selectCheckIndexCarList(CheckIndexCar checkIndexCar) {
|
return checkIndexCarMapper.selectCheckIndexCarList(checkIndexCar);
|
}
|
|
/**
|
* 新增车辆指标概率数据
|
*
|
* @param checkIndexCar 车辆指标概率数据
|
* @return 结果
|
*/
|
@Override
|
public int insertCheckIndexCar(CheckIndexCar checkIndexCar) {
|
checkIndexCar.setCreateTime(DateUtils.getNowDate());
|
return checkIndexCarMapper.insertCheckIndexCar(checkIndexCar);
|
}
|
|
/**
|
* 修改车辆指标概率数据
|
*
|
* @param checkIndexCar 车辆指标概率数据
|
* @return 结果
|
*/
|
@Override
|
public int updateCheckIndexCar(CheckIndexCar checkIndexCar) {
|
return checkIndexCarMapper.updateCheckIndexCar(checkIndexCar);
|
}
|
|
/**
|
* 批量删除车辆指标概率数据
|
*
|
* @param ids 需要删除的车辆指标概率数据主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteCheckIndexCarByIds(Long[] ids) {
|
return checkIndexCarMapper.deleteCheckIndexCarByIds(ids);
|
}
|
|
/**
|
* 删除车辆指标概率数据信息
|
*
|
* @param id 车辆指标概率数据主键
|
* @return 结果
|
*/
|
@Override
|
public int deleteCheckIndexCarById(Long id) {
|
return checkIndexCarMapper.deleteCheckIndexCarById(id);
|
}
|
/**
|
* 计算车辆点位在线率、视图库对接稳定性
|
* 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId
|
* 循环map计算点位在线率
|
* 更新或新增
|
* @param list
|
*/
|
//TODO:视图库对接稳定性
|
@Override
|
public void siteOnline(List<SnapshotDataMonitorResult> list) {
|
//设备id
|
List<String> deviceIds = list.stream().map(SnapshotDataMonitorResult::getExternalIndexCode).collect(Collectors.toList());
|
if (!CollectionUtils.isEmpty(deviceIds)) {
|
// 用于存储每个区域统计信息的辅助类
|
class AreaStats {
|
//点位总数
|
int totalSites = 0;
|
//离线点位数
|
int offlineSites = 0;
|
//总抓拍量
|
int totalDataSum = 0;
|
}
|
List<TMonitor> monitors = monitorService.list(new QueryWrapper<TMonitor>().in("serial_number", deviceIds));
|
Map<String, AreaStats> areaStatsMap = new HashMap<>();
|
//获得所有区县deptId
|
List<Long> deptIds = deptMapper.selectByParentId(207L);
|
deptIds.forEach(deptId -> areaStatsMap.put(deptId + "", new AreaStats()));
|
|
//转换为map
|
//TODO:分省厅市局 需要补充集合数据
|
List<String> provinceIds = new ArrayList<>();
|
Map<String, TMonitor> monitorMap = monitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity()));
|
for (SnapshotDataMonitorResult result : list) {
|
TMonitor monitor = monitorMap.get(result.getExternalIndexCode());
|
AreaStats areaStats = areaStatsMap.get(monitor.getDeptId() + "");
|
String serialNumber = monitor.getSerialNumber();
|
//无数据
|
if (ApiConstants.HK_SnapCount_ResultType_Null == result.getResultType()) {
|
//区域离线点位数
|
areaStats.offlineSites++;
|
} else {
|
//区域总抓拍量
|
areaStats.totalSites += result.getDataCount();
|
}
|
//区域点位总数
|
areaStats.totalDataSum++;
|
//是否是省厅数据
|
if (!CollectionUtils.isEmpty(provinceIds)) {
|
if (provinceIds.contains(serialNumber)) {
|
//省厅数据
|
AreaStats provinceStats = areaStatsMap.get("Province_" + monitor.getDeptId());
|
//无数据
|
if (ApiConstants.HK_SnapCount_ResultType_Null == result.getResultType()) {
|
//区域离线点位数
|
provinceStats.offlineSites++;
|
} else {
|
//区域总抓拍量
|
provinceStats.totalDataSum += result.getDataCount();
|
}
|
//区域点位总数
|
provinceStats.totalSites++;
|
areaStatsMap.put("Province_" + monitor.getDeptId(), areaStats);
|
}
|
}
|
areaStatsMap.put(monitor.getDeptId() + "", areaStats);
|
}
|
List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
|
List<CheckIndexCar> checkIndexCars = new ArrayList<>();
|
areaStatsMap.forEach((k, v) -> {
|
if (v.totalSites == 0) {
|
log.info("部门id为{}总点位数为0", k);
|
} else {
|
CheckIndexCar checkIndexCar = new CheckIndexCar();
|
//找是否已经存在数据
|
Optional<CheckIndexCar> first;
|
if (k.startsWith("Province_")) {
|
//省厅
|
String[] idArray = k.split("_");
|
first = checkIndexCarList.stream().filter(item -> idArray[1].equals(item.getDeptId() + "") && CheckConstants.Examine_Tag_City.equals(item.getExamineTag()))
|
.findFirst();
|
checkIndexCar.setExamineTag(CheckConstants.Examine_Tag_City);
|
checkIndexCar.setDeptId(Long.parseLong(idArray[1]));
|
} else {
|
//区县
|
first = checkIndexCarList.stream().filter(item -> k.equals(item.getDeptId() + "") && CheckConstants.Examine_Tag_County.equals(item.getExamineTag()))
|
.findFirst();
|
checkIndexCar.setExamineTag(CheckConstants.Examine_Tag_County);
|
checkIndexCar.setDeptId(Long.parseLong(k));
|
}
|
checkIndexCar.setCreateTime(new Date());
|
if (first.isPresent()) {
|
checkIndexCar = first.get();
|
}
|
// 将整数转换为BigDecimal
|
BigDecimal totalSitesBd = new BigDecimal(v.totalSites);
|
BigDecimal offlineSitesBd = new BigDecimal(v.offlineSites);
|
// 执行计算,保留四位小数并四舍五入
|
BigDecimal onlineSitesBd = totalSitesBd.subtract(offlineSitesBd);
|
BigDecimal siteOnline = onlineSitesBd.divide(totalSitesBd, 4, RoundingMode.HALF_UP);
|
checkIndexCar.setSiteOnline(siteOnline);
|
checkIndexCars.add(checkIndexCar);
|
}
|
});
|
|
saveOrUpdateBatch(checkIndexCars);
|
}
|
}
|
|
}
|