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 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 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为deptId或者Province_deptId * 循环map计算点位在线率 * 更新或新增 * @param list */ //TODO:视图库对接稳定性 @Override public void siteOnline(List list) { //设备id List 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 monitors = monitorService.list(new QueryWrapper().in("serial_number", deviceIds)); Map areaStatsMap = new HashMap<>(); //获得所有区县deptId List deptIds = deptMapper.selectByParentId(207L); deptIds.forEach(deptId -> areaStatsMap.put(deptId + "", new AreaStats())); //转换为map //TODO:分省厅市局 需要补充集合数据 List provinceIds = new ArrayList<>(); Map 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 checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate()); List checkIndexCars = new ArrayList<>(); areaStatsMap.forEach((k, v) -> { if (v.totalSites == 0) { log.info("部门id为{}总点位数为0", k); } else { CheckIndexCar checkIndexCar = new CheckIndexCar(); //找是否已经存在数据 Optional 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); } } }