This commit is contained in:
2026-04-23 17:37:38 +08:00
parent 4aeb894ba9
commit 6c252fe4dd
16 changed files with 69 additions and 977 deletions

View File

@ -22,13 +22,13 @@ import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import sun.misc.BASE64Decoder;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.Base64;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -92,15 +92,9 @@ public class BaiDuAipSpeechController {
String type = request.getParameter("type"); String type = request.getParameter("type");
String upfile_b64 = request.getParameter("upfile_b64"); String upfile_b64 = request.getParameter("upfile_b64");
BASE64Decoder decoder = new BASE64Decoder();
try { try {
//Base64解码 //Base64解码
byte[] b = decoder.decodeBuffer(upfile_b64); byte[] b = Base64.getMimeDecoder().decode(upfile_b64);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {//调整异常数据
b[i] += 256;
}
}
String imgFilePath = "D:\\audio\\recorder.mp3"; String imgFilePath = "D:\\audio\\recorder.mp3";
File fileUploadPath = new File("D:\\audio"); File fileUploadPath = new File("D:\\audio");
if (!fileUploadPath.exists()) { if (!fileUploadPath.exists()) {
@ -129,15 +123,9 @@ public class BaiDuAipSpeechController {
String type = request.getParameter("type"); String type = request.getParameter("type");
String upfile_b64 = request.getParameter("upfile_b64"); String upfile_b64 = request.getParameter("upfile_b64");
BASE64Decoder decoder = new BASE64Decoder();
try { try {
//Base64解码 //Base64解码
byte[] b = decoder.decodeBuffer(upfile_b64); byte[] b = Base64.getMimeDecoder().decode(upfile_b64);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {//调整异常数据
b[i] += 256;
}
}
String imgFilePath = "D:\\audio\\recorder.mp3"; String imgFilePath = "D:\\audio\\recorder.mp3";
File fileUploadPath = new File("D:\\audio"); File fileUploadPath = new File("D:\\audio");
if (!fileUploadPath.exists()) { if (!fileUploadPath.exists()) {

View File

@ -30,7 +30,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import sun.misc.BASE64Encoder;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -41,6 +40,7 @@ import java.io.InputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -593,8 +593,7 @@ public class UserController {
in.read(data); in.read(data);
in.close(); in.close();
//将二进制字节用base64编码以字符串方式存到数据库中 //将二进制字节用base64编码以字符串方式存到数据库中
BASE64Encoder encoder = new BASE64Encoder(); String headPortrait = Base64.getEncoder().encodeToString(data);
String headPortrait = encoder.encode(data);
User cu = (User) request.getSession().getAttribute("cu"); User cu = (User) request.getSession().getAttribute("cu");
UserDetail userDetail = this.userDetailService.selectByUserId(cu.getId()); UserDetail userDetail = this.userDetailService.selectByUserId(cu.getId());
int res = 0; int res = 0;

View File

@ -18,7 +18,6 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import sun.misc.BASE64Decoder;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
@ -32,6 +31,7 @@ import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DecimalFormat; import java.text.DecimalFormat;
import java.util.Base64;
import java.util.List; import java.util.List;
@SuppressWarnings({"restriction", "unused"}) @SuppressWarnings({"restriction", "unused"})
@ -719,12 +719,7 @@ public class WordAnalysisReportStructureController {
String id = strconts[0]; String id = strconts[0];
String img = strconts[2]; String img = strconts[2];
byte[] b2 = new BASE64Decoder().decodeBuffer(img); byte[] b2 = Base64.getMimeDecoder().decode(img);
for (int i = 0; i < b2.length; ++i) {
if (b2[i] < 0) {// 调整异常数据
b2[i] += 256;
}
}
// 生成png图片 // 生成png图片
String contextPath = request.getContextPath().replace("/", ""); String contextPath = request.getContextPath().replace("/", "");
String filepathSever = request.getSession().getServletContext().getRealPath(""); String filepathSever = request.getSession().getServletContext().getRealPath("");

View File

@ -17,7 +17,6 @@ import net.sf.json.JSONArray;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import sun.misc.BASE64Decoder;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -25,6 +24,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -584,12 +584,7 @@ public class CameraService implements CommService<Camera> {
// System.out.println(imgData); // System.out.println(imgData);
byte[] b = new BASE64Decoder().decodeBuffer(imgData); byte[] b = Base64.getMimeDecoder().decode(imgData);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {// 调整异常数据
b[i] += 256;
}
}
InputStream in = new ByteArrayInputStream(b); InputStream in = new ByteArrayInputStream(b);
minioTemplate.makeBucket(nameSpace); minioTemplate.makeBucket(nameSpace);
minioTemplate.putObject(nameSpace, rid + "_" + filePath + ".jpg", in, null, null, null, contentType); minioTemplate.putObject(nameSpace, rid + "_" + filePath + ".jpg", in, null, null, null, contentType);

View File

@ -9,6 +9,7 @@ import org.slf4j.LoggerFactory;
import java.io.*; import java.io.*;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
@ -19,6 +20,7 @@ import java.util.logging.Logger;
public class CameraCall { public class CameraCall {
private static HCNetSDK2 hcNetSDK = HCNetSDK2.INSTANCE; private static HCNetSDK2 hcNetSDK = HCNetSDK2.INSTANCE;
private static org.slf4j.Logger logger = LoggerFactory.getLogger(CameraCall.class); 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_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(); //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(); 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(); Pointer pPlateInfo = strPlateResult.getPointer();
pPlateInfo.write(0, pAlarmInfo.getByteArray(0, strPlateResult.size()), 0, strPlateResult.size()); pPlateInfo.write(0, pAlarmInfo.getByteArray(0, strPlateResult.size()), 0, strPlateResult.size());
strPlateResult.read(); strPlateResult.read();
try { String plateNo=new String(strPlateResult.struPlateInfo.sLicense, GBK);
String srt3=new String(strPlateResult.struPlateInfo.sLicense,"GBK"); sAlarmType = sAlarmType + ":交通抓拍上传,车牌:"+ plateNo;
sAlarmType = sAlarmType + ":交通抓拍上传,车牌:"+ srt3;
}
catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//报警设备IP地址 //报警设备IP地址
sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
@ -539,17 +532,8 @@ public class CameraCall {
Pointer pItsPlateInfo = strItsPlateResult.getPointer(); Pointer pItsPlateInfo = strItsPlateResult.getPointer();
pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, strItsPlateResult.size()), 0, strItsPlateResult.size()); pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, strItsPlateResult.size()), 0, strItsPlateResult.size());
strItsPlateResult.read(); strItsPlateResult.read();
try { String itsPlateNo=new String(strItsPlateResult.struPlateInfo.sLicense, GBK);
String srt3=new String(strItsPlateResult.struPlateInfo.sLicense,"GBK"); sAlarmType = sAlarmType + ",车辆类型:"+strItsPlateResult.byVehicleType + ",交通抓拍上传,车牌:"+ itsPlateNo;
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();
}
//报警设备IP地址 //报警设备IP地址
sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
@ -626,19 +610,10 @@ public class CameraCall {
Pointer pItsParkVehicle = strItsParkVehicle.getPointer(); Pointer pItsParkVehicle = strItsParkVehicle.getPointer();
pItsParkVehicle.write(0, pAlarmInfo.getByteArray(0, strItsParkVehicle.size()), 0, strItsParkVehicle.size()); pItsParkVehicle.write(0, pAlarmInfo.getByteArray(0, strItsParkVehicle.size()), 0, strItsParkVehicle.size());
strItsParkVehicle.read(); strItsParkVehicle.read();
try {
String srtParkingNo=new String(strItsParkVehicle.byParkingNo).trim(); //车位编号 String srtParkingNo=new String(strItsParkVehicle.byParkingNo).trim(); //车位编号
String srtPlate=new String(strItsParkVehicle.struPlateInfo.sLicense,"GBK").trim(); //车牌号码 String srtPlate2=new String(strItsParkVehicle.struPlateInfo.sLicense, GBK).trim(); //车牌号码
sAlarmType = sAlarmType + ",停产场数据,车位编号:"+ srtParkingNo + ",车位状态:" sAlarmType = sAlarmType + ",停产场数据,车位编号:"+ srtParkingNo + ",车位状态:"
+ strItsParkVehicle.byLocationStatus+ ",车牌:"+ srtPlate; + strItsParkVehicle.byLocationStatus+ ",车牌:"+ srtPlate2;
}
catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//报警设备IP地址 //报警设备IP地址
sIP = new String(pAlarmer.sDeviceIP).split("\0", 2); 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()); pTFSInfo.write(0, pAlarmInfo.getByteArray(0, strTFSAlarmInfo.size()), 0, strTFSAlarmInfo.size());
strTFSAlarmInfo.read(); strTFSAlarmInfo.read();
try { String srtPlate=new String(strTFSAlarmInfo.struPlateInfo.sLicense, GBK).trim(); //车牌号码
String srtPlate=new String(strTFSAlarmInfo.struPlateInfo.sLicense,"GBK").trim(); //车牌号码
sAlarmType = sAlarmType + ":交通取证报警信息,违章类型:"+ strTFSAlarmInfo.dwIllegalType + ",车牌号码:" + srtPlate sAlarmType = sAlarmType + ":交通取证报警信息,违章类型:"+ strTFSAlarmInfo.dwIllegalType + ",车牌号码:" + srtPlate
+ ",车辆出入状态:" + strTFSAlarmInfo.struAIDInfo.byVehicleEnterState; + ",车辆出入状态:" + strTFSAlarmInfo.struAIDInfo.byVehicleEnterState;
}
catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//报警设备IP地址 //报警设备IP地址
sIP = new String(strTFSAlarmInfo.struDevInfo.struDevIP.sIpV4).split("\0", 2); 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); sIP = new String(pAlarmer.sDeviceIP).split("\0", 2);
break; break;
} }
} catch (UnsupportedEncodingException ex) { } catch (Exception ex) {
Logger.getLogger(CameraCall.class.getName()).log(Level.SEVERE, null, ex); Logger.getLogger(CameraCall.class.getName()).log(Level.SEVERE, null, ex);
} }
return true; return true;

View File

@ -8,11 +8,11 @@ import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams; import org.apache.commons.fileupload.util.Streams;
import sun.misc.BASE64Decoder;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.io.*; import java.io.*;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.*; import java.util.*;
/** /**
@ -129,16 +129,10 @@ public class UEditorUtil {
String base64Data = this.request.getParameter(fieldName); String base64Data = this.request.getParameter(fieldName);
this.fileName = this.getName("test.png"); this.fileName = this.getName("test.png");
this.url = savePath + "/" + this.fileName; this.url = savePath + "/" + this.fileName;
BASE64Decoder decoder = new BASE64Decoder();
try { try {
File outFile = new File(this.getPhysicalPath(this.url)); File outFile = new File(this.getPhysicalPath(this.url));
OutputStream ro = new FileOutputStream(outFile); OutputStream ro = new FileOutputStream(outFile);
byte[] b = decoder.decodeBuffer(base64Data); byte[] b = Base64.getMimeDecoder().decode(base64Data);
for (int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
b[i] += 256;
}
}
ro.write(b); ro.write(b);
ro.flush(); ro.flush();
ro.close(); ro.close();

View File

@ -1,11 +1,11 @@
driver=com.microsoft.sqlserver.jdbc.SQLServerDriver driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
#url=jdbc:sqlserver://127.0.0.1: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 #url=jdbc:sqlserver://122.51.194.184:1433;DatabaseName=SIPAIIS_WMS_HQAQ
username=sa username=sa
password=P76XB3nm36aMkN6n password=P76XB3nm36aMkN6n
#scada-url=jdbc:sqlserver://127.0.0.1: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-url=jdbc:sqlserver://122.51.194.184:1433;DatabaseName=EIP_PRD_HQWS
scada-username=sa scada-username=sa
scada-password=P76XB3nm36aMkN6n scada-password=P76XB3nm36aMkN6n

View File

@ -1,5 +1,11 @@
{ {
"properties": { "properties": {
"id": {
"type": "keyword"
},
"mpointid": {
"type": "keyword"
},
"parmname": { "parmname": {
"type": "text", "type": "text",
"analyzer": "ik_smart", "analyzer": "ik_smart",
@ -8,6 +14,9 @@
"mpointcode": { "mpointcode": {
"type": "keyword", "type": "keyword",
"normalizer": "my_normalizer" "normalizer": "my_normalizer"
},
"measuredt": {
"type": "date"
} }
} }
} }

View File

@ -1,6 +1,15 @@
{ {
"settings": {
"analysis": { "analysis": {
"normalizer": {
"my_normalizer": {
"type": "custom",
"char_filter": [],
"filter": [
"lowercase",
"asciifolding"
]
}
},
"analyzer": { "analyzer": {
"char_analyzer": { "char_analyzer": {
"char_filter": [ "char_filter": [
@ -17,15 +26,4 @@
} }
} }
} }
},
"mappings": {
"like_search_type": {
"properties": {
"name": {
"type": "text",
"analyzer": "char_analyzer"
}
}
}
}
} }

View File

@ -1,9 +1,9 @@
#redis<69><73><EFBFBD><EFBFBD> #redis<69><73><EFBFBD><EFBFBD>
redis.host=122.51.194.184 # redis.host=122.51.194.184
# redis.host=127.0.0.1 redis.host=127.0.0.1
#<23><><EFBFBD><EFBFBD>single <20><>Ⱥcluster #<23><><EFBFBD><EFBFBD>single <20><>Ⱥcluster
redis.mode=single redis.mode=single
redis.port=26739 redis.port=6379
# redis.port=6379 # redis.port=6379
redis.password=Aa112211 redis.password=Aa112211
redis.maxIdle=100 redis.maxIdle=100
@ -22,6 +22,6 @@ defaultCacheExpireTime=3600
fep.local.cache.capacity =10000 fep.local.cache.capacity =10000
#cluster #cluster
cluster1.host.port=122.51.194.184: 26739 #cluster1.host.port=127.0.0.1:6379

View File

@ -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 <repository-url>
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

View File

@ -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

Binary file not shown.

View File

@ -1,459 +0,0 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>智水云 - 污水处理全流程监控一张图</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://code.iconify.design/3/3.1.1/iconify.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap');
:root {
--panel-bg: rgba(15, 23, 42, 0.7);
--border-color: rgba(51, 65, 85, 0.4);
--accent-blue: #3b82f6;
}
body {
background-color: #020617;
background-image: radial-gradient(circle at 50% 50%, #0f172a 0%, #020617 100%);
color: #e2e8f0;
overflow: hidden;
height: 100vh;
font-family: "PingFang SC", "Microsoft YaHei", -apple-system, sans-serif;
display: flex;
flex-direction: column;
padding: 1rem;
}
.font-digital { font-family: 'Share+Tech+Mono', monospace; }
.glass-card {
background: var(--panel-bg);
border: 1px solid var(--border-color);
border-top: 2px solid var(--accent-blue);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
backdrop-filter: blur(4px);
display: flex;
flex-direction: column;
justify-content: space-between;
}
.glass-card:hover {
border-color: #60a5fa;
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
transform: translateY(-2px);
background: rgba(30, 41, 59, 0.6);
}
.status-pulse {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { box-shadow: 0 0 0 0px rgba(34, 197, 94, 0.7); }
70% { box-shadow: 0 0 0 6px rgba(34, 197, 94, 0); }
100% { box-shadow: 0 0 0 0px rgba(34, 197, 94, 0); }
}
.grid-container {
display: grid;
grid-template-columns: 1fr 280px;
gap: 0.75rem;
flex: 1;
min-height: 0;
overflow: hidden;
}
.stats-panel {
height: 120px;
margin-bottom: 0.75rem;
display: grid;
grid-template-columns: 1fr 1fr 2fr 280px;
gap: 0.75rem;
flex-shrink: 0;
}
.alarm-panel {
height: 100%;
background: rgba(30, 41, 59, 0.4);
border-top: 2px solid #ef4444;
display: flex;
flex-direction: column;
overflow: hidden;
}
.table-container {
background: var(--panel-bg);
border: 1px solid var(--border-color);
border-top: 2px solid var(--accent-blue);
backdrop-filter: blur(4px);
overflow: hidden;
display: flex;
flex-direction: column;
}
table {
width: 100%;
border-collapse: collapse;
text-align: left;
font-size: 0.85rem;
}
thead {
background: rgba(30, 41, 59, 0.8);
position: sticky;
top: 0;
z-index: 10;
}
th {
padding: 0.75rem 1rem;
font-weight: 600;
color: #94a3b8;
text-transform: uppercase;
letter-spacing: 0.05em;
font-size: 0.75rem;
border-bottom: 1px solid var(--border-color);
}
td {
padding: 0.65rem 1rem;
border-bottom: 1px solid rgba(51, 65, 85, 0.2);
color: #e2e8f0;
}
tbody tr:nth-child(even) {
background: rgba(255, 255, 255, 0.02);
}
tbody tr:hover {
background: rgba(59, 130, 246, 0.1);
}
.status-tag {
padding: 2px 8px;
border-radius: 9999px;
font-size: 0.7rem;
font-weight: 600;
}
.status-online { background: rgba(34, 197, 94, 0.2); color: #4ade80; border: 1px solid rgba(34, 197, 94, 0.3); }
.status-offline { background: rgba(239, 68, 68, 0.2); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.3); }
.param-chip {
display: inline-block;
background: rgba(15, 23, 42, 0.6);
padding: 2px 6px;
border-radius: 4px;
margin-right: 4px;
font-family: 'Share+Tech+Mono', monospace;
}
.param-label-mini {
color: #64748b;
font-size: 10px;
margin-right: 4px;
}
.alarm-list {
flex: 1;
overflow-y: auto;
padding: 0.5rem;
}
.alarm-list::-webkit-scrollbar { width: 4px; }
.alarm-list::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 10px; }
.alarm-item {
background: rgba(15, 23, 42, 0.5);
border-left: 3px solid transparent;
margin-bottom: 0.5rem;
padding: 0.6rem;
font-size: 0.75rem;
transition: all 0.2s;
}
.alarm-item:hover { background: rgba(15, 23, 42, 0.8); }
.alarm-high { border-left-color: #ef4444; }
.alarm-mid { border-left-color: #f59e0b; }
.alarm-low { border-left-color: #3b82f6; }
.badge {
padding: 1px 4px;
border-radius: 2px;
font-size: 0.65rem;
}
.badge-high { background: rgba(239, 68, 68, 0.2); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.3); }
.badge-mid { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.3); }
.badge-low { background: rgba(59, 130, 246, 0.2); color: #60a5fa; border: 1px solid rgba(59, 130, 246, 0.3); }
.flow-card {
padding: 1rem;
display: flex;
flex-direction: column;
justify-content: center;
border-radius: 4px;
}
.flow-card.industrial { border-top-color: #f59e0b; }
.flow-card.domestic { border-top-color: #10b981; }
.chart-container {
position: relative;
padding: 10px;
border-radius: 4px;
}
.param-label { color: #94a3b8; font-size: 0.7rem; font-weight: 500; }
.param-value { color: #f8fafc; font-size: 1.05rem; font-family: 'Share+Tech+Mono', monospace; }
.unit { font-size: 0.65rem; color: #64748b; margin-left: 2px; }
.card-header { padding: 0.6rem 0.8rem; border-bottom: 1px solid rgba(255,255,255,0.05); }
.card-body { padding: 0.6rem 0.8rem; flex: 1; }
.card-footer { padding: 0.4rem 0.8rem; background: rgba(0,0,0,0.15); border-top: 1px solid rgba(255,255,255,0.03); }
</style>
</head>
<body>
<!-- 顶部状态栏 -->
<header class="flex items-center justify-between mb-4 px-1">
<div class="flex items-center space-x-3">
<span class="iconify text-blue-500 text-3xl" data-icon="material-symbols:water-drop-outline"></span>
<div>
<h1 class="text-xl font-bold tracking-tight text-white leading-tight">智水云 · 全流程数字化管控平台</h1>
<p class="text-[10px] text-blue-400 font-mono tracking-widest uppercase" id="current-time">SYSTEM STATUS: 2026-03-22 10:45:00</p>
</div>
</div>
<div class="flex items-center space-x-6">
<div class="flex space-x-6 text-[11px] font-medium bg-slate-800/30 px-4 py-2 rounded-full border border-slate-700/50">
<span class="text-white flex items-center"><i class="w-1.5 h-1.5 bg-green-500 rounded-full mr-2"></i> 运行中: 24h</span>
<span class="text-slate-400">负荷: 78%</span>
<span class="text-slate-400">能效: 0.32 kW·h/m³</span>
</div>
<div class="flex items-center space-x-3 border-l border-slate-700 pl-6">
<div class="text-right">
<p class="text-[10px] text-slate-400 leading-none">值班主管</p>
<p class="text-xs text-white">王建国 (A组)</p>
</div>
<div class="w-8 h-8 bg-blue-600 rounded-lg flex items-center justify-center font-bold text-white shadow-lg"></div>
</div>
</div>
</header>
<!-- 核心统计区域 -->
<div class="stats-panel">
<div class="glass-card flow-card industrial">
<div class="flex items-center space-x-2 mb-2">
<span class="iconify text-orange-400" data-icon="material-symbols:factory-outline"></span>
<span class="text-[10px] font-bold text-orange-400 uppercase">工业进水累计</span>
</div>
<div class="flex justify-between items-end gap-2">
<div>
<p class="param-label text-[9px]">当日总量</p>
<p class="text-2xl font-digital text-white leading-none">10,867<span class="unit"></span></p>
</div>
<div class="text-right border-l border-slate-700/50 pl-2">
<p class="param-label text-[9px]">环比</p>
<p class="text-xs font-digital text-orange-300">+2.4% ↑</p>
</div>
</div>
</div>
<div class="glass-card flow-card domestic">
<div class="flex items-center space-x-2 mb-2">
<span class="iconify text-green-400" data-icon="material-symbols:home-outline"></span>
<span class="text-[10px] font-bold text-green-400 uppercase">生活进水累计</span>
</div>
<div class="flex justify-between items-end gap-2">
<div>
<p class="param-label text-[9px]">当日总量</p>
<p class="text-2xl font-digital text-white leading-none">7,569<span class="unit"></span></p>
</div>
<div class="text-right border-l border-slate-700/50 pl-2">
<p class="param-label text-[9px]">环比</p>
<p class="text-xs font-digital text-green-300">-1.8% ↓</p>
</div>
</div>
</div>
<div class="glass-card chart-container">
<div class="absolute top-2 left-4 z-10 flex items-center space-x-2">
<span class="w-1.5 h-1.5 bg-blue-500 rounded-full animate-pulse"></span>
<span class="text-[10px] text-slate-400 font-bold uppercase tracking-wider">进水流量7日趋势 (m³/d)</span>
</div>
<canvas id="flowChart"></canvas>
</div>
<!-- 统计面板右侧对应的告警总览 -->
<div class="glass-card flex flex-col justify-center p-3 relative overflow-hidden" style="border-top-color: #ef4444;">
<div class="absolute -right-4 -top-4 opacity-10">
<span class="iconify text-8xl text-red-500" data-icon="material-symbols:warning-outline"></span>
</div>
<div class="flex items-center justify-between mb-1">
<span class="text-[10px] font-bold text-red-400">设备运行异常</span>
<span class="badge badge-high animate-pulse">实时监控</span>
</div>
<div class="flex items-end justify-between">
<div>
<div class="text-3xl font-digital text-red-500">03</div>
<div class="text-[9px] text-slate-500 uppercase tracking-wider">Active Alarms</div>
</div>
<div class="text-right">
<div class="text-[10px] text-slate-400">待处理: <span class="text-red-400 font-digital">03</span></div>
<div class="text-[10px] text-slate-400">已闭环: <span class="text-green-500 font-digital">12</span>/今日</div>
</div>
</div>
</div>
</div>
<!-- 工艺流程数据表格 -->
<main class="grid-container">
<div class="table-container">
<div class="p-3 border-b border-slate-700/50 flex justify-between items-center bg-slate-900/40">
<div class="flex items-center space-x-2">
<span class="iconify text-blue-500" data-icon="material-symbols:AppSettings-outline"></span>
<h2 class="text-xs font-bold uppercase tracking-wider text-slate-300">全流程生产工艺实时数据概览</h2>
</div>
<div class="flex space-x-4">
<span class="text-[10px] text-green-500 flex items-center"><span class="w-2 h-2 bg-green-500 rounded-full mr-1 animate-pulse"></span> 生产正常</span>
<span class="text-[10px] text-slate-500">更新时间: 2026-03-22 10:15:30</span>
</div>
</div>
<div class="overflow-y-auto flex-1">
<table>
<thead>
<tr>
<th>工艺段名称</th>
<th>状态</th>
<th>瞬时流量 (m³/h)</th>
<th>关键参数 1</th>
<th>关键参数 2</th>
<th>关键参数 3</th>
<th class="text-right">设备ID</th>
</tr>
</thead>
<tbody>
<tr><td class="font-bold text-slate-200">01. 细格栅与提升</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,245.8</td><td><span class="param-label-mini">液位:</span><span class="param-chip text-green-400">1.8m</span></td><td><span class="param-label-mini">pH:</span><span class="param-chip text-white">7.2</span></td><td><span class="param-label-mini">主泵:</span><span class="param-chip text-white">2#</span></td><td class="text-right font-mono text-[10px] text-slate-500">P101</td></tr>
<tr><td class="font-bold text-slate-200">02. 曝气沉砂池</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,238.2</td><td><span class="param-label-mini">DO:</span><span class="param-chip text-white">2.5mg/L</span></td><td><span class="param-label-mini">速:</span><span class="param-chip text-white">35Hz</span></td><td><span class="param-label-mini">油:</span><span class="param-chip text-green-400">0.2</span></td><td class="text-right font-mono text-[10px] text-slate-500">D205</td></tr>
<tr><td class="font-bold text-slate-200">03. 初次沉淀池</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,232.0</td><td><span class="param-label-mini">SS:</span><span class="param-chip text-white">180mg/L</span></td><td><span class="param-label-mini">泥位:</span><span class="param-chip text-white">0.8m</span></td><td><span class="param-label-mini">刮泥:</span><span class="param-chip text-white">ON</span></td><td class="text-right font-mono text-[10px] text-slate-500">S302</td></tr>
<tr><td class="font-bold text-slate-200">04. A/A/O 生物反应器</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,230.5</td><td><span class="param-label-mini">厌氧ORP:</span><span class="param-chip text-white">-180mV</span></td><td><span class="param-label-mini">MLSS:</span><span class="param-chip text-white">3250</span></td><td><span class="param-label-mini">回流:</span><span class="param-chip text-white">100%</span></td><td class="text-right font-mono text-[10px] text-slate-500">B401</td></tr>
<tr><td class="font-bold text-slate-200">05. 二次沉淀池组</td><td><span class="status-tag status-offline">故障告警</span></td><td class="font-digital text-red-400">1,228.1</td><td><span class="param-label-mini">出水SS:</span><span class="param-chip text-red-400">22.4</span></td><td><span class="param-label-mini">泥层:</span><span class="param-chip text-white">1.2m</span></td><td><span class="param-label-mini">泵组:</span><span class="param-chip text-red-500">ERR</span></td><td class="text-right font-mono text-[10px] text-slate-500">S204</td></tr>
<tr><td class="font-bold text-slate-200">06. 磁混凝高效沉淀</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,225.0</td><td><span class="param-label-mini">投药:</span><span class="param-chip text-white">12.5mg/L</span></td><td><span class="param-label-mini">磁粉:</span><span class="param-chip text-white">保持</span></td><td><span class="param-label-mini">浊度:</span><span class="param-chip text-green-400">4.2</span></td><td class="text-right font-mono text-[10px] text-slate-500">M501</td></tr>
<tr><td class="font-bold text-slate-200">07. V型滤池</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,210.6</td><td><span class="param-label-mini">滤速:</span><span class="param-chip text-white">6.5m/h</span></td><td><span class="param-label-mini">水头失:</span><span class="param-chip text-white">1.2m</span></td><td><span class="param-label-mini">反冲:</span><span class="param-chip text-white">4:30</span></td><td class="text-right font-mono text-[10px] text-slate-500">F602</td></tr>
<tr><td class="font-bold text-slate-200">08. 紫外消毒/次氯酸钠</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">1,208.5</td><td><span class="param-label-mini">强度:</span><span class="param-chip text-white">35mW</span></td><td><span class="param-label-mini">余氯:</span><span class="param-chip text-green-400">0.45</span></td><td><span class="param-label-mini">运行:</span><span class="param-chip text-white">12h</span></td><td class="text-right font-mono text-[10px] text-slate-500">V501</td></tr>
<tr><td class="font-bold text-slate-200">09. 核心鼓风机房</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">254 m³</td><td><span class="param-label-mini">压:</span><span class="param-chip text-green-400">58kPa</span></td><td><span class="param-label-mini">温:</span><span class="param-chip text-white">62℃</span></td><td><span class="param-label-mini">功率:</span><span class="param-chip text-white">185kW</span></td><td class="text-right font-mono text-[10px] text-slate-500">M601</td></tr>
<tr><td class="font-bold text-slate-200 text-blue-400">10. 总出水在线监测</td><td><span class="status-tag status-online">达标运行</span></td><td class="font-digital text-blue-400">18.5k</td><td><span class="param-label-mini">COD:</span><span class="param-chip text-green-400">22.4</span></td><td><span class="param-label-mini">NH3:</span><span class="param-chip text-green-400">0.24</span></td><td><span class="param-label-mini">TP:</span><span class="param-chip text-green-400">0.08</span></td><td class="text-right font-mono text-[10px] text-slate-500">OUT-M</td></tr>
<tr><td class="font-bold text-slate-200">11. 污泥脱水系统</td><td><span class="status-tag status-online">运行中</span></td><td class="font-digital text-blue-400">--</td><td><span class="param-label-mini">含水:</span><span class="param-chip text-white">78.2%</span></td><td><span class="param-label-mini">产泥:</span><span class="param-chip text-white">12.5t</span></td><td><span class="param-label-mini">药量:</span><span class="param-chip text-white">4.2</span></td><td class="text-right font-mono text-[10px] text-slate-500">W701</td></tr>
</tbody>
</table>
</div>
<div class="px-3 py-2 border-t border-slate-700/50 bg-slate-900/40 flex justify-between items-center">
<div class="text-[10px] text-slate-500">系统就绪,当前生产效率:<span class="text-blue-400">92%</span></div>
<div class="flex space-x-2">
<button class="bg-blue-600/20 text-blue-400 text-[10px] px-3 py-1 rounded border border-blue-500/30 hover:bg-blue-600/40 transition">导出历史报表</button>
<button class="bg-slate-700 text-slate-200 text-[10px] px-3 py-1 rounded hover:bg-slate-600 transition">自定义列</button>
</div>
</div>
</div>
<!-- 15. 设备异常告警面板 (占据右侧整列) -->
<div class="glass-card alarm-panel">
<div class="card-header flex justify-between items-center bg-red-950/20">
<div class="flex items-center space-x-2">
<span class="iconify text-red-500 animate-pulse" data-icon="material-symbols:fmd-bad"></span>
<span class="text-xs font-bold text-red-100 uppercase tracking-wider">实时告警列表</span>
</div>
<div class="flex space-x-2">
<button class="text-[9px] bg-slate-800 hover:bg-slate-700 px-2 py-0.5 rounded transition">忽略全部</button>
<button class="text-[9px] bg-blue-600 hover:bg-blue-500 px-2 py-0.5 rounded transition">导出日志</button>
</div>
</div>
<div class="alarm-list">
<!-- 告警项 1 -->
<div class="alarm-item alarm-high">
<div class="flex justify-between mb-1">
<span class="badge badge-high font-bold uppercase">Critical</span>
<span class="text-[9px] text-slate-500 font-mono">10:42:15</span>
</div>
<div class="font-bold text-slate-200">鼓风机房 #2 离心风机</div>
<div class="text-[10px] text-red-400 mt-1 flex items-center">
<span class="iconify mr-1" data-icon="material-symbols:bolt"></span>
运行电流过载 (45.2A &gt; 40.0A)
</div>
<div class="flex justify-end space-x-2 mt-2">
<button class="text-[9px] border border-slate-700 hover:border-slate-500 px-2 py-1 rounded">查看详情</button>
<button class="text-[9px] bg-red-600/80 hover:bg-red-500 px-2 py-1 rounded text-white" onclick="alert('已发送工单给维保组')">立即处理</button>
</div>
</div>
<!-- 告警项 2 -->
<div class="alarm-item alarm-mid">
<div class="flex justify-between mb-1">
<span class="badge badge-mid font-bold uppercase">Warning</span>
<span class="text-[9px] text-slate-500 font-mono">10:05:21</span>
</div>
<div class="font-bold text-slate-200">2# 二沉池 吸泥机</div>
<div class="text-[10px] text-orange-400 mt-1 flex items-center">
<span class="iconify mr-1" data-icon="material-symbols:settings-backup-restore"></span>
转速异常波动 (+/- 15%)
</div>
<div class="flex justify-end space-x-2 mt-2">
<button class="text-[9px] border border-slate-700 hover:border-slate-500 px-2 py-1 rounded w-full text-slate-300">远程复位</button>
</div>
</div>
<!-- 告警项 3 -->
<div class="alarm-item alarm-low">
<div class="flex justify-between mb-1">
<span class="badge badge-low font-bold uppercase">Info</span>
<span class="text-[9px] text-slate-500 font-mono">09:12:05</span>
</div>
<div class="font-bold text-slate-200">加药间 PAC 储罐</div>
<div class="text-[10px] text-blue-300 mt-1 flex items-center">
<span class="iconify mr-1" data-icon="material-symbols:water-medium"></span>
低液位预警 (剩余 15%)
</div>
<div class="flex justify-end mt-2">
<button class="text-[9px] text-blue-400 hover:underline">申请补料</button>
</div>
</div>
</div>
<div class="card-footer text-center bg-slate-900/50 p-2 border-t border-slate-800">
<p class="text-[9px] text-slate-500 hover:text-blue-400 cursor-pointer transition">查看所有历史记录 (6张待办) »</p>
</div>
</div>
</main>
<footer class="mt-4 flex items-center justify-between px-2 text-[10px] text-slate-600 border-t border-slate-800 pt-2 h-6"> <div class="flex space-x-8">
<p>© 2026 智水云污水处理管理有限公司</p>
<p><i class="iconify inline mr-1" data-icon="material-symbols:location-on"></i> 江苏省南通市华东第二污水处理厂</p>
</div>
<div class="flex space-x-6">
<p class="flex items-center text-green-700 font-medium"><i class="iconify mr-1" data-icon="material-symbols:check-circle"></i> 云端数据实时同步中 (25ms)</p>
<p>生产智脑 V4.2.0-PROD</p>
</div>
</footer>
<script>
// 自动刷新当前时刻
function updateClock() {
const now = new Date();
const timeStr = `SYSTEM STATUS: ${now.getFullYear()}-${String(now.getMonth()+1).padStart(2,'0')}-${String(now.getDate()).padStart(2,'0')} ${String(now.getHours()).padStart(2,'0')}:${String(now.getMinutes()).padStart(2,'0')}:${String(now.getSeconds()).padStart(2,'0')}`;
document.getElementById('current-time').textContent = timeStr;
}
setInterval(updateClock, 1000);
// Chart.js 趋势分析
const ctx = document.getElementById('flowChart').getContext('2d');
const flowChart = new Chart(ctx, {
type: 'bar',
data: {
labels: ['03/16', '03/17', '03/18', '03/19', '03/20', '03/21', '03/22'],
datasets: [
{
label: '工业污水',
data: [11200, 10800, 11500, 10200, 12100, 10600, 10867],
backgroundColor: 'rgba(245, 158, 11, 0.4)',
borderColor: '#f59e0b',
borderWidth: 1.5,
borderRadius: 3
},
{
label: '生活污水',
data: [7200, 7120, 7800, 7400, 7650, 7420, 7569],
backgroundColor: 'rgba(59, 130, 246, 0.4)',
borderColor: '#3b82f6',
borderWidth: 1.5,
borderRadius: 3
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: { display: false }
},
scales: {
x: {
grid: { display: false },
ticks: { color: '#64748b', font: { size: 9 } }
},
y: {
beginAtZero: false,
grid: { color: 'rgba(255, 255, 255, 0.03)' },
ticks: { color: '#64748b', font: { size: 9 }, stepSize: 5000 }
}
}
}
});
</script>
</body>
</html>