Browse Source

初始化一套

master
wangwei_123 4 weeks ago
parent
commit
b8cba4f82a
  1. 6
      .idea/misc.xml
  2. 59
      cc-admin-api/dust/pom.xml
  3. 174
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustAlarmController.java
  4. 251
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustController.java
  5. 311
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustDataTagController.java
  6. 242
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustMonitorController.java
  7. 328
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustMonitorItemController.java
  8. 162
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustMonitorValveController.java
  9. 182
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustSystemController.java
  10. 341
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustValveController.java
  11. 304
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/PipeController.java
  12. 161
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/PipeDiameterThicknessController.java
  13. 156
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/RecommendPlanController.java
  14. 162
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/WindSpeedColorController.java
  15. 84
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DesignPlan.java
  16. 75
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustAlarm.java
  17. 76
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustDataTag.java
  18. 102
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustMonitorItem.java
  19. 99
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustMonitorValve.java
  20. 67
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustSystem.java
  21. 95
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustValve.java
  22. 190
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/Pipe.java
  23. 71
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/PipeDiameterThickness.java
  24. 93
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/RecommendPlan.java
  25. 67
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/RecommendPlanPipeConfig.java
  26. 75
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/WindSpeedColor.java
  27. 49
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/enums/FanStatusType.java
  28. 49
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/enums/ValveType.java
  29. 14
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DesignPlanMapper.java
  30. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustAlarmMapper.java
  31. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustDataTagMapper.java
  32. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustMonitorItemMapper.java
  33. 18
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustMonitorValveMapper.java
  34. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustSystemMapper.java
  35. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustValveMapper.java
  36. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/PipeDiameterThicknessMapper.java
  37. 21
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/PipeMapper.java
  38. 21
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/RecommendPlanMapper.java
  39. 18
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/WindSpeedColorMapper.java
  40. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DesignPlanMapper.xml
  41. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustAlarmMapper.xml
  42. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustDataTagMapper.xml
  43. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustMonitorItemMapper.xml
  44. 11
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustMonitorValveMapper.xml
  45. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustSystemMapper.xml
  46. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustValveMapper.xml
  47. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/PipeDiameterThicknessMapper.xml
  48. 7
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/PipeMapper.xml
  49. 10
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/RecommendPlanMapper.xml
  50. 5
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/WindSpeedColorMapper.xml
  51. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/po/DustQuery.java
  52. 16
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDesignPlanService.java
  53. 14
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustAlarmService.java
  54. 14
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustDataTagService.java
  55. 14
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustMonitorItemService.java
  56. 18
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustMonitorValveService.java
  57. 14
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustSystemService.java
  58. 14
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustValveService.java
  59. 17
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IPipeDiameterThicknessService.java
  60. 27
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IPipeService.java
  61. 20
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IRecommendPlanService.java
  62. 15
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IWindSpeedColorService.java
  63. 114
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DesignPlanServiceImpl.java
  64. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustAlarmServiceImpl.java
  65. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustDataTagServiceImpl.java
  66. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustMonitorItemServiceImpl.java
  67. 29
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustMonitorValveServiceImpl.java
  68. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustSystemServiceImpl.java
  69. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustValveServiceImpl.java
  70. 25
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/PipeDiameterThicknessServiceImpl.java
  71. 166
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/PipeServiceImpl.java
  72. 36
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/RecommendPlanServiceImpl.java
  73. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/WindSpeedColorServiceImpl.java
  74. 23
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/BeanCopyUtil.java
  75. 131
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/ExcelUtil.java
  76. 7
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/KeyUtils.java
  77. 162
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/RecommendPlanUtils.java
  78. 19
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/CombinationResult.java
  79. 20
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DataTagExcel.java
  80. 31
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DataTagPair.java
  81. 28
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DataValveExcel.java
  82. 38
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustConfigVo.java
  83. 13
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustData.java
  84. 20
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustDesignPianExcelVo.java
  85. 33
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustMonitorItemExcel.java
  86. 42
      cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustMonitorItemVo.java
  87. 15
      scripts/mxserver/ini.js
  88. 55
      scripts/mxserver/logs/log.js
  89. 28
      scripts/mxserver/node_modules/.bin/acorn.ps1
  90. 12
      scripts/mxserver/node_modules/.bin/babylon
  91. 12
      scripts/mxserver/node_modules/.bin/ejs
  92. 28
      scripts/mxserver/node_modules/.bin/jake.ps1
  93. 12
      scripts/mxserver/node_modules/.bin/js-yaml
  94. 17
      scripts/mxserver/node_modules/.bin/node-which.cmd
  95. 17
      scripts/mxserver/node_modules/.bin/rimraf.cmd
  96. 28
      scripts/mxserver/node_modules/.bin/rimraf.ps1
  97. 12
      scripts/mxserver/node_modules/.bin/sshpk-conv
  98. 12
      scripts/mxserver/node_modules/.bin/sshpk-verify
  99. 12
      scripts/mxserver/node_modules/.bin/tsc
  100. 12
      scripts/mxserver/node_modules/.bin/tsserver

6
.idea/misc.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

59
cc-admin-api/dust/pom.xml

@ -0,0 +1,59 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>cc.admin</groupId>
<artifactId>cc-admin-api</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>dust</artifactId>
<dependencies>
<dependency>
<groupId>cc.admin</groupId>
<artifactId>base-common</artifactId>
<version>1.0.0</version>
</dependency>
<!-- OpenCSV for CSV parsing -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.5.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
<!-- Jackson Core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.3</version>
</dependency>
<!-- Jackson Annotations -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>cc.admin</groupId>
<artifactId>influxdb</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>cc.admin</groupId>
<artifactId>influxdb</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
</project>

174
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustAlarmController.java

