Ver código fonte

1、增加数据源报警

lry 5 meses atrás
pai
commit
0b66c9e180

+ 14 - 0
industry-admin/src/api/source/alarmConfig.js

@@ -107,3 +107,17 @@ export function getHisAlarmLogList(params) {
         method: 'get'
     })
 }
+/**
+ * 分页获取数据源的报警日志
+ * @param {} params
+ * @returns
+ */
+export function getModuleAlarmLogList(params) {
+  return request({
+    url: '/moduleAlarmLog/getModuleAlarmLogList?' + params,
+    headers: {
+      isToken: true
+    },
+    method: 'get'
+  })
+}

+ 150 - 0
industry-admin/src/views/alarm/datasourceAlarm/index.vue

@@ -0,0 +1,150 @@
+<template>
+    <div class="sy-content">
+        <el-form ref="queryForm" :model="queryParams" size="small" :inline="true" label-width="80px">
+            <el-form-item label="开始时间" prop="startTime">
+                <el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="queryParams.startTime" type="datetime"
+                    placeholder="选择开始时间" style="width:200px">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="结束时间" prop="endTime">
+                <el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="queryParams.endTime" type="datetime"
+                    placeholder="选择结束时间" style="width:200px">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="el-icon-search" size="mini" @click="queryEvent">搜索</el-button>
+              <el-button ref="btn" type="info" icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+<!--              <el-button type="primary" icon="el-icon-download" size="mini" @click="exportAlarmHistoryEvent">导出</el-button>-->
+            </el-form-item>
+        </el-form>
+        <!-- 报警日志 -->
+        <UmyTable ref="alarmLogTable" :tableHeaderTitle="tableHeaderTitle"
+            :tableData="tableData" :isShowCheckbox="isShowCheckbox" :tableOperate="tableOperate">
+        </UmyTable>
+        <!-- 分页信息 -->
+        <pagination :total="tableTotal" :page-sizes="pageSize" :page.sync="queryParams.page"
+            :limit.sync="queryParams.limit" align="right" @pagination="getModuleAlarmLogList" />
+        <!-- 导出excel文件 -->
+        <DownloadExcel ref="downloadExcel"></DownloadExcel>
+    </div>
+</template>
+
+<script>
+import UmyTable from '@/components/UmyTable/index.vue'
+import ChooseItem from '@/views/source/dataQuery/chooseItem.vue'
+import { getModuleAlarmLogList } from '@/api/source/alarmConfig'
+import DownloadExcel from '@/components/Excel/downloadExcel'
+import qs from 'qs'
+export default {
+    components: {
+        UmyTable,
+        ChooseItem,
+        DownloadExcel
+    },
+    data() {
+        return {
+            tableHight: '600',
+            // 是否展示复选框列
+            isShowCheckbox: false,
+            // 是否展示序号索引列
+            isShowIndex: true,
+            //点位名称,点位类型,表达式,质量,数据值,数据源名称,取值时间
+            tableHeaderTitle: [
+              {
+                propName: "alarmValue",
+                labelName: "数据源",
+                width: '200'
+              },
+                {
+                    propName: "alarmText",
+                    labelName: "报警文本",
+                },
+                {
+                    propName: "alarmTime",
+                    labelName: "报警时间",
+                },
+              {
+                propName: "alarmResultTime",
+                labelName: "报警处理时间",
+              },
+            ],
+            tableData: [],
+            tableOperate: [],
+            tableTotal: 0,
+            itemList: [],
+            queryParams: {
+                page: 1,
+                limit: 10,
+                startTime: null,
+                endTime: null
+            },
+            pageSize: [10, 50, 100, 200, 500],
+        }
+    },
+    created(){
+      this.queryEvent();
+    },
+    methods: {
+      /** 重置按钮操作 */
+        resetQuery(event) {
+          this.$refs['queryForm'].resetFields();
+          this.queryEvent();
+        },
+        /** 查询事件 */
+        queryEvent() {
+            this.queryParams.page = 1
+            if(this.queryParams.startTime>this.queryParams.endTime){
+              this.$message({
+                message: '开始时间不能大于结束时间!',
+                type: 'warning'
+              })
+              return
+            }
+            this.getModuleAlarmLogList()
+        },
+        /** 分页获取报警日志 */
+        getModuleAlarmLogList() {
+            let param = qs.stringify(this.queryParams, { arrayFormat: 'repeat' })
+          getModuleAlarmLogList(param).then(res => {
+                if (!res || !res.data) {
+                    this.$message({
+                        message: '数据查询失败!',
+                        type: 'warning'
+                    })
+                    return
+                }
+                this.tableTotal = res.data.count
+                this.tableData = res.data.AlarmLogList
+            })
+        },
+      /** 导出Excel数据 */
+      exportAlarmHistoryEvent(){
+        if (this.tableData.length==0) {
+          this.$message({
+            message: '没有数据可导出',
+            type: 'warning'
+          })
+          return
+        }
+
+        //this.$refs.downloadExcel.title = '导出设备台账信息'
+        this.$refs.downloadExcel.visible = true
+        this.$refs.downloadExcel.excel.api = "/alarmConfig/downloadExcelFile"
+        this.$refs.downloadExcel.excel.queryParams = this.queryParams
+        this.$refs.downloadExcel.excel.excelKeyData = [
+          {key: "item_read_name", title: "点位", type: "string"},
+          {key: "alarmText", title: "报警文本", type: "string"},
+          {key: "alarmType", title: "报警级别", type: "string"},
+          {key: "alarmValue", title: "报警值", type: "string"},
+          {key: "alarmTime", title: "报警时间", type: "date", format: "yyyy-MM-dd hh:mm:ss"},
+        ];
+      }
+    }
+}
+</script>
+<style rel="stylesheet/scss" lang="scss">
+.plTableBox .el-table th{
+  background-color: #e9e9e9;
+  color: #676666;
+}
+</style>

