TMeasureCuiHomeController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. package com.ruoyi.project.sems.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.ruoyi.framework.web.controller.BaseController;
  5. import com.ruoyi.framework.web.domain.AjaxResult;
  6. import com.ruoyi.project.officeConvert.OfficeConvertController;
  7. import com.ruoyi.project.sems.domain.TMeasureThickness;
  8. import com.ruoyi.project.sems.domain.TSpecdevYlgd;
  9. import com.ruoyi.project.sems.mapper.TMeasureStressMapper;
  10. import com.ruoyi.project.sems.mapper.TMeasureThicknessMapper;
  11. import com.ruoyi.project.sems.service.ITMeasureLoopService;
  12. import com.ruoyi.project.sems.service.ITMeasureRecordService;
  13. import com.ruoyi.project.sems.service.ITMeasureStressService;
  14. import com.ruoyi.project.sems.service.ITMeasureThicknessService;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.web.bind.annotation.*;
  17. import javax.annotation.Resource;
  18. import java.time.LocalDate;
  19. import java.time.Year;
  20. import java.util.*;
  21. /**
  22. * 定点测厚Controller
  23. *
  24. * @author ruoyi
  25. * @date 2021-07-07
  26. */
  27. @RestController
  28. @RequestMapping("/sems/cuihome")
  29. public class TMeasureCuiHomeController extends BaseController {
  30. @Autowired
  31. private ITMeasureThicknessService tMeasureThicknessService;
  32. @Autowired
  33. private ITMeasureRecordService tMeasureRecordService;
  34. @Autowired
  35. private OfficeConvertController officeConvertController;
  36. @Resource
  37. private TMeasureStressMapper tMeasureStressMapper;
  38. @Autowired
  39. private ITMeasureStressService tMeasureStressService;
  40. @Autowired
  41. private ITMeasureLoopService tMeasureLoopService;
  42. @Resource
  43. private TMeasureThicknessMapper tMeasureThicknessMapper;
  44. /**
  45. * 首页数据
  46. */
  47. @RequestMapping(value = "data")
  48. public AjaxResult homeData(@RequestBody Map<String, Object> params) {
  49. logger.info(JSON.toJSONString(params));
  50. LocalDate today = LocalDate.now();
  51. LocalDate oneMonthLater = today.plusMonths(1);
  52. Date sqlDate = java.sql.Date.valueOf(oneMonthLater);
  53. List plantIds = (List) params.get("plantIds");
  54. if (plantIds == null) {
  55. plantIds = new ArrayList();
  56. }
  57. if (plantIds.size() == 0) {
  58. plantIds.add("1");
  59. }
  60. String plants = String.join(",", plantIds);
  61. TMeasureThickness paramT = new TMeasureThickness();
  62. paramT.setPlants(plants);
  63. paramT.setIsPipe("0");
  64. List<TMeasureThickness> sbAllList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  65. sbAllList = this.distinctByPlantAndTag(sbAllList);
  66. int sbAll = sbAllList.size();
  67. paramT.setPlants(plants);
  68. paramT.setIsPipe("1");
  69. List<TMeasureThickness> gdAllList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  70. gdAllList = this.distinctByPlantAndTag(gdAllList);
  71. int gdAll = gdAllList.size();
  72. paramT.setPlants(plants);
  73. paramT.setIsPipe("0");
  74. List<TMeasureThickness> sbWarnList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  75. sbWarnList = this.distinctByPlantAndTagAndDate(sbWarnList);
  76. int sbWarn = sbWarnList.size();
  77. // int sbWarn = tMeasureThicknessService.count(new QueryWrapper<TMeasureThickness>()
  78. // .in("plant_code",plantIds)
  79. // .eq("dev_type" , "设备")
  80. // .eq("del_flag" , 0)
  81. // .isNotNull("NEXT_WARN_DATE") // 添加非空条件
  82. // .and(wrapper -> wrapper
  83. // .le("NEXT_WARN_DATE", sqlDate)
  84. // )
  85. // .groupBy("plant_code", "TAGNO") // 按指定字段分组(实现去重)
  86. // .select("1") // 优化性能,仅查询常量
  87. //
  88. // );
  89. paramT.setPlants(plants);
  90. paramT.setIsPipe("1");
  91. List<TMeasureThickness> gdWarnList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  92. gdWarnList = this.distinctByPlantAndTagAndDate(gdWarnList);
  93. int gdWarn = gdWarnList.size();
  94. // int gdWarn = tMeasureThicknessService.count(new QueryWrapper<TMeasureThickness>()
  95. // .in("plant_code",plantIds)
  96. // .and(wrapper -> wrapper
  97. // .ne("dev_type", "设备") // 排除 dev_type = '设备'
  98. // .or() // 或
  99. // .isNull("dev_type") // 包含 dev_type 为 null 的记录
  100. // )
  101. // .eq("del_flag" , 0)
  102. // .isNotNull("NEXT_WARN_DATE") // 添加非空条件
  103. // .and(wrapper -> wrapper
  104. // .le("NEXT_WARN_DATE", sqlDate)
  105. // )
  106. // .groupBy("plant_code", "TAGNO") // 按指定字段分组(实现去重)
  107. // .select("1") // 优化性能,仅查询常量
  108. // );
  109. //
  110. Map<String, Object> res = new HashMap<String, Object>();
  111. res.put("sbAll" ,sbAll) ;
  112. res.put("gdAll" ,gdAll) ;
  113. res.put("sbWarn" ,sbWarn) ;
  114. res.put("gdWarn" ,gdWarn) ;
  115. return AjaxResult.success(res);
  116. }
  117. public List<TMeasureThickness> distinctByPlantAndTag(List<TMeasureThickness> thicknesses) {
  118. Map<String, TMeasureThickness> resultMap = new LinkedHashMap<>();
  119. for (TMeasureThickness t : thicknesses) {
  120. // 跳过空值
  121. if (t.getPlantCode() == null || t.getTagno() == null) continue;
  122. // 构建复合键
  123. String key = t.getPlantCode() + "|" + t.getTagno();
  124. // 仅当键不存在时添加
  125. resultMap.putIfAbsent(key, t);
  126. }
  127. return new ArrayList<>(resultMap.values());
  128. }
  129. public List<TMeasureThickness> distinctByPlantAndTagAndDate(List<TMeasureThickness> thicknesses) {
  130. // 计算一个月后的日期
  131. LocalDate oneMonthLater = LocalDate.now().plusMonths(1);
  132. Date sqlDate = java.sql.Date.valueOf(oneMonthLater);
  133. // 转换为 SQL Date 类型
  134. // 使用LinkedHashMap保持插入顺序
  135. Map<String, TMeasureThickness> resultMap = new LinkedHashMap<>();
  136. for (TMeasureThickness t : thicknesses) {
  137. // 跳过关键字段为空的记录
  138. if (t.getPlantCode() == null || t.getTagno() == null) continue;
  139. // 核心新增:过滤NEXT_WARN_DATE ≥ 一个月后的记录
  140. if (t.getNextWarnDate() != null && !t.getNextWarnDate().before(sqlDate)) {
  141. continue;
  142. }
  143. // 构建复合键: plantCode + tagNo
  144. String key = t.getPlantCode() + "|" + t.getTagno();
  145. // 仅当键不存在时添加(保留第一个符合条件的记录)
  146. resultMap.putIfAbsent(key, t);
  147. }
  148. return new ArrayList<>(resultMap.values());
  149. }
  150. public List<TMeasureThickness> distinctByPlantAndTag(List<TMeasureThickness> thicknesses, int min, int max) {
  151. Map<String, TMeasureThickness> resultMap = new LinkedHashMap<>();
  152. for (TMeasureThickness t : thicknesses) {
  153. // 跳过空值
  154. if (t.getPlantCode() == null || t.getTagno() == null || t.getEstRemain() == null) continue;
  155. try {
  156. double estRemain = Double.parseDouble(t.getEstRemain().trim());
  157. if (estRemain < min || estRemain > max) continue;
  158. // 构建复合键
  159. String key = t.getPlantCode() + "|" + t.getTagno();
  160. resultMap.putIfAbsent(key, t);
  161. } catch (NumberFormatException e) {
  162. // 如果转换失败,跳过该条记录
  163. continue;
  164. }
  165. }
  166. return new ArrayList<>(resultMap.values());
  167. }
  168. /**
  169. * 管道预估寿命数据
  170. */
  171. @RequestMapping(value = "gdData")
  172. public AjaxResult gdData(@RequestBody Map<String, Object> params) {
  173. List plantIds = (List) params.get("plantIds");
  174. if (plantIds == null) {
  175. plantIds = new ArrayList();
  176. }
  177. if (plantIds.size() == 0) {
  178. plantIds.add("1");
  179. }
  180. String plants = String.join(",", plantIds);
  181. // 1. 获取当前年份
  182. int currentYear = Year.now().getValue();
  183. // 2. 创建包含当前年份及未来十年的年份列表
  184. List<Integer> targetYears = new ArrayList<>();
  185. for (int i = 0; i <= 10; i++) {
  186. targetYears.add(currentYear + i);
  187. }
  188. // 3. 存储查询结果(年份 -> 过期数据)
  189. Map<Integer, List<String>> expiredDataByYear = new HashMap<>();
  190. List<Integer> resData = new ArrayList<>();
  191. // 4. 遍历每个年份并查询数据
  192. for (int year : targetYears) {
  193. int estRemainMin = year - currentYear;
  194. TMeasureThickness paramT = new TMeasureThickness();
  195. paramT.setPlants(plants);
  196. paramT.setIsPipe("1");
  197. List<TMeasureThickness> allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  198. allList = this.distinctByPlantAndTag(allList,estRemainMin,estRemainMin + 1);
  199. int gd = allList.size();
  200. // int gd = tMeasureThicknessService.count(new QueryWrapper<TMeasureThickness>()
  201. // .in("plant_code", plantIds)
  202. // .and(wrapper -> wrapper
  203. // .ne("dev_type", "设备") // 排除 dev_type = '设备'
  204. // .or() // 或
  205. // .isNull("dev_type") // 包含 dev_type 为 null 的记录
  206. // )
  207. // .eq("del_flag", 0)
  208. // .between("EST_REMAIN", estRemainMin, estRemainMin + 1)
  209. // );
  210. resData.add(gd);
  211. }
  212. Map<String, Object> res = new HashMap<String, Object>();
  213. res.put("targetYears" ,targetYears) ;
  214. res.put("resData" ,resData) ;
  215. return AjaxResult.success(res);
  216. }
  217. /**
  218. * 管道预估寿命数据
  219. */
  220. @RequestMapping(value = "sbData")
  221. public AjaxResult sbData(@RequestBody Map<String, Object> params) {
  222. List plantIds = (List) params.get("plantIds");
  223. if (plantIds == null) {
  224. plantIds = new ArrayList();
  225. }
  226. if (plantIds.size() == 0) {
  227. plantIds.add("1");
  228. }
  229. String plants = String.join(",", plantIds);
  230. // 1. 获取当前年份
  231. int currentYear = Year.now().getValue();
  232. // 2. 创建包含当前年份及未来十年的年份列表
  233. List<Integer> targetYears = new ArrayList<>();
  234. for (int i = 0; i <= 10; i++) {
  235. targetYears.add(currentYear + i);
  236. }
  237. // 3. 存储查询结果(年份 -> 过期数据)
  238. Map<Integer, List<String>> expiredDataByYear = new HashMap<>();
  239. List<Integer> resData = new ArrayList<>();
  240. // 4. 遍历每个年份并查询数据
  241. for (int year : targetYears) {
  242. TMeasureThickness t = new TMeasureThickness();
  243. int estRemainMin =year - currentYear;
  244. TMeasureThickness paramT = new TMeasureThickness();
  245. paramT.setPlants(plants);
  246. paramT.setIsPipe("0");
  247. List<TMeasureThickness> allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  248. allList = this.distinctByPlantAndTag(allList,estRemainMin,estRemainMin + 1);
  249. int gd = allList.size();
  250. // int gd = tMeasureThicknessService.count(new QueryWrapper<TMeasureThickness>()
  251. // .in("plant_code", plantIds)
  252. // .eq("dev_type" , "设备")
  253. // .eq("del_flag", 0)
  254. // .between("EST_REMAIN", estRemainMin, estRemainMin + 1)
  255. // );
  256. resData.add(gd);
  257. }
  258. Map<String, Object> res = new HashMap<String, Object>();
  259. res.put("targetYears" ,targetYears) ;
  260. res.put("resData" ,resData) ;
  261. return AjaxResult.success(res);
  262. }
  263. /**
  264. * 管道预估寿命数据
  265. */
  266. @RequestMapping(value = "gdDataPie")
  267. public AjaxResult gdDataPie(@RequestBody Map<String, Object> params) {
  268. List plantIds = (List) params.get("plantIds");
  269. if (plantIds == null) {
  270. plantIds = new ArrayList();
  271. }
  272. if (plantIds.size() == 0) {
  273. plantIds.add("1");
  274. }
  275. String plants = String.join(",", plantIds);
  276. // 3. 存储查询结果(年份 -> 过期数据)
  277. List<Integer> resData = new ArrayList<>();
  278. // 4. 遍历每个年份并查询数据
  279. TMeasureThickness paramT = new TMeasureThickness();
  280. paramT.setPlants(plants);
  281. paramT.setIsPipe("1");
  282. List<TMeasureThickness> allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  283. allList = this.distinctByPlantAndTag(allList,0,3);
  284. resData.add(this.distinctByPlantAndTag(allList,0,3).size());
  285. resData.add(this.distinctByPlantAndTag(allList,3,6).size());
  286. resData.add(this.distinctByPlantAndTag(allList,6,10).size());
  287. resData.add(this.distinctByPlantAndTag(allList,10,999).size());
  288. Map<String, Object> res = new HashMap<String, Object>();
  289. res.put("resData" ,resData) ;
  290. return AjaxResult.success(res);
  291. }
  292. /**
  293. * 管道预估寿命数据
  294. */
  295. @RequestMapping(value = "sbDataPie")
  296. public AjaxResult sbDataPie(@RequestBody Map<String, Object> params) {
  297. List plantIds = (List) params.get("plantIds");
  298. if (plantIds == null) {
  299. plantIds = new ArrayList();
  300. }
  301. if (plantIds.size() == 0) {
  302. plantIds.add("1");
  303. }
  304. String plants = String.join(",", plantIds);
  305. // 3. 存储查询结果(年份 -> 过期数据)
  306. List<Integer> resData = new ArrayList<>();
  307. // 4. 遍历每个年份并查询数据
  308. TMeasureThickness paramT = new TMeasureThickness();
  309. paramT.setPlants(plants);
  310. paramT.setIsPipe("0");
  311. List<TMeasureThickness> allList = tMeasureThicknessMapper.selectTMeasureThicknessList(paramT);
  312. allList = this.distinctByPlantAndTag(allList,0,3);
  313. resData.add(this.distinctByPlantAndTag(allList,0,3).size());
  314. resData.add(this.distinctByPlantAndTag(allList,3,6).size());
  315. resData.add(this.distinctByPlantAndTag(allList,6,10).size());
  316. resData.add(this.distinctByPlantAndTag(allList,10,999).size());
  317. Map<String, Object> res = new HashMap<String, Object>();
  318. res.put("resData" ,resData);
  319. return AjaxResult.success(res);
  320. }
  321. }