From 6c252fe4dd2931fcdb2f5ec969ff8e622e76b00b Mon Sep 17 00:00:00 2001 From: dashixiong Date: Thu, 23 Apr 2026 17:37:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/BaiDuAipSpeechController.java | 18 +- .../sipai/controller/user/UserController.java | 5 +- ...WordAnalysisReportStructureController.java | 9 +- .../java/com/sipai/dao/scada/MPointDao.java | 2 +- .../com/sipai/service/work/CameraService.java | 9 +- src/main/java/com/sipai/tools/CameraCall.java | 59 +-- .../java/com/sipai/tools/UEditorUtil.java | 10 +- src/main/resources/db.properties | 8 +- src/main/resources/mpoint_search_mapping.json | 11 +- src/main/resources/mpoint_search_setting.json | 50 +- src/main/resources/redis.properties | 8 +- src/main/webapp/JS/commVisual.js | 2 +- 使用说明文档.md | 205 -------- 功能清单.xlsx | 191 -------- 功能清单详细版.xlsx | Bin 32235 -> 0 bytes 污水处理管理平台_v7.html | 459 ------------------ 16 files changed, 69 insertions(+), 977 deletions(-) delete mode 100644 使用说明文档.md delete mode 100644 功能清单.xlsx delete mode 100644 功能清单详细版.xlsx delete mode 100644 污水处理管理平台_v7.html diff --git a/src/main/java/com/sipai/controller/data/BaiDuAipSpeechController.java b/src/main/java/com/sipai/controller/data/BaiDuAipSpeechController.java index 32c4fb20..523d76e6 100644 --- a/src/main/java/com/sipai/controller/data/BaiDuAipSpeechController.java +++ b/src/main/java/com/sipai/controller/data/BaiDuAipSpeechController.java @@ -22,13 +22,13 @@ import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; -import sun.misc.BASE64Decoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; +import java.util.Base64; import java.util.HashMap; import java.util.List; @@ -92,15 +92,9 @@ public class BaiDuAipSpeechController { String type = request.getParameter("type"); String upfile_b64 = request.getParameter("upfile_b64"); - BASE64Decoder decoder = new BASE64Decoder(); try { //Base64解码 - byte[] b = decoder.decodeBuffer(upfile_b64); - for (int i = 0; i < b.length; ++i) { - if (b[i] < 0) {//调整异常数据 - b[i] += 256; - } - } + byte[] b = Base64.getMimeDecoder().decode(upfile_b64); String imgFilePath = "D:\\audio\\recorder.mp3"; File fileUploadPath = new File("D:\\audio"); if (!fileUploadPath.exists()) { @@ -129,15 +123,9 @@ public class BaiDuAipSpeechController { String type = request.getParameter("type"); String upfile_b64 = request.getParameter("upfile_b64"); - BASE64Decoder decoder = new BASE64Decoder(); try { //Base64解码 - byte[] b = decoder.decodeBuffer(upfile_b64); - for (int i = 0; i < b.length; ++i) { - if (b[i] < 0) {//调整异常数据 - b[i] += 256; - } - } + byte[] b = Base64.getMimeDecoder().decode(upfile_b64); String imgFilePath = "D:\\audio\\recorder.mp3"; File fileUploadPath = new File("D:\\audio"); if (!fileUploadPath.exists()) { diff --git a/src/main/java/com/sipai/controller/user/UserController.java b/src/main/java/com/sipai/controller/user/UserController.java index 7a737c9b..afc33351 100644 --- a/src/main/java/com/sipai/controller/user/UserController.java +++ b/src/main/java/com/sipai/controller/user/UserController.java @@ -30,7 +30,6 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; -import sun.misc.BASE64Encoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -41,6 +40,7 @@ import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Base64; import java.util.*; import java.util.stream.Collectors; @@ -593,8 +593,7 @@ public class UserController { in.read(data); in.close(); //将二进制字节用base64编码,以字符串方式存到数据库中 - BASE64Encoder encoder = new BASE64Encoder(); - String headPortrait = encoder.encode(data); + String headPortrait = Base64.getEncoder().encodeToString(data); User cu = (User) request.getSession().getAttribute("cu"); UserDetail userDetail = this.userDetailService.selectByUserId(cu.getId()); int res = 0; diff --git a/src/main/java/com/sipai/controller/work/WordAnalysisReportStructureController.java b/src/main/java/com/sipai/controller/work/WordAnalysisReportStructureController.java index d2854eec..6af59b02 100644 --- a/src/main/java/com/sipai/controller/work/WordAnalysisReportStructureController.java +++ b/src/main/java/com/sipai/controller/work/WordAnalysisReportStructureController.java @@ -18,7 +18,6 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import sun.misc.BASE64Decoder; import javax.annotation.Resource; import javax.script.ScriptEngine; @@ -32,6 +31,7 @@ import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.text.DecimalFormat; +import java.util.Base64; import java.util.List; @SuppressWarnings({"restriction", "unused"}) @@ -719,12 +719,7 @@ public class WordAnalysisReportStructureController { String id = strconts[0]; String img = strconts[2]; - byte[] b2 = new BASE64Decoder().decodeBuffer(img); - for (int i = 0; i < b2.length; ++i) { - if (b2[i] < 0) {// 调整异常数据 - b2[i] += 256; - } - } + byte[] b2 = Base64.getMimeDecoder().decode(img); // 生成png图片 String contextPath = request.getContextPath().replace("/", ""); String filepathSever = request.getSession().getServletContext().getRealPath(""); diff --git a/src/main/java/com/sipai/dao/scada/MPointDao.java b/src/main/java/com/sipai/dao/scada/MPointDao.java index ffbaefe9..d23cfde6 100644 --- a/src/main/java/com/sipai/dao/scada/MPointDao.java +++ b/src/main/java/com/sipai/dao/scada/MPointDao.java @@ -69,4 +69,4 @@ public class MPointDao extends CommDaoImpl{ paramMap.put("mpointcode",mpointcode); return this.getSqlSession().delete("scada.MPointMapper.updateLalarmmin", paramMap); } -} \ No newline at end of file +} diff --git a/src/main/java/com/sipai/service/work/CameraService.java b/src/main/java/com/sipai/service/work/CameraService.java index 90b51fe6..5d85c602 100644 --- a/src/main/java/com/sipai/service/work/CameraService.java +++ b/src/main/java/com/sipai/service/work/CameraService.java @@ -17,7 +17,6 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; -import sun.misc.BASE64Decoder; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; @@ -25,6 +24,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -584,12 +584,7 @@ public class CameraService implements CommService { // System.out.println(imgData); - byte[] b = new BASE64Decoder().decodeBuffer(imgData); - for (int i = 0; i < b.length; ++i) { - if (b[i] < 0) {// 调整异常数据 - b[i] += 256; - } - } + byte[] b = Base64.getMimeDecoder().decode(imgData); InputStream in = new ByteArrayInputStream(b); minioTemplate.makeBucket(nameSpace); minioTemplate.putObject(nameSpace, rid + "_" + filePath + ".jpg", in, null, null, null, contentType); diff --git a/src/main/java/com/sipai/tools/CameraCall.java b/src/main/java/com/sipai/tools/CameraCall.java index da829694..6735bb79 100644 --- a/src/main/java/com/sipai/tools/CameraCall.java +++ b/src/main/java/com/sipai/tools/CameraCall.java @@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory; import java.io.*; import java.nio.ByteBuffer; +import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; @@ -19,6 +20,7 @@ import java.util.logging.Logger; public class CameraCall { private static HCNetSDK2 hcNetSDK = HCNetSDK2.INSTANCE; private static org.slf4j.Logger logger = LoggerFactory.getLogger(CameraCall.class); + private static final Charset GBK = Charset.forName("GBK"); HCNetSDK2.NET_DVR_USER_LOGIN_INFO m_strLoginINFO = new HCNetSDK2.NET_DVR_USER_LOGIN_INFO(); //HCNetSDK2.NET_DVR_DEVICEINFO_V40 m_strDeviceInfo = new HCNetSDK2.NET_DVR_DEVICEINFO_V40(); static HCNetSDK2.NET_DVR_DEVICEINFO_V30 m_strDeviceInfo = new HCNetSDK2.NET_DVR_DEVICEINFO_V30(); @@ -493,17 +495,8 @@ public class CameraCall { Pointer pPlateInfo = strPlateResult.getPointer(); pPlateInfo.write(0, pAlarmInfo.getByteArray(0, strPlateResult.size()), 0, strPlateResult.size()); strPlateResult.read(); - try { - String srt3=new String(strPlateResult.struPlateInfo.sLicense,"GBK"); - sAlarmType = sAlarmType + ":交通抓拍上传,车牌:"+ srt3; - } - catch (UnsupportedEncodingException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + String plateNo=new String(strPlateResult.struPlateInfo.sLicense, GBK); + sAlarmType = sAlarmType + ":交通抓拍上传,车牌:"+ plateNo; //报警设备IP地址 sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); @@ -539,17 +532,8 @@ public class CameraCall { Pointer pItsPlateInfo = strItsPlateResult.getPointer(); pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, strItsPlateResult.size()), 0, strItsPlateResult.size()); strItsPlateResult.read(); - try { - String srt3=new String(strItsPlateResult.struPlateInfo.sLicense,"GBK"); - sAlarmType = sAlarmType + ",车辆类型:"+strItsPlateResult.byVehicleType + ",交通抓拍上传,车牌:"+ srt3; - } - catch (UnsupportedEncodingException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + String itsPlateNo=new String(strItsPlateResult.struPlateInfo.sLicense, GBK); + sAlarmType = sAlarmType + ",车辆类型:"+strItsPlateResult.byVehicleType + ",交通抓拍上传,车牌:"+ itsPlateNo; //报警设备IP地址 sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); @@ -626,19 +610,10 @@ public class CameraCall { Pointer pItsParkVehicle = strItsParkVehicle.getPointer(); pItsParkVehicle.write(0, pAlarmInfo.getByteArray(0, strItsParkVehicle.size()), 0, strItsParkVehicle.size()); strItsParkVehicle.read(); - try { - String srtParkingNo=new String(strItsParkVehicle.byParkingNo).trim(); //车位编号 - String srtPlate=new String(strItsParkVehicle.struPlateInfo.sLicense,"GBK").trim(); //车牌号码 - sAlarmType = sAlarmType + ",停产场数据,车位编号:"+ srtParkingNo + ",车位状态:" - + strItsParkVehicle.byLocationStatus+ ",车牌:"+ srtPlate; - } - catch (UnsupportedEncodingException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + String srtParkingNo=new String(strItsParkVehicle.byParkingNo).trim(); //车位编号 + String srtPlate2=new String(strItsParkVehicle.struPlateInfo.sLicense, GBK).trim(); //车牌号码 + sAlarmType = sAlarmType + ",停产场数据,车位编号:"+ srtParkingNo + ",车位状态:" + + strItsParkVehicle.byLocationStatus+ ",车牌:"+ srtPlate2; //报警设备IP地址 sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); @@ -679,15 +654,9 @@ public class CameraCall { pTFSInfo.write(0, pAlarmInfo.getByteArray(0, strTFSAlarmInfo.size()), 0, strTFSAlarmInfo.size()); strTFSAlarmInfo.read(); - try { - String srtPlate=new String(strTFSAlarmInfo.struPlateInfo.sLicense,"GBK").trim(); //车牌号码 - sAlarmType = sAlarmType + ":交通取证报警信息,违章类型:"+ strTFSAlarmInfo.dwIllegalType + ",车牌号码:" + srtPlate - + ",车辆出入状态:" + strTFSAlarmInfo.struAIDInfo.byVehicleEnterState; - } - catch (UnsupportedEncodingException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } + String srtPlate=new String(strTFSAlarmInfo.struPlateInfo.sLicense, GBK).trim(); //车牌号码 + sAlarmType = sAlarmType + ":交通取证报警信息,违章类型:"+ strTFSAlarmInfo.dwIllegalType + ",车牌号码:" + srtPlate + + ",车辆出入状态:" + strTFSAlarmInfo.struAIDInfo.byVehicleEnterState; //报警设备IP地址 sIP = new String(strTFSAlarmInfo.struDevInfo.struDevIP.sIpV4).split("\0", 2); @@ -1045,7 +1014,7 @@ public class CameraCall { sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); break; } - } catch (UnsupportedEncodingException ex) { + } catch (Exception ex) { Logger.getLogger(CameraCall.class.getName()).log(Level.SEVERE, null, ex); } return true; diff --git a/src/main/java/com/sipai/tools/UEditorUtil.java b/src/main/java/com/sipai/tools/UEditorUtil.java index 8834dde9..2f91bb5e 100644 --- a/src/main/java/com/sipai/tools/UEditorUtil.java +++ b/src/main/java/com/sipai/tools/UEditorUtil.java @@ -8,11 +8,11 @@ import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.util.Streams; -import sun.misc.BASE64Decoder; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.text.SimpleDateFormat; +import java.util.Base64; import java.util.*; /** @@ -129,16 +129,10 @@ public class UEditorUtil { String base64Data = this.request.getParameter(fieldName); this.fileName = this.getName("test.png"); this.url = savePath + "/" + this.fileName; - BASE64Decoder decoder = new BASE64Decoder(); try { File outFile = new File(this.getPhysicalPath(this.url)); OutputStream ro = new FileOutputStream(outFile); - byte[] b = decoder.decodeBuffer(base64Data); - for (int i = 0; i < b.length; ++i) { - if (b[i] < 0) { - b[i] += 256; - } - } + byte[] b = Base64.getMimeDecoder().decode(base64Data); ro.write(b); ro.flush(); ro.close(); diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties index 1a22edc6..2cda13d9 100644 --- a/src/main/resources/db.properties +++ b/src/main/resources/db.properties @@ -1,11 +1,11 @@ driver=com.microsoft.sqlserver.jdbc.SQLServerDriver -#url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SIPAIIS_WMS_HQAQ -url=jdbc:sqlserver://122.51.194.184:1433;DatabaseName=SIPAIIS_WMS_HQAQ +url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=SIPAIIS_WMS_HQAQ +#url=jdbc:sqlserver://122.51.194.184:1433;DatabaseName=SIPAIIS_WMS_HQAQ username=sa password=P76XB3nm36aMkN6n -#scada-url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=EIP_PRD_HQWS -scada-url=jdbc:sqlserver://122.51.194.184:1433;DatabaseName=EIP_PRD_HQWS +scada-url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=EIP_PRD_HQWS +#scada-url=jdbc:sqlserver://122.51.194.184:1433;DatabaseName=EIP_PRD_HQWS scada-username=sa scada-password=P76XB3nm36aMkN6n diff --git a/src/main/resources/mpoint_search_mapping.json b/src/main/resources/mpoint_search_mapping.json index 17b75584..7c42ecf3 100644 --- a/src/main/resources/mpoint_search_mapping.json +++ b/src/main/resources/mpoint_search_mapping.json @@ -1,5 +1,11 @@ { "properties": { + "id": { + "type": "keyword" + }, + "mpointid": { + "type": "keyword" + }, "parmname": { "type": "text", "analyzer": "ik_smart", @@ -8,6 +14,9 @@ "mpointcode": { "type": "keyword", "normalizer": "my_normalizer" + }, + "measuredt": { + "type": "date" } } -} \ No newline at end of file +} diff --git a/src/main/resources/mpoint_search_setting.json b/src/main/resources/mpoint_search_setting.json index 8d97eeff..d515d02a 100644 --- a/src/main/resources/mpoint_search_setting.json +++ b/src/main/resources/mpoint_search_setting.json @@ -1,31 +1,29 @@ { - "settings": { - "analysis": { - "analyzer": { - "char_analyzer": { - "char_filter": [ - "split_by_whitespace_filter" - ], - "tokenizer": "whitespace" - } - }, - "char_filter": { - "split_by_whitespace_filter": { - "type": "pattern_replace", - "pattern": "(.+?)", - "replacement": "$1 " - } + "analysis": { + "normalizer": { + "my_normalizer": { + "type": "custom", + "char_filter": [], + "filter": [ + "lowercase", + "asciifolding" + ] } - } - }, - "mappings": { - "like_search_type": { - "properties": { - "name": { - "type": "text", - "analyzer": "char_analyzer" - } + }, + "analyzer": { + "char_analyzer": { + "char_filter": [ + "split_by_whitespace_filter" + ], + "tokenizer": "whitespace" + } + }, + "char_filter": { + "split_by_whitespace_filter": { + "type": "pattern_replace", + "pattern": "(.+?)", + "replacement": "$1 " } } } -} \ No newline at end of file +} diff --git a/src/main/resources/redis.properties b/src/main/resources/redis.properties index d86b5c6b..ac6dabda 100644 --- a/src/main/resources/redis.properties +++ b/src/main/resources/redis.properties @@ -1,9 +1,9 @@ #redis���� -redis.host=122.51.194.184 -# redis.host=127.0.0.1 +# redis.host=122.51.194.184 +redis.host=127.0.0.1 #����single ��Ⱥcluster redis.mode=single -redis.port=26739 +redis.port=6379 # redis.port=6379 redis.password=Aa112211 redis.maxIdle=100 @@ -22,6 +22,6 @@ defaultCacheExpireTime=3600 fep.local.cache.capacity =10000 #cluster -cluster1.host.port=122.51.194.184: 26739 +#cluster1.host.port=127.0.0.1:6379 diff --git a/src/main/webapp/JS/commVisual.js b/src/main/webapp/JS/commVisual.js index 6b69a4e2..79b467a7 100644 --- a/src/main/webapp/JS/commVisual.js +++ b/src/main/webapp/JS/commVisual.js @@ -204,4 +204,4 @@ function GetLunarDay(solarYear, solarMonth, solarDay) { e2c(solarYear, solarMonth, solarDay); return GetcDateString(); } -} \ No newline at end of file +} diff --git a/使用说明文档.md b/使用说明文档.md deleted file mode 100644 index c77b4f5f..00000000 --- a/使用说明文档.md +++ /dev/null @@ -1,205 +0,0 @@ -# SIPAIIS_WMS_JSSW 项目使用说明文档 - -## 项目概述 - -SIPAIIS_WMS_JSSW 是一个基于Java的污水处理管理平台(SIPAIIS Wastewater Management System for JSSW),旨在提供全过程的监控、管理和优化服务。该系统采用Spring框架、MyBatis ORM、Activiti工作流引擎等技术栈,支持多种集成如Redis缓存、RabbitMQ消息队列、MQTT物联网通信等。 - -### 技术栈 -- **后端框架**: Spring 5.1.12, Spring MVC, Spring Security -- **数据库ORM**: MyBatis 3.5.1 -- **工作流**: Activiti 5.22.0 -- **缓存**: Redis, Redisson -- **消息队列**: RabbitMQ, Spring AMQP -- **物联网**: MQTT (Eclipse Paho), Modbus -- **搜索**: Elasticsearch -- **定时任务**: Quartz, XXL-Job -- **WebSocket**: 实时通信 -- **报表**: JasperReports, iText PDF -- **Excel处理**: Apache POI, EasyExcel -- **对象存储**: MinIO -- **其他**: Hutool工具库, Lombok, Knife4j API文档 - -### 部署环境 -- **Java版本**: JDK 1.8 -- **应用服务器**: 支持WAR包部署,如Tomcat, Jetty -- **数据库**: SQL Server (推荐), 支持其他JDBC兼容数据库 -- **端口**: 默认8088 (Jetty) - -## 功能点梳理 - -基于项目中的功能清单,系统包含以下主要功能模块: - -### 1. 用户管理 -- 用户信息增删改查 -- 部门组织架构管理 -- 角色权限管理 -- 菜单配置 - -### 2. 监控与报警 -- 测点数据管理 -- 报警记录管理 -- 报警类型配置 -- 设备监控 - -### 3. 设备管理 -- 设备基本信息管理 -- 设备类型分类 -- 设备生命周期管理(采购、入库、出库、维修、保养、巡检、点检、润滑、校准、报废等) -- 设备统计、分析、排名、对比、预警 -- BIM设备关联与巡检 - -### 4. 工单管理 -- 工作工单管理 -- 维修工单处理 -- 保养工单管理 -- 工单执行与跟踪 - -### 5. 备品备件管理 -- 备件库存管理 -- 采购记录管理 -- 库存调拨管理 - -### 6. 视频监控 -- 摄像头管理 -- NVR设备管理 - -### 7. 巡检与考核 -- 巡检计划与记录 -- KPI考核指标、计划、结果 - -### 8. 消息与通知 -- 系统消息管理 -- 短信用户管理 - -### 9. 工作流管理 -- 工作流流程管理 -- 请假申请 -- 任务管理 - -### 10. 文档管理 -- 文档资料管理 -- 图书资料管理 -- 图纸管理 - -### 11. 报表与分析 -- 数据报表管理 -- 工作日报管理 -- 能源数据监控 -- 生产工艺参数 -- 生产指标管理 - -### 12. 可视化展示 -- 大屏数据可视化 -- 工艺流程图管理 -- 页面布局配置 - -### 13. 计划与交互 -- 生产计划管理 -- 页面交互配置 -- 数据类型定义 - -### 14. BIM管理 -- BIM模型管理 -- BIM巡检路线 -- BIM设备关联 -- BIM报警记录 - -### 15. 其他模块 -- 缓存数据管理 -- JSP配置 -- 第三方接口集成 - -## 功能点间相互依赖关系 - -### 核心依赖关系 -- **设备管理** 是基础模块,其他模块如报警、工单、巡检、BIM等均依赖设备数据。 -- **测点与报警**: 报警依赖测点数据和设备状态。 -- **工单管理**: 维修、保养工单依赖设备信息和工作流引擎。 -- **工作流**: 工单、请假、任务等流程依赖Activiti工作流。 -- **巡检与KPI**: 巡检记录影响KPI考核结果。 -- **BIM**: BIM设备关联依赖设备管理,BIM报警依赖报警模块。 -- **报表与可视化**: 依赖各模块数据进行统计和展示。 -- **消息通知**: 报警、工单等事件触发消息发送。 -- **缓存与消息队列**: Redis用于缓存热点数据,RabbitMQ用于异步处理,MQTT用于设备通信。 - -### 数据流依赖 -- 用户权限控制贯穿所有模块。 -- 设备数据是中心,影响报警、工单、统计等。 -- 工作流驱动业务流程,如工单审批。 -- 集成技术(Redis、MQ、ES)支持高性能和实时性。 - -## 安装与部署 - -### 环境要求 -- JDK 1.8+ -- Maven 3.6+ -- 数据库:SQL Server 2012+ 或兼容JDBC数据库 -- Redis 2.6+ -- RabbitMQ 5.9+ -- Elasticsearch 3.2+ -- MinIO (可选,用于文件存储) - -### 部署步骤 -1. **克隆或下载项目**: - ``` - git clone - cd SIPAIIS_WMS_JSSW - ``` - -2. **配置数据库**: - - 编辑 `src/main/resources/db.properties` 配置数据库连接。 - - 执行数据库脚本初始化表结构。 - -3. **配置其他服务**: - - 编辑 `config.properties`, `redis.properties`, `rabbitmq.properties`, `mqtt.properties` 等配置文件。 - - 启动Redis, RabbitMQ, Elasticsearch等服务。 - -4. **构建项目**: - ``` - mvn clean package - ``` - -5. **部署WAR包**: - - 将 `target/TGLW.war` 部署到Tomcat或Jetty。 - - 默认端口8088,可在 `pom.xml` 中修改。 - -6. **启动应用**: - - 访问 `http://localhost:8088/` 进入系统。 - -### 配置说明 -- **applicationContext.xml**: Spring上下文配置,XXL-Job执行器。 -- **log4j.properties**: 日志配置。 -- **xxl-job-executor.properties**: 定时任务配置。 - -## 使用指南 - -### 系统登录 -- 默认管理员账号:根据配置。 -- 登录后,根据角色权限访问不同模块。 - -### 主要操作 -- **设备管理**: 添加设备,配置参数,监控状态。 -- **报警处理**: 查看报警记录,确认处理。 -- **工单执行**: 创建工单,分配任务,跟踪进度。 -- **巡检管理**: 设置巡检计划,记录巡检结果。 -- **报表查看**: 生成各类统计报表。 -- **BIM可视化**: 查看3D模型,关联设备数据。 - -### API文档 -- 使用Knife4j查看API接口:`http://localhost:8088/doc.html` - -### 维护与监控 -- 日志文件:`logs/TGLW.log` -- 监控Redis、MQ连接状态。 -- 使用XXL-Job管理定时任务。 - -## 注意事项 -- 确保数据库和外部服务正常运行。 -- 定期备份数据。 -- 根据实际环境调整配置文件。 -- 安全配置:启用Spring Security,定期更新密码。 - -## 联系与支持 -- 项目维护者:JSSW团队 -- 版本:0.0.1-SNAPSHOT -- 更新日期:2026-04-05 diff --git a/功能清单.xlsx b/功能清单.xlsx deleted file mode 100644 index c715f2d2..00000000 --- a/功能清单.xlsx +++ /dev/null @@ -1,191 +0,0 @@ -功能名称 功能说明 接口路径 对应数据表名 页面文件 -用户管理 用户信息的增删改查 /user/user TB_USER userList.jsp -部门管理 部门组织架构管理 /user/dept TB_DEPT deptList.jsp -角色管理 系统角色权限管理 /user/role TB_ROLE roleList.jsp -菜单管理 系统菜单配置 /user/menu TB_MENU menuList.jsp -测点管理 监控测点数据管理 /work/mpoint TB_MPOINT mPointList.jsp -报警记录 报警信息记录管理 /alarm/record TB_ALARMRECORD alarmRecordList.jsp -报警类型 报警类型配置管理 /alarm/type TB_ALARMTYPE alarmTypeList.jsp -设备管理 设备基本信息管理 /equipment/card TB_EQUIPMENTCARD equipmentCardList.jsp -设备类型 设备分类管理 /equipment/class TB_EQUIPMENTCLASS equipmentClassList.jsp -工单管理 工作工单管理 /workorder/detail TB_WORKORDERDETAIL workorderList.jsp -维修工单 维修工单处理 /workorder/repair TB_WORKORDERREPAIR repairList.jsp -保养工单 设备保养工单 /workorder/maintain TB_WORKORDERMAINTAIN maintainList.jsp -备品备件 备件库存管理 /sparepart/stock TB_STOCK stockList.jsp -采购记录 备件采购记录 /sparepart/purchase TB_PURCHASERECORD purchaseList.jsp -库存调拨 库存调拨管理 /sparepart/transfer TB_STOCKTRANSFER transferList.jsp -视频监控 监控摄像头管理 /work/camera TB_CAMERA cameraList.jsp -NVR设备 网络录像机管理 /work/cameranvr TB_CAMERANVR cameraNVRList.jsp -巡检计划 设备巡检计划 /patrol/plan TB_PATROLPLAN patrolPlanList.jsp -巡检记录 巡检执行记录 /patrol/record TB_PATROLRECORD patrolRecordList.jsp -考核指标 KPI考核指标管理 /work/kpipoint TB_KPIPOINT kpiPointList.jsp -考核计划 KPI考核计划 /kpi/plan TB_KPIPLAN kpiPlanList.jsp -考核结果 KPI考核结果 /kpi/result TB_KPIRESULT kpiResultList.jsp -消息管理 系统消息通知 /msg/message TB_MESSAGE msgList.jsp -短信用户 短信发送用户 /msg/smsuser TB_SMSUSER smsUserList.jsp -工作流管理 工作流流程管理 /activiti/process TB_OEPROCESS processList.jsp -请假申请 员工请假申请 /activiti/leave TB_LEAVE leaveList.jsp -任务管理 工作任务管理 /activiti/task TB_WORKTASK taskList.jsp -文档管理 文档资料管理 /document/file TB_DOCUMENT documentList.jsp -图书资料 图书资料管理 /document/book TB_BOOK bookList.jsp -图纸管理 工程图纸管理 /document/drawing TB_DRAWING drawingList.jsp -报表管理 数据报表管理 /report/info TB_RPTINFO rptInfoList.jsp -日报管理 工作日报管理 /report/daylog TB_RPTDAYLOG rptDayLogList.jsp -能源管理 能源数据监控 /energy/manage TB_ENERGYDATA energyList.jsp -工艺参数 生产工艺参数 /process/parameter TB_PROCESSPARAM paramList.jsp -生产指标 生产指标管理 /production/index TB_PRODUCTIONINDEX productionIndexList.jsp -大屏展示 数据可视化大屏 /visual/largescreen TB_LARGESCREEN largeScreen.jsp -工艺流程 工艺流程图管理 /visual/process TB_PROCESSPIC processPicList.jsp -布局管理 页面布局配置 /visual/layout TB_LAYOUT layoutList.jsp -计划管理 生产计划管理 /plan/manage TB_PLAN planList.jsp -计划布局 计划布局配置 /plan/layout TB_PLANLAYOUT planLayoutList.jsp -交互配置 页面交互配置 /interaction/config TB_INTERACTION interactionList.jsp -数据类型 数据类型定义 /data/type TB_DATATYPE dataTypeList.jsp -缓存数据 缓存数据管理 /cache/data TB_CACHEDATA cacheDataList.jsp -JSP配置 JSP页面配置 /jsp/configure TB_JSPCONFIGURE jspConfigureList.jsp -JSP元素 JSP页面元素 /jsp/element TB_JSPELEMENT jspElementList.jsp -计划交互 计划交互配置 /plan/interaction TB_PLANINTERACTION planInteractionList.jsp -BIM管理 BIM模型管理 /bim/manage TB_BIM bimList.jsp -BIM路线 BIM巡检路线 /bim/route TB_BIMROUTE bimRouteList.jsp -BIM设备 BIM设备关联 /bim/equipment TB_BIMEQUIPMENT bimEquipmentList.jsp -报警相机 报警摄像头关联 /bim/camera TB_BIMCAMERA bimCameraList.jsp -报警记录 BIM报警记录 /bim/alarm TB_BIMALARM bimAlarmList.jsp -设备地图 设备地图展示 /eq/map TB_EQMAP eqMap.jsp -设备统计 设备统计分析 /eq/statistics TB_EQSTATISTICS eqStatistics.jsp -设备完好率 设备完好率统计 /eq/intactrate TB_EQINTACTRATE eqIntactRate.jsp -设备概况 设备概况总览 /eq/overview TB_EQOVERVIEW eqOverview.jsp -设备分析 设备数据分析 /eq/analysis TB_EQANALYSIS eqAnalysis.jsp -设备排名 设备性能排名 /eq/ranking TB_EQRANKING eqRanking.jsp -设备对比 设备对比分析 /eq/compare TB_EQCOMPARE eqCompare.jsp -设备预警 设备预警管理 /eq/warning TB_EQWARNING eqWarning.jsp -设备报警 设备报警管理 /eq/alarm TB_EQALARM eqAlarm.jsp -设备维修 设备维修管理 /eq/repair TB_EQREPAIR eqRepair.jsp -设备保养 设备保养管理 /eq/maintain TB_EQMAINTAIN eqMaintain.jsp -设备巡检 设备巡检管理 /eq/patrol TB_EQPATROL eqPatrol.jsp -设备点检 设备点检管理 /eq/check TB_EQCHECK eqCheck.jsp -设备润滑 设备润滑管理 /eq/lubricate TB_EQLUBRICATE eqLubricate.jsp -设备校准 设备校准管理 /eq/calibrate TB_EQCALIBRATE eqCalibrate.jsp -设备报废 设备报废管理 /eq/scrap TB_EQSCRAP eqScrap.jsp -设备借用 设备借用管理 /eq/borrow TB_EQBORROW eqBorrow.jsp -设备归还 设备归还管理 /eq/return TB_EQRETURN eqReturn.jsp -设备转移 设备转移管理 /eq/transfer TB_EQTRANSFER eqTransfer.jsp -设备盘点 设备盘点管理 /eq/inventory TB_EQINVENTORY eqInventory.jsp -设备验收 设备验收管理 /eq/acceptance TB_EQACCEPTANCE eqAcceptance.jsp -设备合同 设备合同管理 /eq/contract TB_EQCONTRACT eqContract.jsp -设备供应商 设备供应商管理 /eq/supplier TB_EQSUPPLIER eqSupplier.jsp -设备采购 设备采购管理 /eq/purchase TB_EQPURCHASE eqPurchase.jsp -设备入库 设备入库管理 /eq/instock TB_EQINSTOCK eqInStock.jsp -设备出库 设备出库管理 /eq/outstock TB_EQOUTSTOCK eqOutStock.jsp -设备调拨 设备调拨管理 /eq/transfer TB_EQTRANSFER2 eqTransfer2.jsp -设备借用申请 设备借用申请 /eq/borrowapply TB_EQBORROWAPPLY eqBorrowApply.jsp -设备维修申请 设备维修申请 /eq/repairapply TB_EQREPAIRAPPLY eqRepairApply.jsp -设备保养计划 设备保养计划 /eq/maintainplan TB_EQMAINTAINPLAN eqMaintainPlan.jsp -设备巡检计划 设备巡检计划 /eq/patrolplan TB_EQPATROLPLAN eqPatrolPlan.jsp -设备点检计划 设备点检计划 /eq/checkplan TB_EQCHECKPLAN eqCheckPlan.jsp -设备润滑计划 设备润滑计划 /eq/lubricateplan TB_EQLUBRICATEPLAN eqLubricatePlan.jsp -设备校准计划 设备校准计划 /eq/calibrateplan TB_EQCALIBRATEPLAN eqCalibratePlan.jsp -设备培训计划 设备培训计划 /eq/trainplan TB_EQTRAINPLAN eqTrainPlan.jsp -设备培训记录 设备培训记录 /eq/trainrecord TB_EQTRAINRECORD eqTrainRecord.jsp -设备事故记录 设备事故记录 /eq/accident TB_EQACCIDENT eqAccident.jsp -设备故障记录 设备故障记录 /eq/fault TB_EQFAULT eqFault.jsp -设备维修记录 设备维修记录 /eq/repairrecord TB_EQREPAIRRECORD eqRepairRecord.jsp -设备保养记录 设备保养记录 /eq/maintainrecord TB_EQMAINTAINRECORD eqMaintainRecord.jsp -设备巡检记录 设备巡检记录 /eq/patrolrecord TB_EQPATROLRECORD eqPatrolRecord.jsp -设备点检记录 设备点检记录 /eq/checkrecord TB_EQCHECKRECORD eqCheckRecord.jsp -设备润滑记录 设备润滑记录 /eq/lubricaterecord TB_EQLUBRICATERECORD eqLubricateRecord.jsp -设备校准记录 设备校准记录 /eq/calibraterecord TB_EQCALIBRATERECORD eqCalibrateRecord.jsp -设备台账 设备台账管理 /eq/account TB_EQACCOUNT eqAccount.jsp -设备档案 设备档案管理 /eq/archive TB_EQARCHIVE eqArchive.jsp -设备卡片 设备卡片管理 /eq/card TB_EQCARD eqCard.jsp -设备履历 设备履历管理 /eq/resume TB_EQRESUME eqResume.jsp -设备评价 设备评价管理 /eq/evaluate TB_EQEVALUATE eqEvaluate.jsp -设备评级 设备评级管理 /eq/rating TB_EQRATING eqRating.jsp -设备分类 设备分类管理 /eq/category TB_EQCATEGORY eqCategory.jsp -设备状态 设备状态管理 /eq/status TB_EQSTATUS eqStatus.jsp -设备参数 设备参数管理 /eq/parameter TB_EQPARAMETER eqParameter.jsp -设备规格 设备规格管理 /eq/specification TB_EQSPECIFICATION eqSpecification.jsp -设备型号 设备型号管理 /eq/model TB_EQMODEL eqModel.jsp -设备品牌 设备品牌管理 /eq/brand TB_EQBRAND eqBrand.jsp -设备制造商 设备制造商管理 /eq/manufacturer TB_EQMANUFACTURER eqManufacturer.jsp -设备使用年限 设备使用年限管理 /eq/age TB_EQAGE eqAge.jsp -设备折旧 设备折旧管理 /eq/depreciation TB_EQDEPRECIATION eqDepreciation.jsp -设备价值 设备价值管理 /eq/value TB_EQVALUE eqValue.jsp -设备利用率 设备利用率管理 /eq/utilization TB_EQUTILIZATION eqUtilization.jsp -设备效率 设备效率管理 /eq/efficiency TB_EQEFFICIENCY eqEfficiency.jsp -设备性能 设备性能管理 /eq/performance TB_EQPERFORMANCE eqPerformance.jsp -设备质量 设备质量管理 /eq/quality TB_EQQUALITY eqQuality.jsp -设备安全 设备安全管理 /eq/safety TB_EQSAFETY eqSafety.jsp -设备环保 设备环保管理 /eq/environmental TB_EQENVIRONMENTAL eqEnvironmental.jsp -设备能耗 设备能耗管理 /eq/energy TB_EQENERGY eqEnergy.jsp -设备成本 设备成本管理 /eq/cost TB_EQCOST eqCost.jsp -设备利润 设备利润管理 /eq/profit TB_EQPROFIT eqProfit.jsp -设备投资 设备投资管理 /eq/investment TB_EQINVESTMENT eqInvestment.jsp -设备回报 设备回报管理 /eq/return TB_EQRETURN eqReturn.jsp -设备风险 设备风险管理 /eq/risk TB_EQRISK eqRisk.jsp -设备保险 设备保险管理 /eq/insurance TB_EQINSURANCE eqInsurance.jsp -设备保修 设备保修管理 /eq/warranty TB_EQWARRANTY eqWarranty.jsp -设备服务 设备服务管理 /eq/service TB_EQSERVICE eqService.jsp -设备支持 设备支持管理 /eq/support TB_EQSUPPORT eqSupport.jsp -设备维护 设备维护管理 /eq/maintenance TB_EQMAINTENANCE eqMaintenance.jsp -设备升级 设备升级管理 /eq/upgrade TB_EQUPGRADE eqUpgrade.jsp -设备更新 设备更新管理 /eq/update TB_EQUPDATE eqUpdate.jsp -设备替换 设备替换管理 /eq/replace TB_EQREPLACE eqReplace.jsp -设备淘汰 设备淘汰管理 /eq/eliminate TB_EQELIMINATE eqEliminate.jsp -设备处置 设备处置管理 /eq/disposal TB_EQDISPOSAL eqDisposal.jsp -设备拍卖 设备拍卖管理 /eq/auction TB_EQAUCTION eqAuction.jsp -设备捐赠 设备捐赠管理 /eq/donate TB_EQDONATE eqDonate.jsp -设备报废申请 设备报废申请 /eq/scrapapply TB_EQSCRAPAPPLY eqScrapApply.jsp -设备处置申请 设备处置申请 /eq/disposalapply TB_EQDISPOSALAPPLY eqDisposalApply.jsp -设备拍卖申请 设备拍卖申请 /eq/auctionapply TB_EQAUCTIONAPPLY eqAuctionApply.jsp -设备捐赠申请 设备捐赠申请 /eq/donateapply TB_EQDONATEAPPLY eqDonateApply.jsp -设备评估 设备评估管理 /eq/assessment TB_EQASSESSMENT eqAssessment.jsp -设备估价 设备估价管理 /eq/valuation TB_EQVALUATION eqValuation.jsp -设备鉴定 设备鉴定管理 /eq/appraisal TB_EQAPPRAISAL eqAppraisal.jsp -设备检测 设备检测管理 /eq/detection TB_EQDETECTION eqDetection.jsp -设备检验 设备检验管理 /eq/inspection TB_EQINSPECTION eqInspection.jsp -设备试验 设备试验管理 /eq/test TB_EQTEST eqTest.jsp -设备验证 设备验证管理 /eq/verification TB_EQVERIFICATION eqVerification.jsp -设备确认 设备确认管理 /eq/confirmation TB_EQCONFIRMATION eqConfirmation.jsp -设备审核 设备审核管理 /eq/audit TB_EQAUDIT eqAudit.jsp -设备审批 设备审批管理 /eq/approve TB_EQAPPROVE eqApprove.jsp -设备备案 设备备案管理 /eq/record TB_EQRECORD eqRecord.jsp -设备注册 设备注册管理 /eq/register TB_EQREGISTER eqRegister.jsp -设备登记 设备登记管理 /eq/registration TB_EQREGISTRATION eqRegistration.jsp -设备申报 设备申报管理 /eq/declare TB_EQDECLARE eqDeclare.jsp -设备报备 设备报备管理 /eq/report TB_EQREPORT eqReport.jsp -设备通报 设备通报管理 /eq/notify TB_EQNOTIFY eqNotify.jsp -设备公告 设备公告管理 /eq/announcement TB_EQANNOUNCEMENT eqAnnouncement.jsp -设备通知 设备通知管理 /eq/notice TB_EQNOTICE eqNotice.jsp -设备提醒 设备提醒管理 /eq/remind TB_EQREMIND eqRemind.jsp -设备预警 设备预警管理 /eq/earlywarning TB_EQEARLYWARNING eqEarlyWarning.jsp -设备预告 设备预告管理 /eq/forecast TB_EQFORECAST eqForecast.jsp -设备预测 设备预测管理 /eq/prediction TB_EQPREDICTION eqPrediction.jsp -设备预报 设备预报管理 /eq/prediction2 TB_EQPREDICTION2 eqPrediction2.jsp -设备预检 设备预检管理 /eq/preinspection TB_EQPREINSPECTION eqPreInspection.jsp -设备预修 设备预修管理 /eq/prerepair TB_EQPREREPAIR eqPreRepair.jsp -设备预保 设备预保管理 /eq/premaintain TB_EQPREMAINTAIN eqPreMaintain.jsp -设备预巡检 设备预巡检管理 /eq/prepatrol TB_EQPREPATROL eqPrePatrol.jsp -设备预点检 设备预点检管理 /eq/precheck TB_EQPRECHECK eqPreCheck.jsp -设备预润滑 设备预润滑管理 /eq/prelubricate TB_EQPRELUBRICATE eqPreLubricate.jsp -设备预校准 设备预校准管理 /eq/precalibrate TB_EQPRECALIBRATE eqPreCalibrate.jsp -设备预培训 设备预培训管理 /eq/pretrain TB_EQPRETRAIN eqPreTrain.jsp -设备预事故 设备预事故管理 /eq/preaccident TB_EQPREACCIDENT eqPreAccident.jsp -设备预故障 设备预故障管理 /eq/prefault TB_EQPREFAULT eqPreFault.jsp -设备预维修 设备预维修管理 /eq/prerepair2 TB_EQPREREPAIR2 eqPreRepair2.jsp -设备预保养 设备预保养管理 /eq/premaintain2 TB_EQPREMAINTAIN2 eqPreMaintain2.jsp -设备预巡检 设备预巡检管理 /eq/prepatrol2 TB_EQPREPATROL2 eqPrePatrol2.jsp -设备预点检 设备预点检管理 /eq/precheck2 TB_EQPRECHECK2 eqPreCheck2.jsp -设备预润滑 设备预润滑管理 /eq/prelubricate2 TB_EQPRELUBRICATE2 eqPreLubricate2.jsp -设备预校准 设备预校准管理 /eq/precalibrate2 TB_EQPRECALIBRATE2 eqPreCalibrate2.jsp -设备预培训 设备预培训管理 /eq/pretrain2 TB_EQPRETRAIN2 eqPreTrain2.jsp -设备预事故 设备预事故管理 /eq/preaccident2 TB_EQPREACCIDENT2 eqPreAccident2.jsp -设备预故障 设备预故障管理 /eq/prefault2 TB_EQPREFAULT2 eqPreFault2.jsp -设备预维修 设备预维修管理 /eq/prerepair3 TB_EQPREREPAIR3 eqPreRepair3.jsp -设备预保养 设备预保养管理 /eq/premaintain3 TB_EQPREMAINTAIN3 eqPreMaintain3.jsp -设备预巡检 设备预巡检管理 /eq/prepatrol3 TB_EQPREPATROL3 eqPrePatrol3.jsp -设备预点检 设备预点检管理 /eq/precheck3 TB_EQPRECHECK3 eqPreCheck3.jsp -设备预润滑 设备预润滑管理 /eq/prelubricate3 TB_EQPRELUBRICATE3 eqPreLubricate3.jsp -设备预校准 设备预校准管理 /eq/precalibrate3 TB_EQPRECALIBRATE3 eqPreCalibrate3.jsp -设备预培训 设备预培训管理 /eq/pretrain3 TB_EQPRETRAIN3 eqPreTrain3.jsp -设备预事故 设备预事故管理 /eq/preaccident3 TB_EQPREACCIDENT3 eqPreAccident3.jsp -设备预故障 设备预故障管理 /eq/prefault3 TB_EQPREFAULT3 eqPreFault3.jsp \ No newline at end of file diff --git a/功能清单详细版.xlsx b/功能清单详细版.xlsx deleted file mode 100644 index 60da08733c10e87bde43917d636439e00b160b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32235 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 diff --git a/污水处理管理平台_v7.html b/污水处理管理平台_v7.html deleted file mode 100644 index 6f8f35c6..00000000 --- a/污水处理管理平台_v7.html +++ /dev/null @@ -1,459 +0,0 @@ - - - - - - -智水云 - 污水处理全流程监控一张图 - - - - - - - -

-
- -
-

智水云 · 全流程数字化管控平台

-

SYSTEM STATUS: 2026-03-22 10:45:00

-
-
-
-
- 运行中: 24h -负荷: 78% -能效: 0.32 kW·h/m³ -
-
-
-

值班主管

-

王建国 (A组)

-
-
-
-
-
- -
-
-
- -工业进水累计 -
-
-
-

当日总量

-

10,867

-
-
-

环比

-

+2.4% ↑

-
-
-
-
-
- -生活进水累计 -
-
-
-

当日总量

-

7,569

-
-
-

环比

-

-1.8% ↓

-
-
-
-
-
- -进水流量7日趋势 (m³/d) -
- -
- -
-
- -
-
-设备运行异常 -实时监控 -
-
-
-
03
-
Active Alarms
-
-
-
待处理: 03
-
已闭环: 12/今日
-
-
-
-
- -
-
-
-
- -

全流程生产工艺实时数据概览

-
-
- 生产正常 -更新时间: 2026-03-22 10:15:30 -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
工艺段名称状态瞬时流量 (m³/h)关键参数 1关键参数 2关键参数 3设备ID
01. 细格栅与提升运行中1,245.8液位:1.8mpH:7.2主泵:2#P101
02. 曝气沉砂池运行中1,238.2DO:2.5mg/L速:35Hz油:0.2D205
03. 初次沉淀池运行中1,232.0SS:180mg/L泥位:0.8m刮泥:ONS302
04. A/A/O 生物反应器运行中1,230.5厌氧ORP:-180mVMLSS:3250回流:100%B401
05. 二次沉淀池组故障告警1,228.1出水SS:22.4泥层:1.2m泵组:ERRS204
06. 磁混凝高效沉淀运行中1,225.0投药:12.5mg/L磁粉:保持浊度:4.2M501
07. V型滤池运行中1,210.6滤速:6.5m/h水头失:1.2m反冲:4:30F602
08. 紫外消毒/次氯酸钠运行中1,208.5强度:35mW余氯:0.45运行:12hV501
09. 核心鼓风机房运行中254 m³压:58kPa温:62℃功率:185kWM601
10. 总出水在线监测达标运行18.5kCOD:22.4NH3:0.24TP:0.08OUT-M
11. 污泥脱水系统运行中--含水:78.2%产泥:12.5t药量:4.2W701
-
-
-
系统就绪,当前生产效率:92%
-
- - -
-
-
- -
-
-
- -实时告警列表 -
-
- - -
-
-
- -
-
-Critical -10:42:15 -
-
鼓风机房 #2 离心风机
-
- - 运行电流过载 (45.2A > 40.0A) -
-
- - -
-
- -
-
-Warning -10:05:21 -
-
2# 二沉池 吸泥机
-
- - 转速异常波动 (+/- 15%) -
-
- -
-
- -
-
-Info -09:12:05 -
-
加药间 PAC 储罐
-
- - 低液位预警 (剩余 15%) -
-
- -
-
-
- -
-
-
-

© 2026 智水云污水处理管理有限公司

-

江苏省南通市华东第二污水处理厂

-
-
-

云端数据实时同步中 (25ms)

-

生产智脑 V4.2.0-PROD

-
-
- - - \ No newline at end of file