+ 6 - 0
industry-admin/src/views/mobile/mobileSetting/index.vue

@@ -51,6 +51,12 @@
 
             </template>
           </el-table-column>
+          <el-table-column
+            align="left"
+            label="排序号"
+            prop="sortNum"
+            width="200">
+          </el-table-column>
           <el-table-column label="操作" align="left" width="200">
             <template slot-scope="scope">
               <el-button type="text"

+ 2 - 2
industry-admin/src/views/mobile/mobileSetting/reportAuthUser.vue

@@ -13,7 +13,7 @@
             </div>
             <div style="height: calc(100% - 50px); overflow: auto">
               <!-- 树节点 -->
-              <div style="height: 100%;overflow: auto;">
+              <div style="height: 100%;overflow-y: auto;">
                 <virtual-tree class="cy-group-tree" ref="deptUserTree" :data="treeData" :indent="10"
                               node-key="id" :filter-node-method="filterLabelEvent" @node-click="handleLabelNodeClick"
                               :check-on-click-node="true"  :show-checkbox="true" :highlight-current="true"
@@ -130,7 +130,7 @@ export default {
   width: 80vh;
   .el-dialog__body {
     height: 48vh;
-    overflow: hidden;
+    overflow: auto;
   }
 }
 

+ 1 - 0
industry-admin/src/views/mobile/userItemSetting/index.vue

@@ -61,6 +61,7 @@ export default {
           align: "left"
         },
 
+
       ],
       tableData: [],
       tableOperate: [

+ 8 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/controller/ModuleAlarmLogController.java

@@ -11,9 +11,11 @@ import com.example.opc_da.util.UserUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 @RestController
 @RequestMapping("moduleAlarmLog")
@@ -37,4 +39,10 @@ public class ModuleAlarmLogController {
     public Result getModuleAlarmLogByNoResultAndDataSource() {
         return moduleAlarmLogService.selectModuleAlarmLogByNoResult(ModuleAlarmLogTypeEnum.DATA_SOURCE.getValue(), userUtil.getCurrentUserId());
     }
+    @GetMapping("/getModuleAlarmLogList")
+    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.MODULE_ALARM_LOG, OperationEnum = OperationEnum.SELECT)
+    public Result getModuleAlarmLogList(String startTime, String endTime,
+                                     @RequestParam Integer page, @RequestParam Integer limit) {
+        return moduleAlarmLogService.getModuleAlarmLogList(startTime, endTime, page, limit);
+    }
 }

+ 4 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/dao/ModuleAlarmLogDao.java

@@ -38,4 +38,8 @@ public interface ModuleAlarmLogDao {
 
     ModuleAlarmLog selectModuleAlarmLogByNoResult(String alarmType, String alarmObjectUserId);
 
+    Integer getModuleAlarmLogListCount(String userId,String startTime, String endTime);
+
+    List<ModuleAlarmLog> getModuleAlarmLogList(String userId,String startTime, String endTime, Integer startNum, Integer limit);
+
 }