@ -0,0 +1,174 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.DustAlarm;
import cc.admin.modules.dust.service.IDustAlarmService;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
* @Description: 警报记录表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "警报记录表")
@RestController
@RequestMapping("/dust/alarm")
public class DustAlarmController extends BaseController<DustAlarm, IDustAlarmService> {
@Autowired
private IDustAlarmService dustAlarmService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "警报记录表-分页列表查询")
@ApiOperation(value = "警报记录表-分页列表查询", notes = "警报记录表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "systemId", required = false) String systemId,
@RequestParam(name = "startTime", required = false) String startTime,
@RequestParam(name = "endTime", required = false) String endTime,
@RequestParam(name = "alarmContent", required = false) String alarmContent,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DustAlarm> queryWrapper = new QueryWrapper<>();
if (null != alarmContent) {
queryWrapper.like("alarm_content", alarmContent); // type 保持精确匹配
}
if (StrUtil.isNotEmpty(systemId)) {
queryWrapper.eq("system_id", systemId); // systemId 保持精确匹配
}
if (startTime != null) {
queryWrapper.ge("create_time", startTime);
}
if (endTime != null) {
queryWrapper.le("create_time", endTime);
}
queryWrapper.orderByAsc("sort_order")
.orderByDesc("create_time");
Page<DustAlarm> page = new Page<DustAlarm>(pageNo, pageSize);
IPage<DustAlarm> pageList = dustAlarmService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param dustAlarm
* @return
*/
@AutoLog(value = "警报记录表-添加")
@ApiOperation(value = "警报记录表-添加", notes = "警报记录表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody DustAlarm dustAlarm) {
dustAlarmService.save(dustAlarm);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param dustAlarm
* @return
*/
@AutoLog(value = "警报记录表-编辑")
@ApiOperation(value = "警报记录表-编辑", notes = "警报记录表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody DustAlarm dustAlarm) {
dustAlarmService.updateById(dustAlarm);
return Result.ok("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "警报记录表-通过id删除")
@ApiOperation(value = "警报记录表-通过id删除", notes = "警报记录表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
dustAlarmService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "警报记录表-批量删除")
@ApiOperation(value = "警报记录表-批量删除", notes = "警报记录表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.dustAlarmService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "警报记录表-通过id查询")
@ApiOperation(value = "警报记录表-通过id查询", notes = "警报记录表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
DustAlarm dustAlarm = dustAlarmService.getById(id);
return Result.ok(dustAlarm);
}
/**
* 导出excel
*
* @param request
* @param dustAlarm
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, DustAlarm dustAlarm) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, dustAlarm, DustAlarm.class, "警报记录表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, DustAlarm.class);
}
}

251
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustController.java

@ -0,0 +1,251 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.util.RedisUtil;
import cc.admin.modules.dust.entity.*;
import cc.admin.modules.dust.po.DustQuery;
import cc.admin.modules.dust.service.*;
import cc.admin.modules.dust.utils.RecommendPlanUtils;
import cc.admin.modules.dust.vo.CombinationResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import oshi.util.StringUtil;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@Slf4j
@Api(tags = "计算表")
@RestController
@RequestMapping("/dust/config")
public class DustController {
@Autowired
private IPipeDiameterThicknessService iPipeDiameterThicknessService;
@Autowired
private IPipeService pipeService;
@Autowired
private RedisUtil redisUtil;
@Resource
private IRecommendPlanService iRecommendPlanService;
/**
* 初步计算
*
* @param airVolume 风量单位根据实际情况设定
* @param airSpeed 风速单位根据实际情况设定
* @return 计算得到的 管径值
* @throws IllegalArgumentException 如果 airVolume airSpeed 非正
*/
public static double calculate(double airVolume, double airSpeed) {
// 检查输入是否为有效的正数
if (airVolume <= 0 || airSpeed <= 0) {
throw new IllegalArgumentException("风量和风速必须是正数。");
}
// 计算 d 的值
return 2000 * Math.sqrt(airVolume / airSpeed / 3600 / Math.PI);
}
/**
* 初步计算
*
* @param airVolume 风量单位根据实际情况设定
* @param diameter 管道内径单位根据实际情况设定
* @return 计算得到的 风速
* @throws IllegalArgumentException 如果 airVolume airSpeed 非正
*/
public static double calculateAirSpeed(double airVolume, double diameter) {
double radiusMeters = diameter / 2000.0; // 2000 = 2 * 1000 (to get radius in meters)
double area = Math.PI * Math.pow(radiusMeters, 2);
return airVolume / (area * 3600.0);
}
@AutoLog(value = "初步计算")
@ApiOperation(value = "初步计算", notes = "初步计算")
@GetMapping(value = "/designPipe")
public Result<?> designPipe(@RequestParam(name = "designPlanId", required = true) String designPlanId,
@RequestParam(name = "pipeDiameterId", required = true) String pipeDiameterId) {
// 创建 QueryWrapper 以获取所有匹配的 DesignPlanPipeConfig
QueryWrapper<Pipe> configQueryWrapper = new QueryWrapper<>();
configQueryWrapper.eq("design_plan_id", designPlanId);
List<Pipe> configList = pipeService.list(configQueryWrapper);
if (CollectionUtils.isEmpty(configList)) {
return Result.ok(null);
}
List<Pipe> design = design(designPlanId, pipeDiameterId, configList);
return Result.ok(design);
}
private List<Pipe> design(String designPlanId, String pipeDiameterId, List<Pipe> configList) {
Map<String, List<Pipe>> pipesGroupedByParentId = configList.stream()
.filter(a -> StringUtils.isNotBlank(a.getParentId()) && a.getIsLeaf().equals(1)).collect(Collectors.groupingBy(Pipe::getParentId));
List<Pipe> pipesToUpdate = new ArrayList<>();
PipeDiameterThickness byId = iPipeDiameterThicknessService.getById(pipeDiameterId);
List<Double> collect = Arrays.stream(byId.getDiameter().split(","))
.map(str -> str.replaceAll("[\\u00A0\\s]+", "").trim()) // 去除所有空白字符,包括非断行空格
.filter(str -> !str.isEmpty()) // 过滤空字符串
.map(Double::parseDouble)
.collect(Collectors.toList());
for (Map.Entry<String, List<Pipe>> entry : pipesGroupedByParentId.entrySet()) {
List<Pipe> parentPipes = entry.getValue();
parentPipes.sort(Comparator.comparingInt(Pipe::getSortOrder));
// 计算累积值
double cumulativeSum = 0.0;
for (Pipe pipe : parentPipes) {
double valveOpening = pipe.getValveOpening();
double v = valveOpening / 100.0;
double adjustedFlow = pipe.getFlow() * v;
cumulativeSum += adjustedFlow;
double calculate = calculate(cumulativeSum, 19d);
double ceil = collect.stream()
.filter(num -> num >= calculate) // 过滤出不小于 calculate 的数
.min(Double::compareTo)
.orElseGet(() -> collect.stream()
.max(Double::compareTo)
.orElse(Double.NaN));
// 更新当前 Pipe 对象
if (null != pipe.getDiameter()) {
pipe.setComputeDiameter(pipe.getDiameter());
}
pipe.setDiameter(ceil);
pipe.setPipeDiameter(calculate);
pipe.setPipeFlow(cumulativeSum);
pipe.setValveOpening(valveOpening);
pipesToUpdate.add(pipe);
}
}
redisUtil.set(designPlanId, pipesToUpdate);
return pipesToUpdate;
}
@AutoLog(value = "平衡计算")
@ApiOperation(value = "平衡计算", notes = "平衡计算")
@PostMapping(value = "/balance")
public Result<?> balance(@RequestBody DustQuery query) {
Object object = redisUtil.get(query.getDesignPlanId());
if (ObjectUtils.isEmpty(object)) {
return Result.error("设计方案管道配置不能为空");
}
Map<String, Double> pipeIdToValveOpeningMap = query.getList().stream()
.collect(Collectors.toMap(
Pipe::getId,
Pipe::getValveOpening,
(existing, replacement) -> existing));
Set<String> pipeIdsSet = pipeIdToValveOpeningMap.keySet();
List<Pipe> pipes = convertToList(object);
List<Pipe> filteredPipes = pipes.stream()
.filter(pipe -> pipeIdsSet.contains(pipe.getId())) // 假设 Pipe 类有 getId() 方法
.collect(Collectors.toList());
Map<String, List<Pipe>> pipesGroupedByParentId = filteredPipes.stream()
.filter(a -> StringUtils.isNotBlank(a.getParentId()) && a.getIsLeaf().equals(1)).collect(Collectors.groupingBy(Pipe::getParentId));
for (Map.Entry<String, List<Pipe>> entry : pipesGroupedByParentId.entrySet()) {
List<Pipe> parentPipes = entry.getValue();
parentPipes.sort(Comparator.comparingInt(Pipe::getSortOrder));
// 计算累积值
double cumulativeSum = 0.0;
double diameter;
for (Pipe pipe : parentPipes) {
double valveOpening = pipeIdToValveOpeningMap.getOrDefault(pipe.getId(), 100.0);
double v = valveOpening / 100.0;
double adjustedFlow = pipe.getFlow() * v;
cumulativeSum += adjustedFlow;
diameter = pipe.getDiameter();
if (null != pipe.getComputeDiameter()) {
diameter = pipe.getComputeDiameter();
}
double windSpeed = calculateAirSpeed(cumulativeSum, diameter);
log.info("风量{},开度: {},管道内径{}", cumulativeSum, v, diameter);
pipe.setWindSpeed(windSpeed);
pipe.setPipeFlow(cumulativeSum);
pipe.setValveOpening(valveOpening);
}
}
return Result.ok(pipes);
}
public List<Pipe> convertToList(Object object) {
if (!(object instanceof Collection<?>)) {
throw new IllegalArgumentException("Object is not a Collection");
}
Collection<?> collection = (Collection<?>) object;
List<Pipe> list = new ArrayList<>();
int index = 0;
for (Object item : collection) {
if (item == null) {
throw new NullPointerException("Collection contains null element at index " + index);
}
if (item instanceof Pipe) {
list.add((Pipe) item);
} else {
String foundType = item.getClass().getName();
throw new ClassCastException("Element at index " + index + " is not a DesignPlanPipeConfig. Found: " + foundType);
}
index++;
}
return list;
}
@AutoLog(value = "推荐方案")
@ApiOperation(value = "推荐方案", notes = "推荐方案")
@GetMapping(value = "/recommend")
public Result<?> recommend(@RequestParam(name = "designPlanId", required = true) String designPlanId,
@RequestParam(name = "parentPipeId", required = true) String parentPipeId,
@RequestParam(name = "pipeDiameterId", required = true) String pipeDiameterId,
@RequestParam(name = "minSpeed", required = true) Double minSpeed,
@RequestParam(name = "minRate", required = true) Double minRate) throws IOException {
QueryWrapper<Pipe> configQueryWrapper = new QueryWrapper<>();
configQueryWrapper.eq("design_plan_id", designPlanId);
configQueryWrapper.eq("parent_id", parentPipeId);
List<Pipe> configList = pipeService.list(configQueryWrapper);
if (CollectionUtils.isEmpty(configList)){
return Result.error("管道为空");
}
List<Pipe> data = design(designPlanId, pipeDiameterId, configList);
data.sort(Comparator.comparingInt(Pipe::getSortOrder));
Set<Integer> pipeIndexes = IntStream.range(0, data.size())
.filter(i -> data.get(i).getValveOpening() == 100) // 满足条件的 Pipe 的下标
.boxed() // 转换为 Integer 类型
.collect(Collectors.toSet());
List<RecommendPlan> recommendPlanList = RecommendPlanUtils.generateCombinations(data, minSpeed, minRate, pipeIndexes);
return Result.ok(recommendPlanList);
}
}

311
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustDataTagController.java

@ -0,0 +1,311 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.DustDataTag;
import cc.admin.modules.dust.entity.DustSystem;
import cc.admin.modules.dust.service.IDustDataTagService;
import cc.admin.modules.dust.service.IDustSystemService;
import cc.admin.modules.dust.vo.DataTagExcel;
import cc.admin.modules.dust.vo.DataTagPair;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.listener.ReadListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Description: 数据点位表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "数据点位表")
@RestController
@RequestMapping("/dust/dataTag")
public class DustDataTagController extends BaseController<DustDataTag, IDustDataTagService> {
@Autowired
private IDustDataTagService dustDataTagService;
@Autowired
private IDustSystemService iDustSystemService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "数据点位表-分页列表查询")
@ApiOperation(value = "数据点位表-分页列表查询", notes = "数据点位表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "systemId", required = false) String systemId,
@RequestParam(name = "name", required = false) String name,
@RequestParam(name = "dataTag", required = false) String dataTag,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DustDataTag> queryWrapper = new QueryWrapper<>();
if (StrUtil.isNotEmpty(systemId)) {
queryWrapper.eq("system_id", systemId);
}
if (StrUtil.isNotEmpty(name)) {
queryWrapper.eq("name", name);
}
if (StrUtil.isNotEmpty(dataTag)) {
queryWrapper.eq("data_tag", dataTag);
}
queryWrapper.orderByAsc("sort_order")
.orderByDesc("create_time");
Page<DustDataTag> page = new Page<DustDataTag>(pageNo, pageSize);
IPage<DustDataTag> pageList = dustDataTagService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param dustDataTag
* @return
*/
@AutoLog(value = "数据点位表-添加")
@ApiOperation(value = "数据点位表-添加", notes = "数据点位表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody DustDataTag dustDataTag) {
checkUniqueName(dustDataTag);
dustDataTagService.save(dustDataTag);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param dustDataTag
* @return
*/
@AutoLog(value = "数据点位表-编辑")
@ApiOperation(value = "数据点位表-编辑", notes = "数据点位表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody DustDataTag dustDataTag) {
checkUniqueName(dustDataTag);
dustDataTagService.updateById(dustDataTag);
return Result.ok("编辑成功!");
}
/**
* 复制
*
* @param id
* @param name
* @return
*/
@AutoLog(value = "数据点位表-复制")
@ApiOperation(value = "数据点位表-复制", notes = "数据点位表-复制")
@PostMapping(value = "/copy")
public Result<?> copy(@RequestParam(name = "id", required = true) String id, @RequestParam(name = "name", required = true) String name) {
DustDataTag dustDataTag = dustDataTagService.getById(id);
dustDataTag.setId(IdUtil.fastUUID());
dustDataTag.setName(name);
dustDataTagService.save(dustDataTag);
return Result.ok("复制成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "数据点位表-通过id删除")
@ApiOperation(value = "数据点位表-通过id删除", notes = "数据点位表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
dustDataTagService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "数据点位表-批量删除")
@ApiOperation(value = "数据点位表-批量删除", notes = "数据点位表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.dustDataTagService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "数据点位表-通过id查询")
@ApiOperation(value = "数据点位表-通过id查询", notes = "数据点位表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
DustDataTag dustDataTag = dustDataTagService.getById(id);
return Result.ok(dustDataTag);
}
/**
* 导出excel
*
* @param request
* @param dustDataTag
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, DustDataTag dustDataTag) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, dustDataTag, DustDataTag.class, "数据点位表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request,
HttpServletResponse response) {
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
if (fileMap.isEmpty()) {
return Result.error("请上传 Excel 文件");
}
MultipartFile file = fileMap.values().iterator().next();
if (file == null || file.isEmpty()) {
return Result.error("上传的文件为空");
}
List<DustDataTag> metaDataValues = new ArrayList<>();
List<String> errorList = new ArrayList<>();
HashSet<String> dataTagSet = new HashSet<>();
HashSet<String> nameSet = new HashSet<>();
List<DustSystem> systemList = iDustSystemService.list();
Map<String, DustSystem> systemMap = systemList.stream().collect(Collectors.toMap(DustSystem::getName, dustSystem -> dustSystem));
EasyExcelFactory.read(file.getInputStream(), DataTagExcel.class,
new AnalysisEventListener<DataTagExcel>() {
@Override
public void invoke(DataTagExcel rowData, AnalysisContext context) {
if (StringUtils.isEmpty(rowData.getDataTag()) || StringUtils.isEmpty(rowData.getName())) {
errorList.add(String.format("第 %d 行数据不完整:名称 或 数据点位 为空", context.readRowHolder().getRowIndex() + 1));
return;
}
if (StringUtils.isEmpty(rowData.getSystemName())) {
errorList.add(String.format("第 %d 行数据不完整:除尘系统为空", context.readRowHolder().getRowIndex() + 1));
return;
}
// 检查 dataTag 是否重复
String dataTag = rowData.getDataTag().trim();
if (!dataTagSet.add(dataTag)) {
// 如果 dataTag 已存在,记录错误
errorList.add(String.format("第 %d 行数据重复:数据点位 %s 已存在", context.readRowHolder().getRowIndex() + 1, dataTag));
return;
}
if (!nameSet.add(rowData.getName() + rowData.getSystemName())) {
// 如果 dataTag 已存在,记录错误
errorList.add(String.format("第 %d 行数据重复:该系统下除尘点位名称 %s 已存在", context.readRowHolder().getRowIndex() + 1, rowData.getName()));
return;
}
DustSystem dustSystem = systemMap.get(rowData.getSystemName().trim());
if (dustSystem == null) {
errorList.add(String.format("第 %d 行数据错误:所属系统 %s 不存在", context.readRowHolder().getRowIndex() + 1, rowData.getSystemName()));
return;
}
DustDataTag dustDataTag = new DustDataTag();
dustDataTag.setName(rowData.getName());
dustDataTag.setDataTag(rowData.getDataTag().trim());
dustDataTag.setSystemId(dustSystem.getId());
checkUniqueName(dustDataTag);
metaDataValues.add(dustDataTag);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("所有数据读取完成,共有 " + metaDataValues.size() + " 条数据");
}
})
.sheet()
.doRead();
if (!errorList.isEmpty()) {
return Result.error("导入失败,存在以下错误:\n" + String.join("\n", errorList));
}
QueryWrapper<DustDataTag> dataTagQueryWrapper = new QueryWrapper<>();
dataTagQueryWrapper.in("data_tag", dataTagSet);
List<DustDataTag> list = dustDataTagService.list(dataTagQueryWrapper);
Map<String, DustDataTag> collect = list.stream().collect(Collectors.toMap(DustDataTag::getDataTag, Function.identity()));
for (DustDataTag metaDataValue : metaDataValues) {
DustDataTag dustDataTag = collect.get(metaDataValue.getDataTag());
if (dustDataTag != null) {
metaDataValue.setId(dustDataTag.getId());
}
}
dustDataTagService.saveOrUpdateBatch(metaDataValues);
} catch (Exception e) {
e.printStackTrace();
return Result.error("导入失败:" + e.getMessage());
}
return Result.ok("导入成功");
}
public void checkUniqueName(DustDataTag origin) {
QueryWrapper<DustDataTag> coalQueryWrapper = new QueryWrapper<>();
coalQueryWrapper.eq("data_tag", origin.getDataTag());
DustDataTag existing = dustDataTagService.getOne(coalQueryWrapper);
if (existing != null) {
if (origin.getId() != null) {
// ID不同且名称已被占用才抛异常
if (!existing.getId().equals(origin.getId())) {
throw new IllegalArgumentException("数据点位 '" + origin.getDataTag() + "' 已存在");
}
// ID相同是更新自身,不抛异常,直接返回
return;
}
throw new IllegalArgumentException("数据点位 '" + origin.getDataTag() + "' 已存在");
}
}
}

242
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustMonitorController.java

@ -0,0 +1,242 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.util.RedisUtil;
import cc.admin.influxdb.core.InfluxdbTemplate;
import cc.admin.influxdb.dust.DustLog;
import cc.admin.modules.dust.entity.*;
import cc.admin.modules.dust.service.*;
import cc.admin.modules.dust.utils.KeyUtils;
import cc.admin.modules.dust.vo.DataTagPair;
import cc.admin.modules.dust.vo.DustMonitorItemVo;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description: 综合监控
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "综合监控")
@RestController
@RequestMapping("/dust/monitor")
public class DustMonitorController {
@Autowired
private IDustDataTagService iDustDataTagService;
@Autowired
private IDustValveService dustValveService;
@Autowired
private IDustMonitorItemService dustMonitorItemService;
@Autowired
private IDustMonitorValveService dustMonitorValveService;
@Autowired
private InfluxdbTemplate influxdbTemplate;
@Autowired
private RedisUtil redisUtil;
@AutoLog(value = "大屏监控-监控看板")
@ApiOperation(value = "大屏监控-监控看板", notes = "大屏监控项表-监控看板")
@GetMapping(value = "/boardList")
public Result<?> boardList(HttpServletRequest req) {
ArrayList<DustMonitorItemVo> monitorItemList = new ArrayList<>();
Map<Object, Object> hmget = redisUtil.hmget(KeyUtils.dustdataTag);
if (ObjectUtils.isEmpty(hmget)) {
return Result.ok(monitorItemList);
}
List<DustMonitorItem> list = dustMonitorItemService.list();
Map<String, DustMonitorItem> collect = list.stream().collect(Collectors.toMap(
DustMonitorItem::getSystemId, // Key mapper
item -> item, // Value mapper
(existing, replacement) -> existing // Merge function (keep the first item if duplicate keys)
));
for (String systemId : collect.keySet()) {
DustMonitorItem dustMonitorItem = collect.get(systemId);
DustMonitorItemVo vo = new DustMonitorItemVo();
BeanUtil.copyProperties(dustMonitorItem, vo);
Double inletPressure = hmget.get(dustMonitorItem.getInletPressureDataTagId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getInletPressureDataTagId()).toString()) : null;
Double outletPressure = hmget.get(dustMonitorItem.getOutletPressureDataTagId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getOutletPressureDataTagId()).toString()) : null;
Double pressureDifference = hmget.get(dustMonitorItem.getPressureDifferenceId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getPressureDifferenceId()).toString()) : null;
Double fanSpeed = hmget.get(dustMonitorItem.getFanSpeedDataTagId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getFanSpeedDataTagId()).toString()) : null;
Double motorCurrent = hmget.get(dustMonitorItem.getMotorCurrentDataTagId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getMotorCurrentDataTagId()).toString()) : null;
Double cemsAirVolume = hmget.get(dustMonitorItem.getCemsAirVolumeDataTagId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getCemsAirVolumeDataTagId()).toString()) : null;
Double dustConcentration = hmget.get(dustMonitorItem.getDustConcentrationDataTagId()) != null
? Double.valueOf(hmget.get(dustMonitorItem.getDustConcentrationDataTagId()).toString()) : null;
Integer fanStatus = toInteger(hmget.get(dustMonitorItem.getFanStatusDataTagId()));
vo.setInletPressureDataTagValue(inletPressure);
vo.setOutletPressureDataTagValue(outletPressure);
vo.setPressureDifference(pressureDifference);
vo.setFanSpeedDataTagValue(fanSpeed);
vo.setMotorCurrentDataTagValue(motorCurrent);
vo.setCemsAirVolumeDataTagValue(cemsAirVolume);
vo.setDustConcentrationDataTagValue(dustConcentration);
vo.setFanStatusDataTagStatus(fanStatus);
monitorItemList.add(vo);
}
return Result.ok(monitorItemList);
}
private Integer toInteger(Object value) {
if (value == null) return null;
try {
return Integer.valueOf(value.toString());
} catch (NumberFormatException e) {
return null; // 或返回默认值,比如 0
}
}
@AutoLog(value = "大屏监控-阀门点位")
@ApiOperation(value = "大屏监控-阀门点位", notes = "大屏监控项表-阀门点位")
@GetMapping(value = "/boardValve")
public Result<?> boardValve(HttpServletRequest req) {
Map<Object, Object> hmget = redisUtil.hmget(KeyUtils.dustdataTag);
List<DustMonitorValve> list = dustMonitorValveService.valveList();
Map<String, DustMonitorValve> collect = list.stream().collect(Collectors.toMap(
DustMonitorValve::getValveId, // Key mapper
item -> item, // Value mapper
(existing, replacement) -> existing // Merge function (keep the first item if duplicate keys)
));
ArrayList<DustMonitorValve> objects = new ArrayList<>();
for (String key : collect.keySet()) {
DustMonitorValve dustMonitorValve = collect.get(key);
Integer status = toInteger(hmget.get(dustMonitorValve.getDataTagId()));
dustMonitorValve.setStatus(status);
objects.add(dustMonitorValve);
}
return Result.ok(objects);
}
@AutoLog(value = "大屏监控-阀门状态")
@ApiOperation(value = "大屏监控表-阀门状态", notes = "大屏监控项表-阀门状态")
@GetMapping(value = "/valveStatusList")
public Result<?> valveStatusList(HttpServletRequest req,
@RequestParam(name = "systemId", required = true) String systemId) {
QueryWrapper<DustValve> valveQueryWrapper = new QueryWrapper<>();
valveQueryWrapper.eq("system_id", systemId);
List<DustValve> list = dustValveService.list(valveQueryWrapper);
if (ObjectUtils.isEmpty(list)) {
return Result.ok(new ArrayList<>());
}
Map<Object, Object> hmget = redisUtil.hmget(KeyUtils.dustdataTag);
for (DustValve dustValve : list) {
Integer status = toInteger(hmget.get(dustValve.getDataTagId()));
dustValve.setStatus(status);
}
return Result.ok(list);
}
@AutoLog(value = "历史记录")
@ApiOperation(value = "历史记录", notes = "历史记录")
@GetMapping(value = "/historyList")
public Result<?> historyList(HttpServletRequest req,
@RequestParam(name = "systemId", required = true) String systemId,
@RequestParam(name = "startTime", required = true) String startTime,
@RequestParam(name = "endTime", required = true) String endTime) {
QueryWrapper<DustMonitorItem> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.eq("system_id", systemId);
DustMonitorItem one = dustMonitorItemService.getOne(objectQueryWrapper);
if (ObjectUtils.isEmpty(one)) {
return Result.ok(new ArrayList<>());
}
// 从 one 中提取 dataTag 列表
List<DataTagPair> dataTag = new ArrayList<>();
dataTag.add(new DataTagPair(one.getInletPressureDataTagId(), "除尘器进气压力(pa)"));
dataTag.add(new DataTagPair(one.getOutletPressureDataTagId(), "除尘器出气压力(pa)"));
dataTag.add(new DataTagPair(one.getFanSpeedDataTagId(), "风机转速(r/min)"));
dataTag.add(new DataTagPair(one.getMotorCurrentDataTagId(), "电机电流(A)"));
dataTag.add(new DataTagPair(one.getDustConcentrationDataTagId(), "粉尘浓度(mg/m³)"));
dataTag.add(new DataTagPair(one.getCemsAirVolumeDataTagId(), "烟尘CEMS风量(m³/h)"));
dataTag.add(new DataTagPair(one.getPressureDifferenceId(), "除尘器进出口压差(pa)"));
QueryWrapper<DustDataTag> dataTagQueryWrapper = new QueryWrapper<>();
dataTagQueryWrapper.in("id", dataTag.stream().map(DataTagPair::getTagId).collect(Collectors.toList()));
List<DustDataTag> list = iDustDataTagService.list(dataTagQueryWrapper);
HashMap<String, List<DustLog>> resultMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(list)) {
// 时间格式化和转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime startTimeDateTime = LocalDateTime.parse(startTime, formatter);
LocalDateTime endTimeDateTime = LocalDateTime.parse(endTime, formatter);
long startTimeEpochSeconds = startTimeDateTime.toEpochSecond(ZoneOffset.UTC);
long endTimeEpochSeconds = endTimeDateTime.toEpochSecond(ZoneOffset.UTC);
Map<String, DustDataTag> tagIdToDustDataTag = list.stream()
.collect(Collectors.toMap(
DustDataTag::getId,
dustDataTag -> dustDataTag,
(existing, replacement) -> existing
));
for (DataTagPair dataTagPair : dataTag) {
String tagId = dataTagPair.getTagId();
String description = dataTagPair.getDescription();
DustDataTag dustDataTag = tagIdToDustDataTag.get(tagId);
if (dustDataTag != null) {
String sqlStr = String.format(
"SELECT first(value) as value " + // 这里添加了空格
"FROM dust_log " +
"WHERE time >= %ds AND time <= %ds " +
"AND dataTag = '%s' " +
"GROUP BY time(1m)",
startTimeEpochSeconds, endTimeEpochSeconds, dustDataTag.getId()
);
String format = String.format(sqlStr, startTimeEpochSeconds, endTimeEpochSeconds);
List<DustLog> mqttLogs = influxdbTemplate.selectList(
format,
DustLog.class);
mqttLogs = mqttLogs.stream()
.filter(log -> log.getValue() != null)
.collect(Collectors.toList());
resultMap.put(description, mqttLogs);
} else {
resultMap.put(description, new ArrayList<>());
}
}
}
return Result.ok(resultMap);
}
}

328
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustMonitorItemController.java

@ -0,0 +1,328 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.DustDataTag;
import cc.admin.modules.dust.entity.DustMonitorItem;
import cc.admin.modules.dust.entity.DustSystem;
import cc.admin.modules.dust.entity.DustValve;
import cc.admin.modules.dust.enums.ValveType;
import cc.admin.modules.dust.service.IDustDataTagService;
import cc.admin.modules.dust.service.IDustMonitorItemService;
import cc.admin.modules.dust.service.IDustSystemService;
import cc.admin.modules.dust.vo.DataValveExcel;
import cc.admin.modules.dust.vo.DustMonitorItemExcel;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Description: 大屏监控项表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "大屏监控项表")
@RestController
@RequestMapping("/dust/monitorItem")
public class DustMonitorItemController extends BaseController<DustMonitorItem, IDustMonitorItemService> {
@Autowired
private IDustMonitorItemService dustMonitorItemService;
@Autowired
private IDustSystemService dustSystemService;
@Autowired
private IDustDataTagService dustDataTagService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "大屏监控项表-分页列表查询")
@ApiOperation(value = "大屏监控项表-分页列表查询", notes = "大屏监控项表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "key", required = false) String key,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DustMonitorItem> queryWrapper = QueryGenerator.initQueryWrapper(new DustMonitorItem(), req.getParameterMap());
if (StrUtil.isNotEmpty(key)) {
}
queryWrapper.orderByAsc("sort_order")
.orderByDesc("create_time");
Page<DustMonitorItem> page = new Page<DustMonitorItem>(pageNo, pageSize);
IPage<DustMonitorItem> pageList = dustMonitorItemService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param dustMonitorItem
* @return
*/
@AutoLog(value = "大屏监控项表-添加")
@ApiOperation(value = "大屏监控项表-添加", notes = "大屏监控项表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody DustMonitorItem dustMonitorItem) {
checkUniqueName(dustMonitorItem);
dustMonitorItemService.save(dustMonitorItem);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param dustMonitorItem
* @return
*/
@AutoLog(value = "大屏监控项表-编辑")
@ApiOperation(value = "大屏监控项表-编辑", notes = "大屏监控项表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody DustMonitorItem dustMonitorItem) {
checkUniqueName(dustMonitorItem);
dustMonitorItemService.updateById(dustMonitorItem);
return Result.ok("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "大屏监控项表-通过id删除")
@ApiOperation(value = "大屏监控项表-通过id删除", notes = "大屏监控项表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
dustMonitorItemService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "大屏监控项表-批量删除")
@ApiOperation(value = "大屏监控项表-批量删除", notes = "大屏监控项表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.dustMonitorItemService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "大屏监控项表-通过id查询")
@ApiOperation(value = "大屏监控项表-通过id查询", notes = "大屏监控项表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
DustMonitorItem dustMonitorItem = dustMonitorItemService.getById(id);
return Result.ok(dustMonitorItem);
}
/**
* 导出excel
*
* @param request
* @param dustMonitorItem
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, DustMonitorItem dustMonitorItem) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, dustMonitorItem, DustMonitorItem.class, "大屏监控项表");
}
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request,
HttpServletResponse response) {
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
if (fileMap.isEmpty()) {
return Result.error("请上传 Excel 文件");
}
MultipartFile file = fileMap.values().iterator().next();
if (file == null || file.isEmpty()) {
return Result.error("上传的文件为空");
}
List<DustMonitorItemExcel> metaDataValues = new ArrayList<>();
List<String> errorList = new ArrayList<>();
HashSet<String> idSet = new HashSet<>();
HashSet<String> NameSet = new HashSet<>();
EasyExcelFactory.read(file.getInputStream(), DustMonitorItemExcel.class,
new AnalysisEventListener<DustMonitorItemExcel>() {
@Override
public void invoke(DustMonitorItemExcel rowData, AnalysisContext context) {
int rowIndex = context.readRowHolder().getRowIndex() + 1;
// 将所有 dataTag 添加到 idSet 并检查重复
String[] dataTags = {
rowData.getCemsAirVolumeDataTagName()+rowData.getSystemName(),
rowData.getOutletPressureDataTagName()+rowData.getSystemName(),
rowData.getInletPressureDataTagName()+rowData.getSystemName(),
rowData.getDustConcentrationDataTagName()+rowData.getSystemName(),
rowData.getFanStatusDataTagStatusName()+rowData.getSystemName(),
rowData.getFanSpeedDataTagName()+rowData.getSystemName(),
rowData.getMotorCurrentDataTagName()+rowData.getSystemName()
};
NameSet.add(rowData.getCemsAirVolumeDataTagName());
NameSet.add(rowData.getOutletPressureDataTagName());
NameSet.add(rowData.getInletPressureDataTagName());
NameSet.add(rowData.getDustConcentrationDataTagName());
NameSet.add(rowData.getFanStatusDataTagStatusName());
NameSet.add(rowData.getFanSpeedDataTagName());
NameSet.add(rowData.getMotorCurrentDataTagName());
// 检查 dataTag 是否重复
for (String dataTag : dataTags) {
if (StringUtils.isNotEmpty(dataTag)) { // 跳过空值
if (!idSet.add(dataTag)) { // 如果添加失败,说明已存在
errorList.add(String.format("第 %d 行数据重复:数据点位 %s 已存在", rowIndex, dataTag));
return; // 发现重复后直接返回(根据你的代码逻辑)
}
}
}
metaDataValues.add(rowData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("所有数据读取完成,共有 " + metaDataValues.size() + " 条数据");
}
})
.sheet()
.doRead();
if (!errorList.isEmpty()) {
return Result.error("导入失败,存在以下错误:\n" + String.join("\n", errorList));
}
List<DustSystem> systemList = dustSystemService.list();
Map<String, DustSystem> systemMap = systemList.stream().collect(Collectors.toMap(DustSystem::getName, dustSystem -> dustSystem));
QueryWrapper<DustDataTag> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.eq("name",idSet);
List<DustDataTag> dataTagList = dustDataTagService.list(objectQueryWrapper);
Map<String, DustDataTag> tagMap = dataTagList.stream().collect(Collectors.toMap(
dustDataTag -> dustDataTag.getDataTag() + dustDataTag.getSystemId(),
Function.identity()));
ArrayList<DustMonitorItem> objects = new ArrayList<>();
List<DustMonitorItem> list = dustMonitorItemService.list();
Map<String, DustMonitorItem> collect = list.stream().collect(Collectors.toMap(DustMonitorItem::getSystemId, Function.identity()));
for (DustMonitorItemExcel metaDataValue : metaDataValues) {
DustMonitorItem dustMonitorItem = new DustMonitorItem();
DustSystem dustSystem = systemMap.get(metaDataValue.getSystemName().trim());
if (null != dustSystem){
dustMonitorItem.setSystemId(dustSystem.getId());
}
DustDataTag dustDataTag = tagMap.get(metaDataValue.getInletPressureDataTagName().trim()+ dustMonitorItem.getSystemId());
if (dustDataTag != null){
dustMonitorItem.setInletPressureDataTagId(dustDataTag.getId());
}
DustDataTag dustDataTag1 = tagMap.get(metaDataValue.getOutletPressureDataTagName().trim() + dustMonitorItem.getSystemId());
if (dustDataTag1 != null){
dustMonitorItem.setOutletPressureDataTagId(dustDataTag1.getId());
}
DustDataTag dustDataTag2 = tagMap.get(metaDataValue.getDustConcentrationDataTagName().trim() + dustMonitorItem.getSystemId());
if (dustDataTag2 != null){
dustMonitorItem.setDustConcentrationDataTagId(dustDataTag2.getId());
}
DustDataTag dustDataTag3 = tagMap.get(metaDataValue.getCemsAirVolumeDataTagName().trim() + dustMonitorItem.getSystemId());
if (dustDataTag3 != null){
dustMonitorItem.setCemsAirVolumeDataTagId(dustDataTag3.getId());
}
DustDataTag dustDataTag4 = tagMap.get(metaDataValue.getMotorCurrentDataTagName().trim() + dustMonitorItem.getSystemId());
if (dustDataTag4 != null){
dustMonitorItem.setMotorCurrentDataTagId(dustDataTag4.getId());
}
DustDataTag dustDataTag5 = tagMap.get(metaDataValue.getFanStatusDataTagStatusName().trim() + dustMonitorItem.getSystemId());
if (dustDataTag5 != null){
dustMonitorItem.setFanStatusDataTagId(dustDataTag5.getId());
}
DustDataTag dustDataTag6 = tagMap.get(metaDataValue.getFanSpeedDataTagName().trim() + dustMonitorItem.getSystemId());
if (dustDataTag6 != null){
dustMonitorItem.setFanSpeedDataTagId(dustDataTag6.getId());
}
DustMonitorItem dustMonitorItem1 = collect.get(dustMonitorItem.getSystemId());
if (null != dustMonitorItem1){
dustMonitorItem.setId(dustMonitorItem1.getId());
}
objects.add(dustMonitorItem);
}
dustMonitorItemService.saveOrUpdateBatch(objects);
} catch (Exception e) {
e.printStackTrace();
return Result.error("导入失败:" + e.getMessage());
}
return Result.ok("导入成功");
}
public void checkUniqueName(DustMonitorItem item) {
QueryWrapper<DustMonitorItem> coalQueryWrapper = new QueryWrapper<>();
coalQueryWrapper.eq("system_id", item.getSystemId());
DustMonitorItem existing = dustMonitorItemService.getOne(coalQueryWrapper);
if (existing != null) {
if (item.getId() != null) {
// ID不同且名称已被占用才抛异常
if (!existing.getId().equals(item.getId())) {
throw new IllegalArgumentException("系统已存在");
}
// ID相同是更新自身,不抛异常,直接返回
return;
}
throw new IllegalArgumentException("系统已存在");
}
}
}

162
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustMonitorValveController.java

@ -0,0 +1,162 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.DustMonitorValve;
import cc.admin.modules.dust.service.IDustMonitorValveService;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
* @Description: 大屏阀门监控表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "大屏阀门监控表")
@RestController
@RequestMapping("/dust/monitorValve")
public class DustMonitorValveController extends BaseController<DustMonitorValve, IDustMonitorValveService> {
@Autowired
private IDustMonitorValveService dustMonitorValveService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "大屏阀门监控表-分页列表查询")
@ApiOperation(value = "大屏阀门监控表-分页列表查询", notes = "大屏阀门监控表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "key", required = false) String key,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DustMonitorValve> queryWrapper = QueryGenerator.initQueryWrapper(new DustMonitorValve(), req.getParameterMap());
if (StrUtil.isNotEmpty(key)) {
}
queryWrapper.orderByAsc("sort_order")
.orderByDesc("create_time");
Page<DustMonitorValve> page = new Page<DustMonitorValve>(pageNo, pageSize);
IPage<DustMonitorValve> pageList = dustMonitorValveService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param dustMonitorValve
* @return
*/
@AutoLog(value = "大屏阀门监控表-添加")
@ApiOperation(value = "大屏阀门监控表-添加", notes = "大屏阀门监控表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody DustMonitorValve dustMonitorValve) {
dustMonitorValveService.save(dustMonitorValve);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param dustMonitorValve
* @return
*/
@AutoLog(value = "大屏阀门监控表-编辑")
@ApiOperation(value = "大屏阀门监控表-编辑", notes = "大屏阀门监控表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody DustMonitorValve dustMonitorValve) {
dustMonitorValveService.updateById(dustMonitorValve);
return Result.ok("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "大屏阀门监控表-通过id删除")
@ApiOperation(value = "大屏阀门监控表-通过id删除", notes = "大屏阀门监控表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
dustMonitorValveService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "大屏阀门监控表-批量删除")
@ApiOperation(value = "大屏阀门监控表-批量删除", notes = "大屏阀门监控表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.dustMonitorValveService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "大屏阀门监控表-通过id查询")
@ApiOperation(value = "大屏阀门监控表-通过id查询", notes = "大屏阀门监控表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
DustMonitorValve dustMonitorValve = dustMonitorValveService.getById(id);
return Result.ok(dustMonitorValve);
}
/**
* 导出excel
*
* @param request
* @param dustMonitorValve
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, DustMonitorValve dustMonitorValve) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, dustMonitorValve, DustMonitorValve.class, "大屏阀门监控表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, DustMonitorValve.class);
}
}

182
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustSystemController.java

@ -0,0 +1,182 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.DustDataTag;
import cc.admin.modules.dust.entity.DustSystem;
import cc.admin.modules.dust.service.IDustSystemService;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
* @Description: 除尘系统表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "除尘系统表")
@RestController
@RequestMapping("/dust/system")
public class DustSystemController extends BaseController<DustSystem, IDustSystemService> {
@Autowired
private IDustSystemService dustSystemService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "除尘系统表-分页列表查询")
@ApiOperation(value = "除尘系统表-分页列表查询", notes = "除尘系统表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "key", required = false) String key,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DustSystem> queryWrapper = QueryGenerator.initQueryWrapper(new DustSystem(), req.getParameterMap());
if (StrUtil.isNotEmpty(key)) {
}
queryWrapper.orderByAsc("sort_order")
.orderByDesc("create_time");
Page<DustSystem> page = new Page<DustSystem>(pageNo, pageSize);
IPage<DustSystem> pageList = dustSystemService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param dustSystem
* @return
*/
@AutoLog(value = "除尘系统表-添加")
@ApiOperation(value = "除尘系统表-添加", notes = "除尘系统表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody DustSystem dustSystem) {
dustSystemService.save(dustSystem);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param dustSystem
* @return
*/
@AutoLog(value = "除尘系统表-编辑")
@ApiOperation(value = "除尘系统表-编辑", notes = "除尘系统表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody DustSystem dustSystem) {
dustSystemService.updateById(dustSystem);
return Result.ok("编辑成功!");
}
/**
* 复制
*
* @param id
* @param name
* @return
*/
@AutoLog(value = "除尘系统表-复制")
@ApiOperation(value = "除尘系统表-复制", notes = "除尘系统表-复制")
@PostMapping(value = "/copy")
public Result<?> copy(@RequestParam(name = "id", required = true) String id, @RequestParam(name = "name", required = true) String name) {
DustSystem dustSystem = dustSystemService.getById(id);
dustSystem.setId(IdUtil.fastUUID());
dustSystem.setName(name);
dustSystemService.save(dustSystem);
return Result.ok("复制成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "除尘系统表-通过id删除")
@ApiOperation(value = "除尘系统表-通过id删除", notes = "除尘系统表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
dustSystemService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "除尘系统表-批量删除")
@ApiOperation(value = "除尘系统表-批量删除", notes = "除尘系统表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.dustSystemService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "除尘系统表-通过id查询")
@ApiOperation(value = "除尘系统表-通过id查询", notes = "除尘系统表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
DustSystem dustSystem = dustSystemService.getById(id);
return Result.ok(dustSystem);
}
/**
* 导出excel
*
* @param request
* @param dustSystem
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, DustSystem dustSystem) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, dustSystem, DustSystem.class, "除尘系统表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, DustSystem.class);
}
}

341
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/DustValveController.java

@ -0,0 +1,341 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.DustDataTag;
import cc.admin.modules.dust.entity.DustSystem;
import cc.admin.modules.dust.entity.DustValve;
import cc.admin.modules.dust.enums.ValveType;
import cc.admin.modules.dust.service.IDustDataTagService;
import cc.admin.modules.dust.service.IDustSystemService;
import cc.admin.modules.dust.service.IDustValveService;
import cc.admin.modules.dust.utils.BeanCopyUtil;
import cc.admin.modules.dust.vo.DataTagExcel;
import cc.admin.modules.dust.vo.DataValveExcel;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* @Description: 阀门表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "阀门表")
@RestController
@RequestMapping("/dust/valve")
public class DustValveController extends BaseController<DustValve, IDustValveService> {
@Autowired
private IDustValveService dustValveService;
@Autowired
private IDustDataTagService dustDataTagService;
@Autowired
private IDustSystemService dustSystemService;
/**
* 分页列表查询
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "阀门表-分页列表查询")
@ApiOperation(value = "阀门表-分页列表查询", notes = "阀门表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "systemId", required = false) String systemId,
@RequestParam(name = "dataTagId", required = false) String dataTagId,
@RequestParam(name = "name", required = false) String name,
@RequestParam(name = "parameter", required = false) String parameter,
@RequestParam(name = "location", required = false) String location,
@RequestParam(name = "type", required = false) Integer type,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<DustValve> queryWrapper = new QueryWrapper<>();
if (StrUtil.isNotEmpty(parameter)) {
queryWrapper.like("parameter", parameter); // parameter 模糊查询
}
if (StrUtil.isNotEmpty(location)) {
queryWrapper.like("location", location); // location 改为模糊查询
}
if (StrUtil.isNotEmpty(name)) {
queryWrapper.like("name", name); // location 改为模糊查询
}
if (null != type) {
queryWrapper.eq("type", type); // type 保持精确匹配
}
if (StrUtil.isNotEmpty(systemId)) {
queryWrapper.eq("system_id", systemId); // systemId 保持精确匹配
}
if (StrUtil.isNotEmpty(dataTagId)) {
queryWrapper.eq("data_tag_id", dataTagId); // systemId 保持精确匹配
}
queryWrapper.orderByAsc("sort_order")
.orderByDesc("create_time");
Page<DustValve> page = new Page<DustValve>(pageNo, pageSize);
IPage<DustValve> pageList = dustValveService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param dustValve
* @return
*/
@AutoLog(value = "阀门表-添加")
@ApiOperation(value = "阀门表-添加", notes = "阀门表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody DustValve dustValve) {
dustValveService.save(dustValve);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param dustValve
* @return
*/
@AutoLog(value = "阀门表-编辑")
@ApiOperation(value = "阀门表-编辑", notes = "阀门表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody DustValve dustValve) {
dustValveService.updateById(dustValve);
return Result.ok("编辑成功!");
}
/**
* 复制
*
* @param id
* @param name
* @return
*/
@AutoLog(value = "阀门表-复制")
@ApiOperation(value = "阀门表-复制", notes = "阀门表-复制")
@PostMapping(value = "/copy")
public Result<?> copy(@RequestParam(name = "id", required = true) String id, @RequestParam(name = "name", required = true) String name) {
DustValve dustValve = dustValveService.getById(id);
dustValve.setId(IdUtil.fastUUID());
dustValve.setName(name);
dustValveService.save(dustValve);
return Result.ok("复制成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "阀门表-通过id删除")
@ApiOperation(value = "阀门表-通过id删除", notes = "阀门表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
dustValveService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "阀门表-批量删除")
@ApiOperation(value = "阀门表-批量删除", notes = "阀门表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.dustValveService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "阀门表-通过id查询")
@ApiOperation(value = "阀门表-通过id查询", notes = "阀门表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
DustValve dustValve = dustValveService.getById(id);
return Result.ok(dustValve);
}
/**
* 导出excel
*
* @param request
* @param dustValve
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, DustValve dustValve) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, dustValve, DustValve.class, "阀门表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request,
HttpServletResponse response) {
try {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
if (fileMap.isEmpty()) {
return Result.error("请上传 Excel 文件");
}
MultipartFile file = fileMap.values().iterator().next();
if (file == null || file.isEmpty()) {
return Result.error("上传的文件为空");
}
List<DustValve> metaDataValues = new ArrayList<>();
List<String> errorList = new ArrayList<>();
HashSet<String> set = new HashSet<>();
HashSet<String> dataTagSet = new HashSet<>();
HashSet<String> nameSet = new HashSet<>();
List<DustSystem> systemList = dustSystemService.list();
Map<String, DustSystem> systemMap = systemList.stream().collect(Collectors.toMap(DustSystem::getName, dustSystem -> dustSystem));
EasyExcelFactory.read(file.getInputStream(), DataValveExcel.class,
new AnalysisEventListener<DataValveExcel>() {
@Override
public void invoke(DataValveExcel rowData, AnalysisContext context) {
int rowIndex = context.readRowHolder().getRowIndex() + 1;
if (StringUtils.isEmpty(rowData.getSystemName())) {
errorList.add(String.format("第 %d 行数据不完整:系统名称 为空", rowIndex));
return;
}
if (StringUtils.isEmpty(rowData.getName())) {
errorList.add(String.format("第 %d 行数据不完整:阀门名称 为空", rowIndex));
return;
}
if (StringUtils.isEmpty(rowData.getTypeName())) {
errorList.add(String.format("第 %d 行数据不完整:类型 为空", rowIndex));
return;
}
if (StringUtils.isEmpty(rowData.getDataTag())) {
errorList.add(String.format("第 %d 行数据不完整:所属点位 为空", rowIndex));
return;
}
// 检查 dataTag 是否重复
String dataTag = rowData.getDataTag();
if (!set.add(dataTag + rowData.getSystemName())) {
errorList.add(String.format("第 %d 行数据重复:数据点位 %s 已存在", rowIndex, dataTag));
return;
}
// 验证 typeName 是否合法
Integer valveType;
try {
valveType = ValveType.getTypeByName(rowData.getTypeName());
} catch (IllegalArgumentException e) {
errorList.add(String.format("第 %d 行数据无效:类型 %s 不合法,应为 '升关阀' 或 '调节阀'", rowIndex, rowData.getTypeName()));
return;
}
DustValve dustValve = new DustValve();
BeanUtil.copyProperties(rowData, dustValve);
dustValve.setType(valveType);
DustSystem dustSystem = systemMap.get(rowData.getSystemName().trim());
if (dustSystem == null) {
errorList.add(String.format("第 %d 行数据错误:所属系统 %s 不存在", context.readRowHolder().getRowIndex() + 1, rowData.getSystemName()));
return;
}
dataTagSet.add(dataTag);
nameSet.add(rowData.getName());
dustValve.setSystemId(dustSystem.getId());
metaDataValues.add(dustValve);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("所有数据读取完成,共有 " + metaDataValues.size() + " 条数据");
}
})
.sheet()
.doRead();
if (!errorList.isEmpty()) {
return Result.error("导入失败,存在以下错误:\n" + String.join("\n", errorList));
}
QueryWrapper<DustDataTag> dataTagQueryWrapper = new QueryWrapper<>();
dataTagQueryWrapper.in("name", dataTagSet);
List<DustDataTag> list = dustDataTagService.list(dataTagQueryWrapper);
Map<String, DustDataTag> collect = list.stream().collect(Collectors.toMap(
dustDataTag -> dustDataTag.getName() + dustDataTag.getSystemId(),
Function.identity())); // 值:DustDataTag 对象本身
QueryWrapper<DustValve> dustValveQueryWrapper = new QueryWrapper<>();
dustValveQueryWrapper.in("name", nameSet);
List<DustValve> valveList = dustValveService.list(dustValveQueryWrapper);
Map<String, DustValve> valveMap = valveList.stream().collect(Collectors.toMap(
dustDataTag -> dustDataTag.getName() + dustDataTag.getSystemId(),
Function.identity()));
for (DustValve metaDataValue : metaDataValues) {
String tag = metaDataValue.getDataTag().trim() + metaDataValue.getSystemId();
DustDataTag dustDataTag = collect.get(tag);
if (dustDataTag != null) {
metaDataValue.setDataTagId(dustDataTag.getId());
}
String valve = metaDataValue.getName().trim() + metaDataValue.getSystemId();
DustValve dustValve = valveMap.get(valve);
if (dustValve != null) {
metaDataValue.setId(dustValve.getId());
}
}
dustValveService.saveOrUpdateBatch(metaDataValues);
} catch (Exception e) {
e.printStackTrace();
return Result.error("导入失败:" + e.getMessage());
}
return Result.ok("导入成功");
}
}

304
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/PipeController.java

@ -0,0 +1,304 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.util.RedisUtil;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.modules.dust.service.IPipeService;
import cc.admin.modules.dust.service.IRecommendPlanService;
import cc.admin.modules.dust.vo.DustConfigVo;
import cc.admin.poi.util.HeaderCell;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cc.admin.modules.dust.utils.ExcelUtil.*;
import static cc.admin.poi.util.ExcelUtil.*;
/**
* @Description: 管道表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "管道表")
@RestController
@RequestMapping("/pipe")
public class PipeController extends BaseController<Pipe, IPipeService> {
private static final List<HeaderCell> headerCellList = Arrays.asList(
new HeaderCell(0, 0, "序号"),
new HeaderCell(0, 1, "管道名称"),
new HeaderCell(0, 2, "设计风量"),
new HeaderCell(0, 3, "阀门开度(%)"),
new HeaderCell(0, 4, "备注")
);
@Autowired
private IPipeService pipeService;
@AutoLog(value = "管道表-分页列表查询")
@ApiOperation(value = "管道表-分页列表查询", notes = "管道表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "key", required = false) String key,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<Pipe> queryWrapper = new QueryWrapper<>();
if (StrUtil.isNotEmpty(key)) {
}
queryWrapper.orderByAsc("sort_order");
Page<Pipe> page = new Page<>(pageNo, pageSize);
IPage<Pipe> pageList = pipeService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param pipe
* @return
*/
@AutoLog(value = "管道表-添加")
@ApiOperation(value = "管道表-添加", notes = "管道表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody Pipe pipe) {
pipeService.savePipe(pipe);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param pipe
* @return
*/
@AutoLog(value = "管道表-编辑")
@ApiOperation(value = "管道表-编辑", notes = "管道表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody Pipe pipe) {
pipeService.updatePipe(pipe);
return Result.ok("编辑成功!");
}
/**
* 编辑
*
* @param pipe
* @return
*/
@AutoLog(value = "管道表-批量编辑")
@ApiOperation(value = "管道表-批量编辑", notes = "管道表-批量编辑")
@PostMapping(value = "/updateByList")
public Result<?> updateById(@RequestBody Pipe pipe) {
List<Pipe> list = pipe.getList();
for (Pipe pipe1 : list) {
Pipe byId = pipeService.getById(pipe1.getId());
if (null != byId && null != byId.getDiameter()){
pipe1.setDiameter(byId.getDiameter());
}
}
pipeService.updateBatchById(list);
return Result.ok("编辑成功!");
}
/**
* 批量编辑
*
* @param ids
* @return
*/
@AutoLog(value = "管道表-批量删除")
@ApiOperation(value = "管道表-批量删除", notes = "管道表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.pipeService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "管道表-通过id删除")
@ApiOperation(value = "管道表-通过id删除", notes = "管道表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
pipeService.remove(id);
return Result.ok("删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "管道表-通过id查询")
@ApiOperation(value = "管道表-通过id查询", notes = "管道表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
Pipe pipe = pipeService.getById(id);
return Result.ok(pipe);
}
/**
* 导出excel
*
* @param request
* @param pipe
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, Pipe pipe) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, pipe, Pipe.class, "管道表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response,
@RequestParam(name = "designPlanId", required = true) String designPlanId) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();// 获取上传文件对象
try {
List<String> errorList = new ArrayList<>(); // 保存错误提示信息
List<DustConfigVo> configVoList = readXls(file.getInputStream(), errorList,designPlanId);
Map<String, Long> nameCounts = configVoList.stream()
.map(DustConfigVo::getPipeName)
.filter(pipeName -> pipeName != null && !pipeName.trim().isEmpty())
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
boolean hasDuplicates = nameCounts.values().stream().anyMatch(count -> count > 1);
if (hasDuplicates) {
return Result.error("导入有重复名称,请检查");
}
DustConfigVo dustConfigVo = configVoList.get(0);
if (!dustConfigVo.getSerialNumber().equals("0")){
return Result.error("父级管道序号必须是0");
}
return pipeService.importList(configVoList, errorList,designPlanId);
} catch (Exception e) {
log.error(e.getMessage(), e);
return Result.error("文件导入失败:" + e.getMessage());
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
}
return Result.error("文件导入失败!");
}
private List<DustConfigVo> readXls(InputStream inputStream, List<String> errorList,String designPlanId) throws Exception {
long start = System.currentTimeMillis();
Workbook book = getWorkbook(inputStream);
String sheetName = book.getSheetName(0);
Sheet sheet = book.getSheetAt(0);
// 检查表头格式
checkTableHeader(sheet, sheetName, headerCellList);
// 处理导入对象
List<DustConfigVo> recordList = new ArrayList<>();
List<String> columnNameList = headerCellList.stream().map(HeaderCell::getTitle).collect(Collectors.toList());
for (int j = 1; j <= sheet.getLastRowNum(); j++) {
try {
log.debug("read row {}", j);
Row row = sheet.getRow(j);
int column = 0;
String serialNumber = readCellAsString(row.getCell(column));
if (StrUtil.isEmpty(serialNumber)) {
errorList.add(String.format("第 %d 行%s为空", j + 1, columnNameList.get(column)));
continue;
}
if (serialNumber.contains(".0")) {
serialNumber = serialNumber.substring(0, serialNumber.indexOf(".0"));
}
String pipeName = readCellAsString(row.getCell(++column));
Double flow = readCellAsDouble(row.getCell(++column));
String valveOpening = readCellAsString(row.getCell(++column));
String remark = readCellAsString(row.getCell(++column));
DustConfigVo dustConfigVo = new DustConfigVo();
dustConfigVo.setId(UUID.randomUUID().toString());
dustConfigVo.setDesignPlanId(designPlanId);
dustConfigVo.setSerialNumber(serialNumber);
dustConfigVo.setPipeName(pipeName);
dustConfigVo.setIsCompute(1);
dustConfigVo.setFlow(flow != null ? flow : 0);
dustConfigVo.setValveOpening(parseValveOpening(valveOpening));
dustConfigVo.setSortOrder(j);
dustConfigVo.setRemark(remark);
recordList.add(dustConfigVo);
} catch (Exception e) {
log.error(e.getMessage(), e);
e.printStackTrace();
errorList.add(String.format("%s第 %d 行数据异常:%s", sheetName, j + 1, e.getMessage()));
}
}
log.info("读excel消耗时间" + (System.currentTimeMillis() - start) + "毫秒");
return recordList;
}
private Double parseValveOpening(String valveOpeningStr) {
if (valveOpeningStr == null || valveOpeningStr.trim().isEmpty()) {
return 10.0; // 默认值
}
valveOpeningStr = valveOpeningStr.trim();
try {
if (valveOpeningStr.endsWith("%")) {
valveOpeningStr = valveOpeningStr.substring(0, valveOpeningStr.length() - 1);
}
double v = Double.parseDouble(valveOpeningStr);
if (v <= 1){
v = v * 100;
}
return v;
} catch (NumberFormatException e) {
log.warn("无法解析阀门开度 '{}', 使用默认值 10.0", valveOpeningStr);
return 10.0; // 默认值
}
}
}

161
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/PipeDiameterThicknessController.java

@ -0,0 +1,161 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.PipeDiameterThickness;
import cc.admin.modules.dust.service.IPipeDiameterThicknessService;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
* @Description: 管径壁厚对应表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "管径壁厚对应表")
@RestController
@RequestMapping("/pipe/diameterThickness")
public class PipeDiameterThicknessController extends BaseController<PipeDiameterThickness, IPipeDiameterThicknessService> {
@Autowired
private IPipeDiameterThicknessService pipeDiameterThicknessService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "管径壁厚对应表-分页列表查询")
@ApiOperation(value = "管径壁厚对应表-分页列表查询", notes = "管径壁厚对应表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name = "key", required = false) String key,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<PipeDiameterThickness> queryWrapper = QueryGenerator.initQueryWrapper(new PipeDiameterThickness(), req.getParameterMap());
if (StrUtil.isNotEmpty(key)) {
}
Page<PipeDiameterThickness> page = new Page<PipeDiameterThickness>(pageNo, pageSize);
IPage<PipeDiameterThickness> pageList = pipeDiameterThicknessService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param pipeDiameterThickness
* @return
*/
@AutoLog(value = "管径壁厚对应表-添加")
@ApiOperation(value = "管径壁厚对应表-添加", notes = "管径壁厚对应表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody PipeDiameterThickness pipeDiameterThickness) {
pipeDiameterThicknessService.save(pipeDiameterThickness);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param pipeDiameterThickness
* @return
*/
@AutoLog(value = "管径壁厚对应表-编辑")
@ApiOperation(value = "管径壁厚对应表-编辑", notes = "管径壁厚对应表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody PipeDiameterThickness pipeDiameterThickness) {
pipeDiameterThicknessService.updateById(pipeDiameterThickness);
return Result.ok("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "管径壁厚对应表-通过id删除")
@ApiOperation(value = "管径壁厚对应表-通过id删除", notes = "管径壁厚对应表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
pipeDiameterThicknessService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "管径壁厚对应表-批量删除")
@ApiOperation(value = "管径壁厚对应表-批量删除", notes = "管径壁厚对应表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.pipeDiameterThicknessService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "管径壁厚对应表-通过id查询")
@ApiOperation(value = "管径壁厚对应表-通过id查询", notes = "管径壁厚对应表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
PipeDiameterThickness pipeDiameterThickness = pipeDiameterThicknessService.getById(id);
return Result.ok(pipeDiameterThickness);
}
/**
* 导出excel
*
* @param request
* @param pipeDiameterThickness
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, PipeDiameterThickness pipeDiameterThickness) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, pipeDiameterThickness, PipeDiameterThickness.class, "管径壁厚对应表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, PipeDiameterThickness.class);
}
}

156
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/RecommendPlanController.java

@ -0,0 +1,156 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.modules.dust.entity.RecommendPlan;
import cc.admin.modules.dust.entity.RecommendPlanPipeConfig;
import cc.admin.modules.dust.service.IPipeService;
import cc.admin.modules.dust.service.IRecommendPlanService;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Array;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: 推荐方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Slf4j
@Api(tags = "推荐方案表")
@RestController
@RequestMapping("/recommend/plan")
public class RecommendPlanController extends BaseController<RecommendPlan, IRecommendPlanService> {
@Autowired
private IRecommendPlanService recommendPlanService;
@Autowired
private IPipeService iPipeService;
/**
* 添加
*
* @param recommendPlan
* @return
*/
@AutoLog(value = "推荐方案表-添加")
@ApiOperation(value = "推荐方案表-添加", notes = "推荐方案表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody RecommendPlan recommendPlan) {
recommendPlanService.save(recommendPlan);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param recommendPlan
* @return
*/
@AutoLog(value = "推荐方案表-编辑")
@ApiOperation(value = "推荐方案表-编辑", notes = "推荐方案表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody RecommendPlan recommendPlan) {
recommendPlanService.updateById(recommendPlan);
return Result.ok("编辑成功!");
}
/**
* 批量删除
*
* @return
*/
@AutoLog(value = "推荐方案表-批量删除")
@ApiOperation(value = "推荐方案表-批量删除", notes = "推荐方案表-批量删除")
@DeleteMapping(value = "/deleteByDesignPlanId")
public Result<?> deleteByDesignPlanId(@RequestParam(name = "designPlanId", required = true) String designPlanId) {
QueryWrapper<RecommendPlan> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.eq("design_plan_id", designPlanId);
recommendPlanService.deleteByDesignPlanId(designPlanId);
return Result.ok("批量删除成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "推荐方案表-通过id删除")
@ApiOperation(value = "推荐方案表-通过id删除", notes = "推荐方案表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name = "id", required = true) String id) {
recommendPlanService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "推荐方案表-批量删除")
@ApiOperation(value = "推荐方案表-批量删除", notes = "推荐方案表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
this.recommendPlanService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "推荐方案表-通过id查询")
@ApiOperation(value = "推荐方案表-通过id查询", notes = "推荐方案表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name = "id", required = true) String id) {
RecommendPlan recommendPlan = recommendPlanService.getById(id);
return Result.ok(recommendPlan);
}
/**
* 导出excel
*
* @param request
* @param recommendPlan
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, RecommendPlan recommendPlan) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, recommendPlan, RecommendPlan.class, "推荐方案表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, RecommendPlan.class);
}
}

162
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/controller/WindSpeedColorController.java

@ -0,0 +1,162 @@
package cc.admin.modules.dust.controller;
import cc.admin.common.api.vo.Result;
import cc.admin.common.aspect.annotation.AutoLog;
import cc.admin.common.sys.base.controller.BaseController;
import cc.admin.common.sys.query.QueryGenerator;
import cc.admin.modules.dust.entity.WindSpeedColor;
import cc.admin.modules.dust.service.IWindSpeedColorService;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
/**
* @Description: 风速颜色表
* @Author: cc-admin
* @Date: 2025-01-09
* @Version: V1.0.0
*/
@Slf4j
@Api(tags="风速颜色表")
@RestController
@RequestMapping("/wind/speedColor")
public class WindSpeedColorController extends BaseController<WindSpeedColor, IWindSpeedColorService> {
@Autowired
private IWindSpeedColorService windSpeedColorService;
/**
* 分页列表查询
*
* @param key
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@AutoLog(value = "风速颜色表-分页列表查询")
@ApiOperation(value="风速颜色表-分页列表查询", notes="风速颜色表-分页列表查询")
@GetMapping(value = "/list")
public Result<?> queryPageList(
@RequestParam(name="key",required = false) String key,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper<WindSpeedColor> queryWrapper = QueryGenerator.initQueryWrapper(new WindSpeedColor(), req.getParameterMap());
if (StrUtil.isNotEmpty(key)) {
}
Page<WindSpeedColor> page = new Page<WindSpeedColor>(pageNo, pageSize);
IPage<WindSpeedColor> pageList = windSpeedColorService.page(page, queryWrapper);
return Result.ok(pageList);
}
/**
* 添加
*
* @param windSpeedColor
* @return
*/
@AutoLog(value = "风速颜色表-添加")
@ApiOperation(value="风速颜色表-添加", notes="风速颜色表-添加")
@PostMapping(value = "/add")
public Result<?> add(@RequestBody WindSpeedColor windSpeedColor) {
windSpeedColorService.save(windSpeedColor);
return Result.ok("添加成功!");
}
/**
* 编辑
*
* @param windSpeedColor
* @return
*/
@AutoLog(value = "风速颜色表-编辑")
@ApiOperation(value="风速颜色表-编辑", notes="风速颜色表-编辑")
@PutMapping(value = "/edit")
public Result<?> edit(@RequestBody WindSpeedColor windSpeedColor) {
windSpeedColorService.updateById(windSpeedColor);
return Result.ok("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "风速颜色表-通过id删除")
@ApiOperation(value="风速颜色表-通过id删除", notes="风速颜色表-通过id删除")
@DeleteMapping(value = "/delete")
public Result<?> delete(@RequestParam(name="id",required=true) String id) {
windSpeedColorService.removeById(id);
return Result.ok("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "风速颜色表-批量删除")
@ApiOperation(value="风速颜色表-批量删除", notes="风速颜色表-批量删除")
@DeleteMapping(value = "/deleteBatch")
public Result<?> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.windSpeedColorService.removeByIds(Arrays.asList(ids.split(",")));
return Result.ok("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
@AutoLog(value = "风速颜色表-通过id查询")
@ApiOperation(value="风速颜色表-通过id查询", notes="风速颜色表-通过id查询")
@GetMapping(value = "/queryById")
public Result<?> queryById(@RequestParam(name="id",required=true) String id) {
WindSpeedColor windSpeedColor = windSpeedColorService.getById(id);
return Result.ok(windSpeedColor);
}
/**
* 导出excel
*
* @param request
* @param windSpeedColor
*/
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response, WindSpeedColor windSpeedColor) {
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
return super.exportXls(request, windSpeedColor, WindSpeedColor.class, "风速颜色表");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, WindSpeedColor.class);
}
}

84
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DesignPlan.java

@ -0,0 +1,84 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 设计方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Data
@TableName("design_plan")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="design_plan对象", description="设计方案表")
public class DesignPlan {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**主键ID*/
@Excel(name = "管道配置id", width = 15)
@ApiModelProperty(value = "管道配置id")
private String pipeDiameterId;
@Excel(name = "方案名称", width = 15)
@ApiModelProperty(value = "方案名称")
private String name;
/**总管风量*/
@Excel(name = "总管风量", width = 15)
@ApiModelProperty(value = "总管风量")
private String totalFlow;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除状态(0-正常,1-已删除)*/
@Excel(name = "方案标识位", width = 15)
@ApiModelProperty(value = "方案标识位")
private Integer planFlag;
/**删除状态(0-正常,1-已删除)*/
@Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
@ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
@TableLogic
private Integer delFlag;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
@TableField(exist = false)
private List<String> pipeIdList;
}

75
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustAlarm.java

@ -0,0 +1,75 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 警报记录表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Data
@TableName("dust_alarm")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="dust_alarm对象", description="警报记录表")
public class DustAlarm {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**所属系统*/
@Excel(name = "所属系统", width = 15)
@ApiModelProperty(value = "所属系统")
private String systemId;
/**警报时间*/
@Excel(name = "警报时间", width = 15)
@ApiModelProperty(value = "警报时间")
private Date startTime;
/**警报结束时间*/
@Excel(name = "警报结束时间", width = 15)
@ApiModelProperty(value = "警报结束时间")
private Date endTime;
/**警报内容*/
@Excel(name = "警报内容", width = 15)
@ApiModelProperty(value = "警报内容")
private String alarmContent;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除标志*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
}

76
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustDataTag.java

@ -0,0 +1,76 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 数据点位表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Data
@TableName("dust_data_tag")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="dust_data_tag对象", description="数据点位表")
public class DustDataTag {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**名称*/
@Excel(name = "除尘系统id", width = 15)
@ApiModelProperty(value = "除尘系统id")
private String systemId;
/**名称*/
@Excel(name = "名称", width = 15)
@ApiModelProperty(value = "名称")
private String name;
/**数据点位*/
@Excel(name = "数据点位", width = 15)
@ApiModelProperty(value = "数据点位")
private String dataTag;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除标志*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
}

102
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustMonitorItem.java

@ -0,0 +1,102 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 大屏监控项表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Data
@TableName("dust_monitor_item")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="dust_monitor_item对象", description="大屏监控项表")
public class DustMonitorItem {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**所属系统*/
@Excel(name = "所属系统", width = 15)
@ApiModelProperty(value = "所属系统")
private String systemId;
/**入口压力数据点位*/
@Excel(name = "除尘器进口压力", width = 15)
@ApiModelProperty(value = "除尘器进口压力")
private String inletPressureDataTagId;
/**出口压力数据点位*/
@Excel(name = "除尘器出口压力", width = 15)
@ApiModelProperty(value = "除尘器出口压力")
private String outletPressureDataTagId;
/**除尘器进出口压差(pa)*/
@Excel(name = "除尘器进出口压差(pa)", width = 15)
@ApiModelProperty(value = "除尘器进出口压差(pa)")
private String pressureDifferenceId;
/**风机速度*/
@Excel(name = "风机速度", width = 15)
@ApiModelProperty(value = "风机速度")
private String fanSpeedDataTagId;
/**电机电流*/
@Excel(name = "电机电流", width = 15)
@ApiModelProperty(value = "电机电流")
private String motorCurrentDataTagId;
/**烟囱CEMS风量*/
@Excel(name = "烟囱CEMS风量", width = 15)
@ApiModelProperty(value = "烟囱CEMS风量")
private String cemsAirVolumeDataTagId;
/**粉尘浓度*/
@Excel(name = "粉尘浓度", width = 15)
@ApiModelProperty(value = "粉尘浓度")
private String dustConcentrationDataTagId;
/**风机运行状态*/
@Excel(name = "风机运行状态", width = 15)
@ApiModelProperty(value = "风机运行状态")
private String fanStatusDataTagId;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除标志*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
}

99
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustMonitorValve.java

@ -0,0 +1,99 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 大屏阀门监控表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Data
@TableName("dust_monitor_valve")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "dust_monitor_valve对象", description = "大屏阀门监控表")
public class DustMonitorValve {
/**
* 主键ID
*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 阀门ID
*/
@Excel(name = "阀门ID", width = 15)
@ApiModelProperty(value = "阀门ID")
private String valveId;
/**
* 数据点位
*/
@Excel(name = "数据点位", width = 15)
@ApiModelProperty(value = "数据点位")
private String dataTagId;
/**
* 排序
*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**
* 备注
*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**
* 删除标志
*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**
* 创建时间
*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 创建人
*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 更新时间
*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 更新人
*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
@ApiModelProperty(value = "所属系统")
@TableField(exist = false)
private String systemId;
@ApiModelProperty(value = "状态")
@TableField(exist = false)
private Integer status;
}

67
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustSystem.java

@ -0,0 +1,67 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 除尘系统表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Data
@TableName("dust_system")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="dust_system对象", description="除尘系统表")
public class DustSystem {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**名称*/
@Excel(name = "名称", width = 15)
@ApiModelProperty(value = "名称")
private String name;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除标志*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
}

95
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/DustValve.java

@ -0,0 +1,95 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 阀门表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Data
@TableName("dust_valve")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="dust_valve对象", description="阀门表")
public class DustValve {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**所属系统*/
@Excel(name = "所属系统", width = 15)
@ApiModelProperty(value = "所属系统")
private String systemId;
@TableField(exist = false)
private String systemName;
/**数据点位*/
@Excel(name = "数据点位", width = 15)
@ApiModelProperty(value = "数据点位")
private String dataTagId;
@TableField(exist = false)
private String dataTag;
/**阀门名称*/
@Excel(name = "阀门", width = 15)
@ApiModelProperty(value = "阀门")
private String name;
/**类型 (0: 升关阀, 1: 调节阀)*/
@Excel(name = "类型 (0: 升关阀, 1: 调节阀)", width = 15)
@ApiModelProperty(value = "类型 (0: 升关阀, 1: 调节阀)")
private Integer type;
/**阀门位置*/
@Excel(name = "除尘部位", width = 15)
@ApiModelProperty(value = "除尘部位")
private String location;
/**阀门参数*/
@Excel(name = "阀门参数", width = 15)
@ApiModelProperty(value = "阀门参数")
private String parameter;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除标志*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
@ApiModelProperty(value = "状态")
@TableField(exist = false)
private Integer status;
}

190
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/Pipe.java

@ -0,0 +1,190 @@
package cc.admin.modules.dust.entity;
import cc.admin.poi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @Description: 管道表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Data
@TableName("pipe")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "pipe对象", description = "管道表")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Pipe {
/**
* 主键ID
*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 父管道ID
*/
@Excel(name = "父管道ID", width = 15)
@ApiModelProperty(value = "父管道ID")
private String parentId;
/**
* 父管道ID
*/
@Excel(name = "计划方案ID", width = 15)
@ApiModelProperty(value = "计划方案ID")
private String designPlanId;
/**
* 管道名称
*/
@Excel(name = "管道名称", width = 15)
@ApiModelProperty(value = "管道名称")
private String name;
/**
* 设计风量
*/
@Excel(name = "设计风量", width = 15)
@ApiModelProperty(value = "设计风量")
private Double flow;
//管道风量
@TableField(exist = false)
private Double pipeFlow;
//开度
@Excel(name = "节点阀门打开度", width = 15)
@ApiModelProperty(value = "节点阀门打开度")
private Double valveOpening;
//开度
@Excel(name = "推荐方案节点阀门打开度(%)", width = 15)
@ApiModelProperty(value = "推荐方案节点阀门打开度(%)")
private Double recommendValveOpening;
//开度
@Excel(name = "实际生产阀门打开度(%)", width = 15)
@ApiModelProperty(value = "实际生产阀门打开度(%)")
private Double productionValveOpening;
//开度
@Excel(name = "自定义开度(%)", width = 15)
@ApiModelProperty(value = "自定义开度(%)")
private Double customValveOpening;
/**
* 所属分组
*/
@Excel(name = "所属分组", width = 15)
@ApiModelProperty(value = "所属分组")
private String groupName;
@Excel(name = "选择管径", width = 15)
@ApiModelProperty(value = "选择管径")
@TableField(strategy = FieldStrategy.IGNORED)
private Double diameter;
//管道内径
@TableField(exist = false)
private Double pipeDiameter;
//计算管道内径
@TableField(exist = false)
private Double computeDiameter;
/**
* 壁厚
*/
@Excel(name = "壁厚", width = 15)
@ApiModelProperty(value = "壁厚")
private Double thickness;
/**
* 是否除尘节点(0-,1-)
*/
@Excel(name = "是否除尘节点(0-否,1-是)", width = 15)
@ApiModelProperty(value = "是否除尘节点(0-否,1-是)")
private Integer isLeaf;
/**
* 是否除尘节点(0-,1-)
*/
@Excel(name = "是否加入推荐方案计算(0-否,1-是)", width = 15)
@ApiModelProperty(value = "是否加入推荐方案计算(0-否,1-是)")
private Integer isCompute;
/**
* 是否除尘节点(0-,1-)
*/
@Excel(name = "是否常开(0-否,1-是)", width = 15)
@ApiModelProperty(value = "是否常开(0-否,1-是)")
private Integer isNormallyOpen;
/**
* 排序
*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**
* 备注
*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**
* 删除状态(0-正常,1-已删除)
*/
@Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
@ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
@TableLogic
private Integer delFlag;
/**
* 创建人
*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新人
*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
@Excel(name = "风速", width = 15)
@ApiModelProperty(value = "风速")
private double windSpeed;
//---------------------
@TableField(exist = false)
private double branchPipeFlow;//支管风量
@TableField(exist = false)
private double totalPipeFlow;//总管风量
@TableField(exist = false)
private double totalWindSpeed;//总管风速
@TableField(exist = false)
private List<Pipe> list;
@TableField(exist = false)
private List<Pipe> children = new ArrayList<>();// 初始化为一个空列表
@TableField(exist = false)
private double area;//面积
}

71
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/PipeDiameterThickness.java

@ -0,0 +1,71 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 管径壁厚对应表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Data
@TableName("pipe_diameter_thickness")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="pipe_diameter_thickness对象", description="管径壁厚对应表")
public class PipeDiameterThickness {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**主键ID*/
@Excel(name = "名称", width = 15)
@ApiModelProperty(value = "名称")
private String name;
/**管道内径*/
@Excel(name = "管道内径(逗号分割)", width = 15)
@ApiModelProperty(value = "管道内径(逗号分割)")
private String diameter;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除状态(0-正常,1-已删除)*/
@Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
@ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
@TableLogic
private Integer delFlag;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
}

93
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/RecommendPlan.java

@ -0,0 +1,93 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 推荐方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Data
@TableName("recommend_plan")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="recommend_plan对象", description="推荐方案表")
public class RecommendPlan {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**关联的设计方案ID*/
@Excel(name = "关联的设计方案ID", width = 15)
@ApiModelProperty(value = "关联的设计方案ID")
private String designPlanId;
/**推荐方案名称*/
@Excel(name = "推荐方案名称", width = 15)
@ApiModelProperty(value = "推荐方案名称")
private String name;
/**总管风量*/
@Excel(name = "总管风量", width = 15)
@ApiModelProperty(value = "总管风量")
private Double flow;
/**总管风量*/
@Excel(name = "最小速度", width = 15)
@ApiModelProperty(value = "最小速度")
private Double minSpeed;
/**总管风量*/
@Excel(name = "最大速度", width = 15)
@ApiModelProperty(value = "最大速度")
private Double maxSpeed;
/**总管风量*/
@Excel(name = "管道ids", width = 15)
@ApiModelProperty(value = "管道ids")
private String pipeConfig;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除状态(0-正常,1-已删除)*/
@Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
@ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
@TableLogic
private Integer delFlag;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
@TableField(exist = false)
private List<RecommendPlanPipeConfig> configList;
}

67
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/RecommendPlanPipeConfig.java

@ -0,0 +1,67 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 推荐方案管道配置表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Data
public class RecommendPlanPipeConfig {
@Excel(name = "推荐方案ID(关联recommend_plan)", width = 15)
@ApiModelProperty(value = "推荐方案ID(关联recommend_plan)")
private String recommendPlanId;
/**关联的设计方案ID*/
@Excel(name = "关联的设计方案ID", width = 15)
@ApiModelProperty(value = "关联的设计方案ID")
private String designPlanId;
/**管道ID(关联pipe)*/
@Excel(name = "管道ID(关联pipe)", width = 15)
@ApiModelProperty(value = "管道ID(关联pipe)")
private String pipeId;
/**节点阀门打开度(%)*/
@Excel(name = "节点阀门打开度(%)", width = 15)
@ApiModelProperty(value = "节点阀门打开度(%)")
private Double valveOpening;
/**管道风量*/
@Excel(name = "管道风量", width = 15)
@ApiModelProperty(value = "管道风量")
private Double pipeFlow;
/**删除状态(0-正常,1-已删除)*/
@Excel(name = "删除状态(0-正常,1-已删除)", width = 15)
@ApiModelProperty(value = "删除状态(0-正常,1-已删除)")
@TableLogic
private Integer delFlag;
/**创建人*/
@Excel(name = "创建人", width = 15)
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**更新人*/
@Excel(name = "更新人", width = 15)
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
}

75
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/entity/WindSpeedColor.java

@ -0,0 +1,75 @@
package cc.admin.modules.dust.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import cc.admin.poi.excel.annotation.Excel;
import cc.admin.common.aspect.annotation.Dict;
/**
* @Description: 风速颜色表
* @Author: cc-admin
* @Date: 2025-01-09
* @Version: V1.0.0
*/
@Data
@TableName("wind_speed_color")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="wind_speed_color对象", description="风速颜色表")
public class WindSpeedColor {
/**主键ID*/
@Excel(name = "主键ID", width = 15)
@ApiModelProperty(value = "主键ID")
private String id;
/**风速*/
@Excel(name = "风速", width = 15)
@ApiModelProperty(value = "风速")
private String windSpeed;
/**颜色*/
@Excel(name = "颜色", width = 15)
@ApiModelProperty(value = "颜色")
private String color;
/**公式*/
@Excel(name = "公式", width = 15)
@ApiModelProperty(value = "公式")
private String formula;
/**排序*/
@Excel(name = "排序", width = 15)
@ApiModelProperty(value = "排序")
private Integer sortOrder;
/**备注*/
@Excel(name = "备注", width = 15)
@ApiModelProperty(value = "备注")
private String remark;
/**删除标志*/
@Excel(name = "删除标志", width = 15)
@ApiModelProperty(value = "删除标志")
@TableLogic
private Integer delFlag;
/**创建者*/
@Excel(name = "创建者", width = 15)
@ApiModelProperty(value = "创建者")
private String createBy;
/**创建时间*/
@Excel(name = "创建时间", width = 15)
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**更新者*/
@Excel(name = "更新者", width = 15)
@ApiModelProperty(value = "更新者")
private String updateBy;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间")
private Date updateTime;
}

49
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/enums/FanStatusType.java

@ -0,0 +1,49 @@
package cc.admin.modules.dust.enums;
import lombok.Getter;
@Getter
public enum FanStatusType {
CLOSE(0, "关闭"),
OPEN(1, "开启");
private final int type;
private final String name;
FanStatusType(int type, String name) {
this.type = type;
this.name = name;
}
// 通过 int 值获取枚举实例
public static FanStatusType fromType(int type) {
for (FanStatusType valveType : FanStatusType.values()) {
if (valveType.getType() == type) {
return valveType;
}
}
throw new IllegalArgumentException("未知的阀门类型: " + type);
}
// 通过 int 值获取名称
public static String getNameByType(int type) {
FanStatusType valveType = fromType(type);
return valveType.getName();
}
// 通过名称获取枚举实例
public static FanStatusType fromName(String name) {
for (FanStatusType valveType : FanStatusType.values()) {
if (valveType.getName().equals(name)) {
return valveType;
}
}
throw new IllegalArgumentException("未知的阀门名称: " + name);
}
// 通过名称获取 int 值
public static Integer getTypeByName(String name) {
FanStatusType valveType = fromName(name);
return valveType.getType();
}
}

49
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/enums/ValveType.java

@ -0,0 +1,49 @@
package cc.admin.modules.dust.enums;
import lombok.Getter;
@Getter
public enum ValveType {
LIFTING_VALVE(0, "升关阀"),
REGULATING_VALVE(1, "调节阀");
private final int type;
private final String name;
ValveType(int type, String name) {
this.type = type;
this.name = name;
}
// 通过 int 值获取枚举实例
public static ValveType fromType(int type) {
for (ValveType valveType : ValveType.values()) {
if (valveType.getType() == type) {
return valveType;
}
}
throw new IllegalArgumentException("未知的阀门类型: " + type);
}
// 通过 int 值获取名称
public static String getNameByType(int type) {
ValveType valveType = fromType(type);
return valveType.getName();
}
// 通过名称获取枚举实例
public static ValveType fromName(String name) {
for (ValveType valveType : ValveType.values()) {
if (valveType.getName().equals(name)) {
return valveType;
}
}
throw new IllegalArgumentException("未知的阀门名称: " + name);
}
// 通过名称获取 int 值
public static Integer getTypeByName(String name) {
ValveType valveType = fromName(name);
return valveType.getType();
}
}

14
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DesignPlanMapper.java

@ -0,0 +1,14 @@
package cc.admin.modules.dust.mapper;
import cc.admin.modules.dust.entity.DesignPlan;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 设计方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface DesignPlanMapper extends BaseMapper<DesignPlan> {
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustAlarmMapper.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cc.admin.modules.dust.entity.DustAlarm;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 警报记录表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface DustAlarmMapper extends BaseMapper<DustAlarm> {
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustDataTagMapper.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cc.admin.modules.dust.entity.DustDataTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 数据点位表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface DustDataTagMapper extends BaseMapper<DustDataTag> {
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustMonitorItemMapper.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cc.admin.modules.dust.entity.DustMonitorItem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 大屏监控项表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface DustMonitorItemMapper extends BaseMapper<DustMonitorItem> {
}

18
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustMonitorValveMapper.java

@ -0,0 +1,18 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cc.admin.modules.dust.entity.DustMonitorValve;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 大屏阀门监控表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface DustMonitorValveMapper extends BaseMapper<DustMonitorValve> {
List<DustMonitorValve> valveList();
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustSystemMapper.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cc.admin.modules.dust.entity.DustSystem;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 除尘系统表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface DustSystemMapper extends BaseMapper<DustSystem> {
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/DustValveMapper.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import cc.admin.modules.dust.entity.DustValve;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 阀门表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface DustValveMapper extends BaseMapper<DustValve> {
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/PipeDiameterThicknessMapper.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import cc.admin.modules.dust.entity.PipeDiameterThickness;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 管径壁厚对应表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface PipeDiameterThicknessMapper extends BaseMapper<PipeDiameterThickness> {
}

21
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/PipeMapper.java

@ -0,0 +1,21 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import cc.admin.modules.dust.entity.Pipe;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 管道表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface PipeMapper extends BaseMapper<Pipe> {
void delByDesignPlanId(String id);
}

21
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/RecommendPlanMapper.java

@ -0,0 +1,21 @@
package cc.admin.modules.dust.mapper;
import java.util.List;
import cc.admin.modules.dust.entity.RecommendPlan;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @Description: 推荐方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface RecommendPlanMapper extends BaseMapper<RecommendPlan> {
void deleteByDesignPlanId(String designPlanId);
}

18
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/WindSpeedColorMapper.java

@ -0,0 +1,18 @@
package cc.admin.modules.dust.mapper;
import cc.admin.modules.dust.entity.WindSpeedColor;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* @Description: 风速颜色表
* @Author: cc-admin
* @Date: 2025-01-09
* @Version: V1.0.0
*/
public interface WindSpeedColorMapper extends BaseMapper<WindSpeedColor> {
}

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DesignPlanMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DesignPlanMapper">
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustAlarmMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DustAlarmMapper">
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustDataTagMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DustDataTagMapper">
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustMonitorItemMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DustMonitorItemMapper">
</mapper>

11
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustMonitorValveMapper.xml

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DustMonitorValveMapper">
<select id="valveList" resultType="cc.admin.modules.dust.entity.DustMonitorValve">
select d.*,v.system_id from dust_monitor_valve d
left join dust_valve
v on d.valve_id = v.id
where d.del_flag = 0
</select>
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustSystemMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DustSystemMapper">
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/DustValveMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.DustValveMapper">
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/PipeDiameterThicknessMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.PipeDiameterThicknessMapper">
</mapper>

7
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/PipeMapper.xml

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.PipeMapper">
<delete id="delByDesignPlanId">
delete from pipe where design_plan_id = #{designPlanId}
</delete>
</mapper>

10
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/RecommendPlanMapper.xml

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.dust.mapper.RecommendPlanMapper">
<delete id="deleteByDesignPlanId">
delete from recommend_plan
WHERE design_plan_id = #{designPlanId}
</delete>
</mapper>

5
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/mapper/xml/WindSpeedColorMapper.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.admin.modules.wind.mapper.WindSpeedColorMapper">
</mapper>

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/po/DustQuery.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.po;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class DustQuery {
/**推荐方案id*/
private String designPlanId;
private List<Pipe> list;
}

16
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDesignPlanService.java

@ -0,0 +1,16 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DesignPlan;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 设计方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface IDesignPlanService extends IService<DesignPlan> {
void copy(DesignPlan designPlan,String name);
}

14
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustAlarmService.java

@ -0,0 +1,14 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DustAlarm;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 警报记录表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface IDustAlarmService extends IService<DustAlarm> {
}

14
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustDataTagService.java

@ -0,0 +1,14 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DustDataTag;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 数据点位表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface IDustDataTagService extends IService<DustDataTag> {
}

14
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustMonitorItemService.java

@ -0,0 +1,14 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DustMonitorItem;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 大屏监控项表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface IDustMonitorItemService extends IService<DustMonitorItem> {
}

18
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustMonitorValveService.java

@ -0,0 +1,18 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DustMonitorValve;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 大屏阀门监控表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface IDustMonitorValveService extends IService<DustMonitorValve> {
List<DustMonitorValve> valveList();
}

14
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustSystemService.java

@ -0,0 +1,14 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DustSystem;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 除尘系统表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface IDustSystemService extends IService<DustSystem> {
}

14
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IDustValveService.java

@ -0,0 +1,14 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.DustValve;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 阀门表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
public interface IDustValveService extends IService<DustValve> {
}

17
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IPipeDiameterThicknessService.java

@ -0,0 +1,17 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.PipeDiameterThickness;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
/**
* @Description: 管径壁厚对应表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface IPipeDiameterThicknessService extends IService<PipeDiameterThickness> {
}

27
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IPipeService.java

@ -0,0 +1,27 @@
package cc.admin.modules.dust.service;
import cc.admin.common.api.vo.Result;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.modules.dust.vo.DustConfigVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 管道表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface IPipeService extends IService<Pipe> {
Result<?> importList(List<DustConfigVo> configVoList, List<String> errorList,String designPlanId);
void delByDesignPlanId(String id);
void savePipe(Pipe pipe);
void updatePipe(Pipe pipe);
void remove(String id);
}

20
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IRecommendPlanService.java

@ -0,0 +1,20 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.RecommendPlan;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @Description: 推荐方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
public interface IRecommendPlanService extends IService<RecommendPlan> {
void deleteByDesignPlanId(String designPlanId);
}

15
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/IWindSpeedColorService.java

@ -0,0 +1,15 @@
package cc.admin.modules.dust.service;
import cc.admin.modules.dust.entity.WindSpeedColor;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @Description: 风速颜色表
* @Author: cc-admin
* @Date: 2025-01-09
* @Version: V1.0.0
*/
public interface IWindSpeedColorService extends IService<WindSpeedColor> {
}

114
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DesignPlanServiceImpl.java

@ -0,0 +1,114 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DesignPlan;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.modules.dust.mapper.DesignPlanMapper;
import cc.admin.modules.dust.service.IDesignPlanService;
import cc.admin.modules.dust.service.IPipeService;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: 设计方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Service
public class DesignPlanServiceImpl extends ServiceImpl<DesignPlanMapper, DesignPlan> implements IDesignPlanService {
@Autowired
private IPipeService iPipeService;
@Override
@Transactional(rollbackFor = Exception.class)
public void copy(DesignPlan designPlan, String name) {
QueryWrapper<Pipe> objectQueryWrapper = new QueryWrapper<>();
objectQueryWrapper.eq("design_plan_id", designPlan.getId());
List<Pipe> list = iPipeService.list(objectQueryWrapper);
String id = IdUtil.fastUUID();
designPlan.setId(id);
designPlan.setName(name);
save(designPlan);
List<Pipe> pipeTree = buildPipeTree(list,id);
if (CollectionUtils.isNotEmpty(pipeTree)) {
// 递归更新所有管道
updatePipeTree(pipeTree, null); // null 表示根管道没有父管道 ID
List<Pipe> updatedList = new ArrayList<>();
flattenPipeTree(pipeTree, updatedList);
iPipeService.saveBatch(updatedList);
}
}
private void updatePipeTree(List<Pipe> pipes, String parentId) {
for (Pipe pipe : pipes) {
// 生成新的管道 ID
String newPipeId = IdUtil.fastUUID();
pipe.setId(newPipeId);
// 设置父管道的 ID
pipe.setParentId(parentId); // 当前管道的父管道 ID
// 如果当前管道有子管道,递归处理子管道
if (pipe.getChildren() != null && !pipe.getChildren().isEmpty()) {
updatePipeTree(pipe.getChildren(), newPipeId); // 递归更新子管道
}
}
}
private List<Pipe> buildPipeTree(List<Pipe> allPipes,String id) {
Map<String, Pipe> pipeMap = new HashMap<>();
List<Pipe> rootPipes = new ArrayList<>();
// 创建一个管道 Map,用于快速查找
for (Pipe pipe : allPipes) {
pipeMap.put(pipe.getId(), pipe);
}
// 处理每个管道,构建父子关系
for (Pipe pipe : allPipes) {
pipe.setCreateTime(new Date());
pipe.setDesignPlanId(id);
if (StringUtils.isEmpty(pipe.getParentId())) {
// 如果是根管道,直接加入根管道列表
rootPipes.add(pipe);
} else {
// 如果是子管道,将其加入父管道的 children 列表
Pipe parentPipe = pipeMap.get(pipe.getParentId());
if (parentPipe != null) {
if (parentPipe.getChildren() == null) {
parentPipe.setChildren(new ArrayList<>()); // 初始化 children
}
parentPipe.getChildren().add(pipe);
}
}
}
return rootPipes;
}
// 递归将树状结构扁平化为平铺列表
private void flattenPipeTree(List<Pipe> pipeTree, List<Pipe> flatList) {
for (Pipe pipe : pipeTree) {
flatList.add(pipe); // 将当前管道添加到平铺列表
if (pipe.getChildren() != null && !pipe.getChildren().isEmpty()) {
flattenPipeTree(pipe.getChildren(), flatList); // 递归扁平化子管道
}
}
}
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustAlarmServiceImpl.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DustAlarm;
import cc.admin.modules.dust.mapper.DustAlarmMapper;
import cc.admin.modules.dust.service.IDustAlarmService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 警报记录表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Service
public class DustAlarmServiceImpl extends ServiceImpl<DustAlarmMapper, DustAlarm> implements IDustAlarmService {
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustDataTagServiceImpl.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DustDataTag;
import cc.admin.modules.dust.mapper.DustDataTagMapper;
import cc.admin.modules.dust.service.IDustDataTagService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 数据点位表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Service
public class DustDataTagServiceImpl extends ServiceImpl<DustDataTagMapper, DustDataTag> implements IDustDataTagService {
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustMonitorItemServiceImpl.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DustMonitorItem;
import cc.admin.modules.dust.mapper.DustMonitorItemMapper;
import cc.admin.modules.dust.service.IDustMonitorItemService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 大屏监控项表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Service
public class DustMonitorItemServiceImpl extends ServiceImpl<DustMonitorItemMapper, DustMonitorItem> implements IDustMonitorItemService {
}

29
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustMonitorValveServiceImpl.java

@ -0,0 +1,29 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DustMonitorValve;
import cc.admin.modules.dust.mapper.DustMonitorValveMapper;
import cc.admin.modules.dust.service.IDustMonitorValveService;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource;
import java.util.List;
/**
* @Description: 大屏阀门监控表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Service
public class DustMonitorValveServiceImpl extends ServiceImpl<DustMonitorValveMapper, DustMonitorValve> implements IDustMonitorValveService {
@Resource
private DustMonitorValveMapper dustMonitorValveMapper;
@Override
public List<DustMonitorValve> valveList() {
return dustMonitorValveMapper.valveList();
}
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustSystemServiceImpl.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DustSystem;
import cc.admin.modules.dust.mapper.DustSystemMapper;
import cc.admin.modules.dust.service.IDustSystemService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 除尘系统表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Service
public class DustSystemServiceImpl extends ServiceImpl<DustSystemMapper, DustSystem> implements IDustSystemService {
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/DustValveServiceImpl.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.DustValve;
import cc.admin.modules.dust.mapper.DustValveMapper;
import cc.admin.modules.dust.service.IDustValveService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 阀门表
* @Author: cc-admin
* @Date: 2025-03-27
* @Version: V1.0.0
*/
@Service
public class DustValveServiceImpl extends ServiceImpl<DustValveMapper, DustValve> implements IDustValveService {
}

25
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/PipeDiameterThicknessServiceImpl.java

@ -0,0 +1,25 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.PipeDiameterThickness;
import cc.admin.modules.dust.mapper.PipeDiameterThicknessMapper;
import cc.admin.modules.dust.service.IPipeDiameterThicknessService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.math.BigDecimal;
/**
* @Description: 管径壁厚对应表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Service
public class PipeDiameterThicknessServiceImpl extends ServiceImpl<PipeDiameterThicknessMapper, PipeDiameterThickness> implements IPipeDiameterThicknessService {
}

166
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/PipeServiceImpl.java

@ -0,0 +1,166 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.common.api.vo.Result;
import cc.admin.common.sys.vo.LoginUser;
import cc.admin.modules.dust.entity.DesignPlan;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.modules.dust.mapper.PipeMapper;
import cc.admin.modules.dust.service.IDesignPlanService;
import cc.admin.modules.dust.service.IPipeService;
import cc.admin.modules.dust.service.IRecommendPlanService;
import cc.admin.modules.dust.vo.DustConfigVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description: 管道表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Service
public class PipeServiceImpl extends ServiceImpl<PipeMapper, Pipe> implements IPipeService {
@Resource
private IDesignPlanService designPlanService;
@Resource
private PipeMapper pipeMapper;
@Autowired
private IRecommendPlanService iRecommendPlanService;
@Override
@Transactional(rollbackFor = Exception.class)
public Result<?> importList(List<DustConfigVo> configVoList, List<String> errorList, String designPlanId) {
DesignPlan one = designPlanService.getById(designPlanId);
if (null == one) {
return Result.error("推荐方案不能为空");
} else {
pipeMapper.delByDesignPlanId(one.getId());
}
Date currentTime = new Date();
// 1. 根据 serialNumber 排序,确保父节点在前,子节点在后
configVoList.sort(Comparator.comparing(DustConfigVo::getSerialNumber));
// 2. 建立 serialNumber 与 Pipe ID 的映射
Map<String, String> serialToIdMap = new HashMap<>();
Pipe pipe1 = new Pipe();
// 3. 创建 Pipe 对象列表
List<Pipe> pipesToSave = new ArrayList<>();
for (DustConfigVo vo : configVoList) {
Pipe pipe = new Pipe();
BeanUtils.copyProperties(vo, pipe);
pipe.setId(vo.getId()); // 生成唯一 ID
pipe.setDesignPlanId(one.getId());
pipe.setCreateTime(currentTime);
pipe.setName(vo.getPipeName());
pipe.setValveOpening(vo.getValveOpening());
if ("0".equals(vo.getSerialNumber())){
pipe1.setParentId(pipe.getId());
}
if (vo.getSerialNumber().matches("^\\d+$")) { // 只允许整数,不允许小数或其他形式
pipe.setParentId(pipe1.getParentId()); // 如果是整数,则设置父节点
}
// 设置 parentId
String parentSerial = getParentSerial(vo.getSerialNumber());
if (parentSerial != null) {
String parentId = serialToIdMap.get(parentSerial);
if (parentId != null && !parentId.equals(vo.getId())) {
pipe.setParentId(parentId);
} else {
if (!"0".equals(vo.getSerialNumber())){
throw new IllegalArgumentException("Parent ID not found for parent serial: " + parentSerial);
}
}
} else {
if ("0".equals(vo.getSerialNumber())) { // 只允许整数,不允许小数或其他形式
pipe.setParentId(null); // 如果是整数,则设置父节点
}
}
// 初始设置 isDustRemovalNode=false
pipe.setIsLeaf(0);
// 添加到列表
pipesToSave.add(pipe);
// 更新 serialToIdMap
serialToIdMap.put(vo.getSerialNumber(), pipe.getId());
}
// 4. 收集所有 Pipe 的 parentIds
Set<String> parentIds = pipesToSave.stream()
.map(Pipe::getParentId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
// 5. 遍历 Pipe 对象,标记没有子节点的为除尘节点
for (Pipe pipe : pipesToSave) {
if (!parentIds.contains(pipe.getId())) {
pipe.setIsLeaf(1);
}
}
// 批量保存所有 Pipe 对象
if (!pipesToSave.isEmpty()) {
saveBatch(pipesToSave);
}
return buildResult(pipesToSave, errorList);
}
private String getParentSerial(String serial) {
if (serial == null || !serial.contains(".")) {
return null;
}
int lastDotIndex = serial.lastIndexOf('.');
return serial.substring(0, lastDotIndex);
}
@Override
public void delByDesignPlanId(String id) {
pipeMapper.delByDesignPlanId(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void savePipe(Pipe pipe) {
iRecommendPlanService.deleteByDesignPlanId(pipe.getDesignPlanId());
save(pipe);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updatePipe(Pipe pipe) {
Pipe byId = getById(pipe.getId());
if (byId.getIsLeaf().equals(1)) {
iRecommendPlanService.deleteByDesignPlanId(byId.getDesignPlanId());
}
updateById(pipe);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void remove(String id) {
Pipe pipe = getById(id);
iRecommendPlanService.deleteByDesignPlanId(pipe.getDesignPlanId());
removeById(pipe.getId());
}
private Result buildResult(List<Pipe> importList, List<String> errorList) {
String message = String.format("导入成功 %d 条!", importList.size());
if (!errorList.isEmpty()) {
message += String.format("但存在错误,共 %d 条。错误详情:%s", errorList.size(), String.join(", ", errorList));
}
return importList.isEmpty() ? Result.error(message) : Result.ok(message);
}
}

36
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/RecommendPlanServiceImpl.java

@ -0,0 +1,36 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.RecommendPlan;
import cc.admin.modules.dust.mapper.RecommendPlanMapper;
import cc.admin.modules.dust.service.IRecommendPlanService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.hibernate.validator.constraints.pl.REGON;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource;
import java.util.List;
/**
* @Description: 推荐方案表
* @Author: cc-admin
* @Date: 2024-12-06
* @Version: V1.0.0
*/
@Service
public class RecommendPlanServiceImpl extends ServiceImpl<RecommendPlanMapper, RecommendPlan> implements IRecommendPlanService {
@Resource
private RecommendPlanMapper recommendPlanMapper;
@Override
public void deleteByDesignPlanId(String designPlanId) {
recommendPlanMapper.deleteByDesignPlanId(designPlanId);
}
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/service/impl/WindSpeedColorServiceImpl.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.service.impl;
import cc.admin.modules.dust.entity.WindSpeedColor;
import cc.admin.modules.dust.mapper.WindSpeedColorMapper;
import cc.admin.modules.dust.service.IWindSpeedColorService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
/**
* @Description: 风速颜色表
* @Author: cc-admin
* @Date: 2025-01-09
* @Version: V1.0.0
*/
@Service
public class WindSpeedColorServiceImpl extends ServiceImpl<WindSpeedColorMapper, WindSpeedColor> implements IWindSpeedColorService {
}

23
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/BeanCopyUtil.java

@ -0,0 +1,23 @@
package cc.admin.modules.dust.utils;
import org.springframework.beans.BeanUtils;
import java.util.ArrayList;
import java.util.List;
public class BeanCopyUtil {
public static <S, T> List<T> copyList(List<S> sourceList, Class<T> targetClass) {
List<T> targetList = new ArrayList<>();
for (S source : sourceList) {
try {
T target = targetClass.newInstance(); // 创建目标对象实例
BeanUtils.copyProperties(source, target); // 复制属性
targetList.add(target);
} catch (Exception e) {
// 异常处理
e.printStackTrace();
}
}
return targetList;
}
}

131
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/ExcelUtil.java

@ -0,0 +1,131 @@
package cc.admin.modules.dust.utils;
import cc.admin.poi.util.HeaderCell;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.ss.usermodel.*;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
public class ExcelUtil {
public static Workbook getWorkbook(InputStream inputStream) throws IOException {
// 参数校验
if (inputStream == null) {
throw new IllegalArgumentException("输入流不能为空");
}
// 如果不支持 mark/reset,包装成 BufferedInputStream
InputStream bufferedInputStream = inputStream.markSupported()
? inputStream
: new BufferedInputStream(inputStream);
try {
// 尝试创建工作簿
return WorkbookFactory.create(bufferedInputStream);
} catch (EncryptedDocumentException e) {
throw new IOException("不支持加密的Excel文件", e);
} catch (Exception e) {
throw new IOException("无效的Excel文件格式", e);
}
}
public static String readCellAsString(Cell cell) {
if (cell == null) {
return null;
}
Object cellValue = null;
switch (cell.getCellType()) { //根据cell中的类型来读取数据
case NUMERIC:
cellValue = cell.getNumericCellValue();
break;
case STRING:
cellValue = cell.getStringCellValue();
break;
case BOOLEAN:
cellValue = cell.getBooleanCellValue();
break;
case FORMULA:
cellValue = cell.getCellFormula();
break;
case BLANK:
break;
default:
cellValue = "unsupported cell type: " + cell.getCellType();
break;
}
return (cellValue != null) ? cellValue.toString() : null;
}
public static Integer readCellAsInteger(Cell cell) {
String cellValue = readCellAsString(cell);
if (StrUtil.isNotEmpty(cellValue)) {
try {
if (cellValue.contains(".")) {
return (int) Double.parseDouble(cellValue);
} else {
return Integer.parseInt(cellValue);
}
} catch (Exception e) {
log.warn(e.getMessage());
}
}
return null;
}
public static Double readCellAsDouble(Cell cell) {
String cellValue = readCellAsString(cell);
if (StrUtil.isNotEmpty(cellValue)) {
try {
return Double.parseDouble(cellValue);
} catch (Exception e) {
log.warn(e.getMessage());
}
}
return null;
}
public static Date readCellAsDate(Cell cell, String format) {
String cellValue = readCellAsString(cell);
if (StrUtil.isNotEmpty(cellValue)) {
try {
return DateUtil.parse(cellValue, format);
} catch (Exception e) {
log.warn(e.getMessage());
}
}
return null;
}
public static void checkTableHeader(Sheet sheet, String sheetName, List<HeaderCell> headerCellList) {
Map<Integer, List<HeaderCell>> rowCellMap = headerCellList.stream().collect(Collectors.groupingBy(HeaderCell::getRow));
for (Integer row : rowCellMap.keySet()) {
List<HeaderCell> rowCellList = rowCellMap.get(row);
Row headerRow = sheet.getRow(row);
for (HeaderCell hc : rowCellList) {
String cellValue = readCellAsString(headerRow.getCell(hc.getColumn()));
if (cellValue == null || !cellValue.trim().equals(hc.getTitle())) {
throw new RuntimeException(String.format("%s 格式错误!%d 行 %d 列 %s != %s", sheetName, hc.getRow() + 1, hc.getColumn() + 1, cellValue, hc.getTitle()));
}
}
}
}
}

7
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/KeyUtils.java

@ -0,0 +1,7 @@
package cc.admin.modules.dust.utils;
public class KeyUtils {
public static String dustdataTag = "dustdataTag";
}

162
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/utils/RecommendPlanUtils.java

@ -0,0 +1,162 @@
package cc.admin.modules.dust.utils;
import cc.admin.modules.dust.entity.Pipe;
import cc.admin.modules.dust.entity.RecommendPlan;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class RecommendPlanUtils {
public static List<RecommendPlan> generateCombinations(List<Pipe> pipes, double minSpeed, double minRate, Set<Integer> comb) throws IOException {
int numRes = 10;
List<Double> areas = pipes.stream()
.map(pipe -> {
double diameter = pipe.getDiameter();
if (null != pipe.getComputeDiameter()) {
diameter = pipe.getComputeDiameter();
}
return (Math.PI * Math.pow(diameter / 1000.0, 2.0) / 4.0) * 3600.0; // 面积计算公式
})
.collect(Collectors.toList());
double minF = minSpeed * areas.get(areas.size() - 1);
List<Double> valves = Arrays.asList(minRate, 1.0);
comb = new TreeSet<>(comb); // Ensure comb is sorted
List<List<Object>> mmArr = new ArrayList<>();
List<List<Object>> mArr = new ArrayList<>();
mArr.add(Arrays.asList(new ArrayList<>(), 0.0, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY));
for (int k = 0; k < pipes.size(); k++) {
mmArr = new ArrayList<>(mArr);
mArr.clear();
double minFF = Double.POSITIVE_INFINITY;
List<Integer> minFS = new ArrayList<>();
if (k < comb.iterator().next()) { // 你原来是用 comb.get(0),Set 中没有索引
for (List<Object> item : mmArr) {
List<Double> ar = (List<Double>) item.get(0);
double flow = (Double) item.get(1);
double vmax = (Double) item.get(2);
double vmin = (Double) item.get(3);
int numOnes = 0;
for (Double value : ar) {
if (value == 1.0) {
numOnes++;
}
}
for (double valve : valves) {
double mFlow = flow + valve * pipes.get(k).getFlow(); // 假设 df 是一个简单的 List<Double>,你需要根据实际情况调整
double mSpeed = mFlow / areas.get(k);
if (numOnes > 0 || valve > minRate) {
if (mSpeed >= minSpeed) {
mArr.add(Arrays.asList(new ArrayList<Object>(ar) {{
add(valve); }}, mFlow,
Math.max(mSpeed, vmax),
Math.min(mSpeed, vmin)));
}
} else {
mArr.add(Arrays.asList(new ArrayList<Object>(ar) {{
add(valve); }}, mFlow,
Math.max(mSpeed, vmax),
Math.min(mSpeed, vmin)));
}
}
}
} else {
if (comb.contains(k)) { // 使用 contains 检查 k 是否在 comb 中
double valve = valves.get(valves.size() - 1);
for (List<Object> item : mmArr) {
List<Double> ar = (List<Double>) item.get(0);
double flow = (Double) item.get(1);
double vmax = (Double) item.get(2);
double vmin = (Double) item.get(3);
double mFlow = flow + valve * pipes.get(k).getFlow(); // 假设 df 是一个简单的 List<Double>,你需要根据实际情况调整
double mSpeed = mFlow / areas.get(k);
if (mSpeed >= minSpeed) {
mArr.add(Arrays.asList(new ArrayList<Object>(ar) {{
add(valves.get(valves.size() - 1));}}, mFlow,
Math.max(mSpeed, vmax),
Math.min(mSpeed, vmin)));
}
}
} else {
for (List<Object> item : mmArr) {
List<Double> ar = (List<Double>) item.get(0);
double flow = (Double) item.get(1);
double vmax = (Double) item.get(2);
double vmin = (Double) item.get(3);
for (double valve : valves) {
double mFlow = flow + valve * pipes.get(k).getFlow(); // 假设 df 是一个简单的 List<Double>,你需要根据实际情况调整
double mSpeed = mFlow / areas.get(k);
if (mSpeed >= minSpeed) {
if (valve == valves.get(0)) {
if (mFlow >= minF) {
if (mFlow <= minFF) {
mArr.add(Arrays.asList(new ArrayList<Object>(ar) {{
add(valve); }}, mFlow,
Math.max(mSpeed, vmax),
Math.min(mSpeed, vmin)));
minFF = mFlow;
minFS.add(mArr.size() - 1);
}
}
}
//mArr.add(new ArrayList<>(Arrays.asList(ar.add(valve), mFlow, Math.max(mSpeed, vmax), Math.min(mSpeed, vmin))));
mArr.add(Arrays.asList(new ArrayList<Object>(ar) {{
add(valve); }}, mFlow,
Math.max(mSpeed, vmax),
Math.min(mSpeed, vmin)));
}
}
}
for (int ind : minFS) {
if ((double) mArr.get(ind).get(1) > minFF) {
mArr.remove(ind);
}
}
}
}
}
// Sort and select results
mArr.sort(Comparator.comparing((List<Object> item) -> (Double) item.get(1))
.thenComparing(item -> Math.abs((Double) item.get(2)))
.thenComparing(item -> (Double) item.get(3)));
List<RecommendPlan> recommendPlans = new ArrayList<>();
for (int i = 0; i < Math.min(numRes, mArr.size()); i++) {
List<Object> ar = mArr.get(i);
RecommendPlan plan = new RecommendPlan();
List<Integer> matchingIndexes = IntStream.range(0, ((List<Object>) ar.get(0)).size())
.filter(a -> ((List<Object>) ar.get(0)).get(a).equals(1.0)) // 查找值为 1.0 的元素
.boxed() // 将原始的 int 转为 Integer 类型
.collect(Collectors.toList());
String pipeIds = matchingIndexes.stream()
.map(b -> pipes.get(b).getId()) // 使用下标获取对应的 Pipe id
.collect(Collectors.joining(","));
plan.setPipeConfig(pipeIds);
plan.setFlow((Double) ar.get(1));
plan.setMaxSpeed((Double) ar.get(2));
plan.setMinSpeed((Double) ar.get(3));
recommendPlans.add(plan);
}
return recommendPlans;
}
}

19
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/CombinationResult.java

@ -0,0 +1,19 @@
package cc.admin.modules.dust.vo;
import lombok.Data;
import java.util.List;
@Data
public class CombinationResult {
double mainFlow;
double minSpeed;
double maxSpeed;
List<String> setNames;
public CombinationResult(double mainFlow, double minSpeed, double maxSpeed, List<String> setNames) {
this.mainFlow = mainFlow;
this.minSpeed = minSpeed;
this.maxSpeed = maxSpeed;
this.setNames = setNames;
}
}

20
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DataTagExcel.java

@ -0,0 +1,20 @@
package cc.admin.modules.dust.vo;
import cc.admin.poi.excel.annotation.Excel;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DataTagExcel {
/**名称*/
@ExcelProperty(value = "名称")
private String name;
@ExcelProperty(value = "所属系统")
private String systemName;
/**数据点位*/
@ExcelProperty(value = "数据点位")
private String dataTag;
}

31
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DataTagPair.java

@ -0,0 +1,31 @@
package cc.admin.modules.dust.vo;
import lombok.Data;
@Data
public class DataTagPair {
private String tagId;
private String description;
public DataTagPair(String tagId, String description) {
this.tagId = tagId;
this.description = description;
}
public String getTagId() {
return tagId;
}
public void setTagId(String tagId) {
this.tagId = tagId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

28
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DataValveExcel.java

@ -0,0 +1,28 @@
package cc.admin.modules.dust.vo;
import cc.admin.poi.excel.annotation.Excel;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DataValveExcel {
@ExcelProperty(value = "所属系统")
private String systemName;
@ExcelProperty(value = "所属点位")
private String dataTag;
@ExcelProperty(value = "阀门")
private String name;
@ExcelProperty(value = "类型")
private String typeName;
@ExcelProperty(value = "除尘部位")
private String location;
@ExcelProperty(value = "阀门参数")
private String parameter;
}

38
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustConfigVo.java

@ -0,0 +1,38 @@
package cc.admin.modules.dust.vo;
import cc.admin.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DustConfigVo {
private String id;
@ApiModelProperty(value = "序号")
private String serialNumber;
@ApiModelProperty(value = "计划方案id")
private String designPlanId;
@ApiModelProperty(value = "父管道名称")
private String parentName;
@ApiModelProperty(value = "子管道名称")
private String pipeName;
@ApiModelProperty(value = "设计风量")
private double flow;
@ApiModelProperty(value = "除尘节点")
private Integer isLeaf;
@ApiModelProperty(value = "是否加入推荐方案计算(0-否,1-是)")
private Integer isCompute;
@ApiModelProperty(value = "阀门开度")
private double valveOpening;
@ApiModelProperty(value = "编号")
private Integer sortOrder;
@ApiModelProperty(value = "备注")
private String remark;
}

13
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustData.java

@ -0,0 +1,13 @@
package cc.admin.modules.dust.vo;
import lombok.Data;
import java.util.List;
@Data
public class DustData {
private String id;
private double flow;
private double diameter;
}

20
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustDesignPianExcelVo.java

@ -0,0 +1,20 @@
package cc.admin.modules.dust.vo;
import cc.admin.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DustDesignPianExcelVo {
@Excel(name = "推荐方案名称", width = 15)
private String designPlanName;
@Excel(name = "管道名称", width = 15)
@ApiModelProperty(value = "管道ID(关联pipe)")
private String pipeName;
/**节点阀门打开度(%)*/
@Excel(name = "节点阀门打开度", width = 15)
@ApiModelProperty(value = "节点阀门打开度(%)")
private Double valveOpening;
}

33
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustMonitorItemExcel.java

@ -0,0 +1,33 @@
package cc.admin.modules.dust.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DustMonitorItemExcel {
@ExcelProperty(value = "所属系统")
private String systemName;
@ExcelProperty(value = "除尘器进口压力")
private String inletPressureDataTagName;
@ExcelProperty(value = "除尘器出口压力")
private String outletPressureDataTagName;
@ExcelProperty(value = "风机速度")
private String fanSpeedDataTagName;
@ExcelProperty(value = "电机电流")
private String motorCurrentDataTagName;
@ExcelProperty(value = "烟囱CEMS风量")
private String cemsAirVolumeDataTagName;
@ExcelProperty(value = "粉尘浓度")
private String dustConcentrationDataTagName;
@ExcelProperty(value = "风机运行状态")
private String fanStatusDataTagStatusName;
}

42
cc-admin-api/dust/src/main/java/cc/admin/modules/dust/vo/DustMonitorItemVo.java

@ -0,0 +1,42 @@
package cc.admin.modules.dust.vo;
import cc.admin.poi.excel.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class DustMonitorItemVo {
@ApiModelProperty(value = "所属系统")
private String systemId;
@ApiModelProperty(value = "除尘器进口压力")
private String inletPressureDataTagId;
private Double inletPressureDataTagValue;
@ApiModelProperty(value = "除尘器出口压力")
private String outletPressureDataTagId;
private Double outletPressureDataTagValue;
@ApiModelProperty(value = "除尘器进出口压差(pa)")
private Double pressureDifference;
@ApiModelProperty(value = "风机速度")
private String fanSpeedDataTagId;
private Double fanSpeedDataTagValue;
@ApiModelProperty(value = "电机电流")
private String motorCurrentDataTagId;
private Double motorCurrentDataTagValue;
@ApiModelProperty(value = "烟囱CEMS风量")
private String cemsAirVolumeDataTagId;
private Double cemsAirVolumeDataTagValue;
@ApiModelProperty(value = "粉尘浓度")
private String dustConcentrationDataTagId;
private Double dustConcentrationDataTagValue;
@ApiModelProperty(value = "风机运行状态")
private String fanStatusDataTagId;
private Integer fanStatusDataTagStatus;
}

15
scripts/mxserver/ini.js

@ -0,0 +1,15 @@
function MxINI() {
this.uploadPath = "./public/file/";
this.mxbinPath = "../../Release/";
this.linux = false;
this.serverPort = 1337;
this.accessControlAllowOrigin = "*";
this.mxcad={
uploadPath: "./public/mxcad/file/",
mxbinPath:"../../MxCAD/Release/"
};
this.enable_gis_map_download = true;
this.file_ext_name = "mxweb";
};
var mxIni = new MxINI();
module.exports = mxIni;

55
scripts/mxserver/logs/log.js

@ -0,0 +1,55 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Mxlog = void 0;
let log4js = require('log4js');
log4js.configure({
appenders: [
{
type: 'console',
category: "console"
},
{
type: "dateFile",
filename: 'logs/',
pattern: "yyyyMMdd.txt",
alwaysIncludePattern: true,
//category: 'console'
} //�����ļ���ʽ
],
replaceConsole: true,
levels: {
MXINFO: 'info',
MXERROR: 'error',
MXWARN: 'warn',
MXDEBUG: 'debug',
}
});
var log_info = log4js.getLogger('MXINFO');
class Mxlog {
constructor(log4js) {
this.log_info = log4js.getLogger('MXLOG');
this.log_error = log4js.getLogger('MXERROR');
this.log_warn = log4js.getLogger('MXWARN');
this.log_debug = log4js.getLogger('MXDEBUG');
}
error(obj) {
this.log_error.error(obj);
}
warn(obj) {
this.log_warn.warn(obj);
}
info(obj) {
this.log_info.info(obj);
}
debug(obj) {
this.log_debug.debug(obj);
}
use(app) {
//ҳ��������־,��auto�Ļ�,Ĭ�ϼ�����WARN
app.use(log4js.connectLogger(log_info, { level: 'auto', format: ':method :url' }));
//app.use(log4js.connectLogger(log_info, { level: 'debug', format: ':method :url' }));
}
}
exports.Mxlog = Mxlog;
exports.default = new Mxlog(log4js);
//# sourceMappingURL=log.js.map

28
scripts/mxserver/node_modules/.bin/acorn.ps1

@ -0,0 +1,28 @@
#!/usr/bin/env pwsh
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
$exe=""
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
# Fix case when both the Windows and Linux builds of Node
# are installed in the same directory
$exe=".exe"
}
$ret=0
if (Test-Path "$basedir/node$exe") {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args
} else {
& "$basedir/node$exe" "$basedir/../acorn/bin/acorn" $args
}
$ret=$LASTEXITCODE
} else {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "node$exe" "$basedir/../acorn/bin/acorn" $args
} else {
& "node$exe" "$basedir/../acorn/bin/acorn" $args
}
$ret=$LASTEXITCODE
}
exit $ret

12
scripts/mxserver/node_modules/.bin/babylon

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../babylon/bin/babylon.js" "$@"
else
exec node "$basedir/../babylon/bin/babylon.js" "$@"
fi

12
scripts/mxserver/node_modules/.bin/ejs

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../ejs/bin/cli.js" "$@"
else
exec node "$basedir/../ejs/bin/cli.js" "$@"
fi

28
scripts/mxserver/node_modules/.bin/jake.ps1

@ -0,0 +1,28 @@
#!/usr/bin/env pwsh
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
$exe=""
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
# Fix case when both the Windows and Linux builds of Node
# are installed in the same directory
$exe=".exe"
}
$ret=0
if (Test-Path "$basedir/node$exe") {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "$basedir/node$exe" "$basedir/../jake/bin/cli.js" $args
} else {
& "$basedir/node$exe" "$basedir/../jake/bin/cli.js" $args
}
$ret=$LASTEXITCODE
} else {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "node$exe" "$basedir/../jake/bin/cli.js" $args
} else {
& "node$exe" "$basedir/../jake/bin/cli.js" $args
}
$ret=$LASTEXITCODE
}
exit $ret

12
scripts/mxserver/node_modules/.bin/js-yaml

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../js-yaml/bin/js-yaml.js" "$@"
else
exec node "$basedir/../js-yaml/bin/js-yaml.js" "$@"
fi

17
scripts/mxserver/node_modules/.bin/node-which.cmd

@ -0,0 +1,17 @@
@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0
IF EXIST "%dp0%\node.exe" (
SET "_prog=%dp0%\node.exe"
) ELSE (
SET "_prog=node"
SET PATHEXT=%PATHEXT:;.JS;=;%
)
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\which\bin\node-which" %*

17
scripts/mxserver/node_modules/.bin/rimraf.cmd

@ -0,0 +1,17 @@
@ECHO off
GOTO start
:find_dp0
SET dp0=%~dp0
EXIT /b
:start
SETLOCAL
CALL :find_dp0
IF EXIST "%dp0%\node.exe" (
SET "_prog=%dp0%\node.exe"
) ELSE (
SET "_prog=node"
SET PATHEXT=%PATHEXT:;.JS;=;%
)
endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%" "%dp0%\..\rimraf\bin.js" %*

28
scripts/mxserver/node_modules/.bin/rimraf.ps1

@ -0,0 +1,28 @@
#!/usr/bin/env pwsh
$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
$exe=""
if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
# Fix case when both the Windows and Linux builds of Node
# are installed in the same directory
$exe=".exe"
}
$ret=0
if (Test-Path "$basedir/node$exe") {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "$basedir/node$exe" "$basedir/../rimraf/bin.js" $args
} else {
& "$basedir/node$exe" "$basedir/../rimraf/bin.js" $args
}
$ret=$LASTEXITCODE
} else {
# Support pipeline input
if ($MyInvocation.ExpectingInput) {
$input | & "node$exe" "$basedir/../rimraf/bin.js" $args
} else {
& "node$exe" "$basedir/../rimraf/bin.js" $args
}
$ret=$LASTEXITCODE
}
exit $ret

12
scripts/mxserver/node_modules/.bin/sshpk-conv

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../sshpk/bin/sshpk-conv" "$@"
else
exec node "$basedir/../sshpk/bin/sshpk-conv" "$@"
fi

12
scripts/mxserver/node_modules/.bin/sshpk-verify

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../sshpk/bin/sshpk-verify" "$@"
else
exec node "$basedir/../sshpk/bin/sshpk-verify" "$@"
fi

12
scripts/mxserver/node_modules/.bin/tsc

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../typescript/bin/tsc" "$@"
else
exec node "$basedir/../typescript/bin/tsc" "$@"
fi

12
scripts/mxserver/node_modules/.bin/tsserver

@ -0,0 +1,12 @@
#!/bin/sh
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
case `uname` in
*CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
exec "$basedir/node" "$basedir/../typescript/bin/tsserver" "$@"
else
exec node "$basedir/../typescript/bin/tsserver" "$@"
fi

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save