package com.ruoyi.project.sems.controller; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.project.officeConvert.OfficeConvertController; import com.ruoyi.project.sems.domain.TMeasureThickness; import com.ruoyi.project.sems.domain.TSpecdevYlgd; import com.ruoyi.project.sems.mapper.TMeasureStressMapper; import com.ruoyi.project.sems.mapper.TMeasureThicknessMapper; import com.ruoyi.project.sems.service.ITMeasureLoopService; import com.ruoyi.project.sems.service.ITMeasureRecordService; import com.ruoyi.project.sems.service.ITMeasureStressService; import com.ruoyi.project.sems.service.ITMeasureThicknessService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.time.LocalDate; import java.time.Year; import java.util.*; /** * 定点测厚Controller * * @author ruoyi * @date 2021-07-07 */ @RestController @RequestMapping("/sems/cuihome") public class TMeasureCuiHomeController extends BaseController { @Autowired private ITMeasureThicknessService tMeasureThicknessService; @Autowired private ITMeasureRecordService tMeasureRecordService; @Autowired private OfficeConvertController officeConvertController; @Resource private TMeasureStressMapper tMeasureStressMapper; @Autowired private ITMeasureStressService tMeasureStressService; @Autowired private ITMeasureLoopService tMeasureLoopService; @Resource private TMeasureThicknessMapper tMeasureThicknessMapper; /** * 首页数据 */ @RequestMapping(value = "data") public AjaxResult homeData(@RequestBody Map params) { logger.info(JSON.toJSONString(params)); LocalDate today = LocalDate.now(); LocalDate oneMonthLater = today.plusMonths(1); Date sqlDate = java.sql.Date.valueOf(oneMonthLater); List plantIds = (List) params.get("plantIds"); if (plantIds == null) { plantIds = new ArrayList(); } if (plantIds.size() == 0) { plantIds.add("1"); } String plants = String.join(",", plantIds); TMeasureThickness paramT = new TMeasureThickness(); paramT.setPlants(plants); paramT.setIsPipe("0"); List sbAllList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); sbAllList = this.distinctByPlantAndTag(sbAllList); int sbAll = sbAllList.size(); paramT.setPlants(plants); paramT.setIsPipe("1"); List gdAllList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); gdAllList = this.distinctByPlantAndTag(gdAllList); int gdAll = gdAllList.size(); paramT.setPlants(plants); paramT.setIsPipe("0"); List sbWarnList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); sbWarnList = this.distinctByPlantAndTagAndDate(sbWarnList); int sbWarn = sbWarnList.size(); // int sbWarn = tMeasureThicknessService.count(new QueryWrapper() // .in("plant_code",plantIds) // .eq("dev_type" , "设备") // .eq("del_flag" , 0) // .isNotNull("NEXT_WARN_DATE") // 添加非空条件 // .and(wrapper -> wrapper // .le("NEXT_WARN_DATE", sqlDate) // ) // .groupBy("plant_code", "TAGNO") // 按指定字段分组(实现去重) // .select("1") // 优化性能,仅查询常量 // // ); paramT.setPlants(plants); paramT.setIsPipe("1"); List gdWarnList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); gdWarnList = this.distinctByPlantAndTagAndDate(gdWarnList); int gdWarn = gdWarnList.size(); // int gdWarn = tMeasureThicknessService.count(new QueryWrapper() // .in("plant_code",plantIds) // .and(wrapper -> wrapper // .ne("dev_type", "设备") // 排除 dev_type = '设备' // .or() // 或 // .isNull("dev_type") // 包含 dev_type 为 null 的记录 // ) // .eq("del_flag" , 0) // .isNotNull("NEXT_WARN_DATE") // 添加非空条件 // .and(wrapper -> wrapper // .le("NEXT_WARN_DATE", sqlDate) // ) // .groupBy("plant_code", "TAGNO") // 按指定字段分组(实现去重) // .select("1") // 优化性能,仅查询常量 // ); // Map res = new HashMap(); res.put("sbAll" ,sbAll) ; res.put("gdAll" ,gdAll) ; res.put("sbWarn" ,sbWarn) ; res.put("gdWarn" ,gdWarn) ; return AjaxResult.success(res); } public List distinctByPlantAndTag(List thicknesses) { Map resultMap = new LinkedHashMap<>(); for (TMeasureThickness t : thicknesses) { // 跳过空值 if (t.getPlantCode() == null || t.getTagno() == null) continue; // 构建复合键 String key = t.getPlantCode() + "|" + t.getTagno(); // 仅当键不存在时添加 resultMap.putIfAbsent(key, t); } return new ArrayList<>(resultMap.values()); } public List distinctByPlantAndTagAndDate(List thicknesses) { // 计算一个月后的日期 LocalDate oneMonthLater = LocalDate.now().plusMonths(1); Date sqlDate = java.sql.Date.valueOf(oneMonthLater); // 转换为 SQL Date 类型 // 使用LinkedHashMap保持插入顺序 Map resultMap = new LinkedHashMap<>(); for (TMeasureThickness t : thicknesses) { // 跳过关键字段为空的记录 if (t.getPlantCode() == null || t.getTagno() == null) continue; // 核心新增:过滤NEXT_WARN_DATE ≥ 一个月后的记录 if (t.getNextWarnDate() != null && !t.getNextWarnDate().before(sqlDate)) { continue; } // 构建复合键: plantCode + tagNo String key = t.getPlantCode() + "|" + t.getTagno(); // 仅当键不存在时添加(保留第一个符合条件的记录) resultMap.putIfAbsent(key, t); } return new ArrayList<>(resultMap.values()); } public List distinctByPlantAndTag(List thicknesses, int min, int max) { Map resultMap = new LinkedHashMap<>(); for (TMeasureThickness t : thicknesses) { // 跳过空值 if (t.getPlantCode() == null || t.getTagno() == null || t.getEstRemain() == null) continue; try { double estRemain = Double.parseDouble(t.getEstRemain().trim()); if (estRemain < min || estRemain > max) continue; // 构建复合键 String key = t.getPlantCode() + "|" + t.getTagno(); resultMap.putIfAbsent(key, t); } catch (NumberFormatException e) { // 如果转换失败,跳过该条记录 continue; } } return new ArrayList<>(resultMap.values()); } /** * 管道预估寿命数据 */ @RequestMapping(value = "gdData") public AjaxResult gdData(@RequestBody Map params) { List plantIds = (List) params.get("plantIds"); if (plantIds == null) { plantIds = new ArrayList(); } if (plantIds.size() == 0) { plantIds.add("1"); } String plants = String.join(",", plantIds); // 1. 获取当前年份 int currentYear = Year.now().getValue(); // 2. 创建包含当前年份及未来十年的年份列表 List targetYears = new ArrayList<>(); for (int i = 0; i <= 10; i++) { targetYears.add(currentYear + i); } // 3. 存储查询结果(年份 -> 过期数据) Map> expiredDataByYear = new HashMap<>(); List resData = new ArrayList<>(); // 4. 遍历每个年份并查询数据 for (int year : targetYears) { int estRemainMin = year - currentYear; TMeasureThickness paramT = new TMeasureThickness(); paramT.setPlants(plants); paramT.setIsPipe("1"); List allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); allList = this.distinctByPlantAndTag(allList,estRemainMin,estRemainMin + 1); int gd = allList.size(); // int gd = tMeasureThicknessService.count(new QueryWrapper() // .in("plant_code", plantIds) // .and(wrapper -> wrapper // .ne("dev_type", "设备") // 排除 dev_type = '设备' // .or() // 或 // .isNull("dev_type") // 包含 dev_type 为 null 的记录 // ) // .eq("del_flag", 0) // .between("EST_REMAIN", estRemainMin, estRemainMin + 1) // ); resData.add(gd); } Map res = new HashMap(); res.put("targetYears" ,targetYears) ; res.put("resData" ,resData) ; return AjaxResult.success(res); } /** * 管道预估寿命数据 */ @RequestMapping(value = "sbData") public AjaxResult sbData(@RequestBody Map params) { List plantIds = (List) params.get("plantIds"); if (plantIds == null) { plantIds = new ArrayList(); } if (plantIds.size() == 0) { plantIds.add("1"); } String plants = String.join(",", plantIds); // 1. 获取当前年份 int currentYear = Year.now().getValue(); // 2. 创建包含当前年份及未来十年的年份列表 List targetYears = new ArrayList<>(); for (int i = 0; i <= 10; i++) { targetYears.add(currentYear + i); } // 3. 存储查询结果(年份 -> 过期数据) Map> expiredDataByYear = new HashMap<>(); List resData = new ArrayList<>(); // 4. 遍历每个年份并查询数据 for (int year : targetYears) { TMeasureThickness t = new TMeasureThickness(); int estRemainMin =year - currentYear; TMeasureThickness paramT = new TMeasureThickness(); paramT.setPlants(plants); paramT.setIsPipe("0"); List allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); allList = this.distinctByPlantAndTag(allList,estRemainMin,estRemainMin + 1); int gd = allList.size(); // int gd = tMeasureThicknessService.count(new QueryWrapper() // .in("plant_code", plantIds) // .eq("dev_type" , "设备") // .eq("del_flag", 0) // .between("EST_REMAIN", estRemainMin, estRemainMin + 1) // ); resData.add(gd); } Map res = new HashMap(); res.put("targetYears" ,targetYears) ; res.put("resData" ,resData) ; return AjaxResult.success(res); } /** * 管道预估寿命数据 */ @RequestMapping(value = "gdDataPie") public AjaxResult gdDataPie(@RequestBody Map params) { List plantIds = (List) params.get("plantIds"); if (plantIds == null) { plantIds = new ArrayList(); } if (plantIds.size() == 0) { plantIds.add("1"); } String plants = String.join(",", plantIds); // 3. 存储查询结果(年份 -> 过期数据) List resData = new ArrayList<>(); // 4. 遍历每个年份并查询数据 TMeasureThickness paramT = new TMeasureThickness(); paramT.setPlants(plants); paramT.setIsPipe("1"); List allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); allList = this.distinctByPlantAndTag(allList,0,3); resData.add(this.distinctByPlantAndTag(allList,0,3).size()); resData.add(this.distinctByPlantAndTag(allList,3,6).size()); resData.add(this.distinctByPlantAndTag(allList,6,10).size()); resData.add(this.distinctByPlantAndTag(allList,10,999).size()); Map res = new HashMap(); res.put("resData" ,resData) ; return AjaxResult.success(res); } /** * 管道预估寿命数据 */ @RequestMapping(value = "sbDataPie") public AjaxResult sbDataPie(@RequestBody Map params) { List plantIds = (List) params.get("plantIds"); if (plantIds == null) { plantIds = new ArrayList(); } if (plantIds.size() == 0) { plantIds.add("1"); } String plants = String.join(",", plantIds); // 3. 存储查询结果(年份 -> 过期数据) List resData = new ArrayList<>(); // 4. 遍历每个年份并查询数据 TMeasureThickness paramT = new TMeasureThickness(); paramT.setPlants(plants); paramT.setIsPipe("0"); List allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT); allList = this.distinctByPlantAndTag(allList,0,3); resData.add(this.distinctByPlantAndTag(allList,0,3).size()); resData.add(this.distinctByPlantAndTag(allList,3,6).size()); resData.add(this.distinctByPlantAndTag(allList,6,10).size()); resData.add(this.distinctByPlantAndTag(allList,10,999).size()); Map res = new HashMap(); res.put("resData" ,resData); return AjaxResult.success(res); } }