+ 3 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/service/ModuleAlarmLogService.java

@@ -1,10 +1,13 @@
 package com.example.opc_da.service;
 
 import com.example.opc_common.util.Result;
+import org.springframework.web.bind.annotation.RequestParam;
 
 public interface ModuleAlarmLogService {
 
     Integer selectModuleAlarmLogByNoResultCount(String alarmType, String alarmObjectId);
 
     Result selectModuleAlarmLogByNoResult(String alarmType, String alarmObjectUserId);
+
+    Result getModuleAlarmLogList(String startTime, String endTime,Integer page, Integer limit);
 }

+ 21 - 0
industry-system/industry-da/src/main/java/com/example/opc_da/service/impl/ModuleAlarmLogServiceImpl.java

@@ -1,18 +1,25 @@
 package com.example.opc_da.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.example.opc_common.entity.AlarmLog;
+import com.example.opc_common.entity.ModuleAlarmLog;
 import com.example.opc_common.util.Result;
 import com.example.opc_da.dao.ModuleAlarmLogDao;
 import com.example.opc_da.service.ModuleAlarmLogService;
+import com.example.opc_da.util.UserUtil;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.List;
 
 @Service
 @Transactional
 public class ModuleAlarmLogServiceImpl implements ModuleAlarmLogService {
 
     @Resource
+    private UserUtil userUtil;
+    @Resource
     private ModuleAlarmLogDao moduleAlarmLogDao;
 
     @Override
@@ -25,4 +32,18 @@ public class ModuleAlarmLogServiceImpl implements ModuleAlarmLogService {
 
         return Result.ok(moduleAlarmLogDao.selectModuleAlarmLogByNoResult(alarmType, alarmObjectUserId));
     }
+
+    @Override
+    public Result getModuleAlarmLogList(String startTime, String endTime,Integer page, Integer limit){
+        JSONObject jsonObject = new JSONObject();
+
+        String userId = userUtil.getCurrentUserId();
+
+        Integer count = moduleAlarmLogDao.getModuleAlarmLogListCount(userId,startTime, endTime);
+        Integer startNum = (page - 1) * limit;
+        List<ModuleAlarmLog> moduleAlarmLogList = moduleAlarmLogDao.getModuleAlarmLogList(userId,startTime, endTime, startNum, limit);
+        jsonObject.put("count", count);
+        jsonObject.put("AlarmLogList", moduleAlarmLogList);
+        return Result.ok(jsonObject);
+    }
 }

+ 1 - 1
industry-system/industry-da/src/main/resources/application-dev.yml

@@ -24,7 +24,7 @@ spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     #url: jdbc:mysql://localhost:3306/in_data_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
-    url: jdbc:mysql://192.168.1.253:3306/in_data_db3?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
+    url: jdbc:mysql://192.168.1.253:3306/in_data_db?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8
     username: root
     #password: root
     password: jd@2021

+ 27 - 2
industry-system/industry-da/src/main/resources/mapper/ModuleAlarmLog.xml

@@ -21,12 +21,12 @@
         </foreach>
     </update>
 
-    <select id="selectModuleAlarmLogByNoResultCount">
+    <select id="selectModuleAlarmLogByNoResultCount" resultType="java.lang.Integer">
         select count(*) from t_module_alarm_log
         where alarm_result = 0 and alarm_type = #{alarmType} and alarm_object_id = #{alarmObjectId}
     </select>
 
-    <select id="selectModuleAlarmLogByNoResult">
+    <select id="selectModuleAlarmLogByNoResult" resultType="com.example.opc_common.entity.ModuleAlarmLog">
         select tmal.id,tmal.alarm_text,tmal.alarm_time,tmal.alarm_type,tmal.alarm_object_id
         from t_module_alarm_log tmal
         <if test="alarmType = 'dataSource'">
@@ -36,4 +36,29 @@
         order by tmal.alarm_time desc
         limit 1
     </select>
+
+    <select id="getModuleAlarmLogListCount" resultType="java.lang.Integer">
+        select count(*) from t_module_alarm_log a
+        where a.alarm_object_user_id = #{userId}
+        <if test="startTime != null and startTime != ''">
+            AND a.alarm_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND a.alarm_time &lt;= #{endTime}
+        </if>
+    </select>
+
+    <select id="getModuleAlarmLogList" resultType="com.example.opc_common.entity.ModuleAlarmLog">
+        select tmal.id,tmal.alarm_text,tmal.alarm_time,tmal.alarm_type,tmal.alarm_object_id,tmal.alarm_result_time,tds.data_source_name alarm_value
+        from t_module_alarm_log tmal inner join t_data_source tds on tmal.alarm_object_id = tds.id
+        where tmal.alarm_object_user_id = #{userId}
+        <if test="startTime != null and startTime != ''">
+            AND tmal.alarm_time &gt;= #{startTime}
+        </if>
+        <if test="endTime != null and endTime != ''">
+            AND tmal.alarm_time &lt;= #{endTime}
+        </if>
+        order by tmal.alarm_time desc
+        limit #{startNum}, #{limit}
+    </select>
 </mapper>

+ 2 - 1
industry-system/industry-da/src/main/resources/static/reportSheet/js/index.js

@@ -65,10 +65,11 @@ const indexFn = {
 			if (layui.rightMenu) {
 				layui.rightMenu.data.chart = {}
 			}
-			layui.sheetTypew.open(function() {
+			layui.rightMenu.data.sheetTypeWinIndex = layui.sheetTypew.open(function() {
 				layui.rightMenu.init('rightMenuList')
 				layui.sheetUtil.init(null, null, data)
 			})
+			console.log(layui.rightMenu.data.sheetTypeWinIndex)
 		}
 	},
 }

+ 3 - 3
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-list-table.js

@@ -576,7 +576,7 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			if (fn.data.type != 'edit') {
 				cols.push({title: '操作', width: 130, templet: function(d) {
 					return `
-						<span lay-event="del" class="layui-font-red " style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
+						<span lay-event="del" class="layui-font-red " style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除1</span>
 					`
 				}})
 			}
@@ -622,7 +622,7 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			if (fn.data.type != 'edit') {
 				cols.push({title: '操作', width: 130, templet: function(d) {
 					return `
-						<span lay-event="del" class="layui-font-red " style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
+						<span lay-event="del" class="layui-font-red " style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除2</span>
 					`
 				}})
 			}
@@ -682,7 +682,7 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			if (fn.data.type != 'edit') {
 				cols.push({title: '操作', width: 130, templet: function(d) {
 					return `
-						<span lay-event="del" class="layui-font-red" style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
+						<span lay-event="del" class="layui-font-red" style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除3</span>
 					`
 				}})
 			}

+ 15 - 14
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/right-menu.js

@@ -24,7 +24,7 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 		}
 	})
 	//模板删除
-	table.on('tool(item-list-table)', function(obj) {
+	table.on('tool(itemTemp-list-table)', function(obj) {
 		if (obj.event == 'delsystemp') {//删除模板
 			layer.confirm('确认要删除该模板吗?', {
 				btn: ['确定', '取消']
@@ -52,7 +52,6 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 				layer.msg('请选择模板!', {icon: 2})
 				return
 			}
-	
 			layer.confirm('应用模板将会覆盖当前报表,是否继续操作?', {
 				btn: ['确认', '取消']
 			}, function(idx) {
@@ -76,13 +75,14 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 						layui.sheetUtil.init(null,null, data)
 					}
 					layer.close(idx)
-					layer.close(2)
+					layer.close(fn.data.templateWinIndex)
+					layer.close(fn.data.sheetTypeWinIndex)
 				})
 			})
 		}
 	})
 	//模板选择
-	table.on('radio(item-list-table)', function(obj){
+	table.on('radio(itemTemp-list-table)', function(obj){
 		layui.sheetTypew.seltemplateId = obj.data.id
 	});
 	//手动录入项表格事件
@@ -112,7 +112,6 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 		layui.manualItemWin.selManualItemId = obj.data.id
 		layui.manualItemWin.selManualItemName = obj.data.fieldName
 		layui.manualItemWin.selManualItemDefaultValue = obj.data.defaultValue
-		console.log(obj.data)
 	});
 	
 	util.on({
@@ -435,7 +434,7 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 			})
 		},
 		template: function() {
-			fn.openReportTemplate()
+			fn.data.templateWinIndex = fn.openReportTemplate()
 		},
 		//基础数据项
 		basedata: function() {
@@ -456,7 +455,7 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 			if(layui.sheetTypew.templateReportId>0){
 				fn.openTemplateManualItem(layui.sheetTypew.templateReportId)
 			}else{
-				layer.msg('请先保存模板!', {icon: 2})
+				layer.msg('请先录入报表名称并保存!', {icon: 2})
 				return
 			}
 		},
@@ -637,7 +636,9 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 	
 	const fn = {
 		data: {
-			chart: {}
+			chart: {},
+			templateWinIndex:-1,
+			sheetTypeWinIndex:-1
 		},
 		init: function(id) {
 			let html = ''
@@ -856,8 +857,8 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 				}
 			});
 		},
-		openReportTemplate: function() {
-			layer.open({
+		openReportTemplate: function(pwinIndex) {
+			return layer.open({
 				type: 1,
 				title: ['选择模板', 'text-align: center;padding-left: 81px;'],
 				area: ['80%', '60%'],
@@ -881,11 +882,11 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 								<button type="button" class="layui-btn layui-btn-sm" lay-on="templateSearchEvent"><i class="layui-icon layui-icon-search"></i>搜索</button>
 							</div>
 							<div class="layui-inline" style="float:right">
-								<button type="button" class="layui-btn layui-btn-sm" lay-on="templateNewEvent" style="margin-top: 5px;"><i class="layui-icon layui-icon-search"></i>新增</button>
+								<button type="button" class="layui-btn layui-btn-sm" lay-on="templateNewEvent" style="margin-top: 5px;"><i class="layui-icon">&#xe654;</i>新增</button>
 							</div>
 							
 						</div>
-					    <div id="item-list-table" lay-filter="item-list-table"></div> 
+					    <div id="itemTemp-list-table" lay-filter="itemTemp-list-table"></div> 
 						<!--<div class="report-list layui-row layui-padding-3">
 							
 						</div> -->
@@ -941,7 +942,7 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 							//console.log(layui.sheetTypew.templateName)
 							layer.close(idx)
 							layer.close(index)
-							layer.close(1)
+							layer.close(pwinIndex)
 						})
 					})
 				}
@@ -1045,7 +1046,7 @@ layui.define(['layer', 'util', 'jquery','table','form', 'sheetTypew','tempWin' ,
 						`
 					}})
 				table.render({
-					elem: '#item-list-table',
+					elem: '#itemTemp-list-table',
 					height: 350,
 					cols: [cols],
 					data: json.data

+ 5 - 5
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/sheet-type-window.js

@@ -36,10 +36,10 @@ layui.define(['layer', 'form', 'jquery'], function(exports) {
 					<label class="layui-form-label">报表类型:</label>
 					<div class="layui-input-block">
 						<input type="radio" lay-filter="sheetType" name="sheet" value="0" title="手动报表">
-						<input type="radio" lay-filter="sheetType" name="sheet" value="1" title="自动报表">
+						<input type="radio" lay-filter="sheetType" name="sheet" value="1" title="自动报表" checked>
 					</div>
-					<div class="layui-input-block auto-sheet layui-hide">
-						<input type="radio" lay-filter="sheetType2" name="sheet2" value="1" title="周期报表">
+					<div class="layui-input-block auto-sheet">
+						<input type="radio" lay-filter="sheetType2" name="sheet2" value="1" title="周期报表" checked>
 						<input type="radio" lay-filter="sheetType2" name="sheet2" value="2" title="事件驱动报表">
 						<input type="radio" lay-filter="sheetType2" name="sheet2" value="5" title="设备报表">
 					</div>
@@ -61,7 +61,7 @@ layui.define(['layer', 'form', 'jquery'], function(exports) {
 		</div>`,
 		open: function(callback) {
 			const _this = this
-			layer.open({
+			return layer.open({
 				type: 1,
 				area: ['700px', '280px'],
 				title: ['选择报表类型', 'text-align: center;padding-left: 81px;font-size: 18px;'],
@@ -81,7 +81,7 @@ layui.define(['layer', 'form', 'jquery'], function(exports) {
 					//如果是从模板新建,打开模板选择窗口
 					
 					if(data.newsheet==1){
-						layui.rightMenu.openReportTemplate()
+						layui.rightMenu.data.templateWinIndex = layui.rightMenu.openReportTemplate(index)
 					}else{
 						layer.close(index);
 						if (callback) {