Просмотр исходного кода

feat: 新增告警配置模块及导出功能

yusheng 4 месяцев назад
Родитель
Сommit
f310561193

+ 15 - 0
src/api/system/file/index.js

@@ -143,3 +143,18 @@ export async function importPBom(data) {
   }
   return Promise.reject(new Error(res.data.message));
 }
+/**
+ * 导出
+ */
+export async function exportTable(data) {
+  const res = await request.post(
+    data.api,
+    data.data,
+    {
+      responseType: 'blob'
+    }
+  );
+  console.log(res.data, '***********');
+  download(res.data, data.fileName+'.xlsx');
+
+}

+ 61 - 0
src/api/warning/index.js

@@ -0,0 +1,61 @@
+import request from '@/utils/request';
+
+/**
+ * 列表
+ */
+export async function getList(params) {
+  const res = await request.get('/eam/alarmsetting/page', { params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 保存
+ */
+export async function save(data) {
+  const res = await request.post('/eam/alarmsetting/save', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 修改
+ */
+export async function update(data) {
+  const res = await request.put('/eam/alarmsetting/update', data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+// // 详情
+export async function getById(id) {
+  const res = await request.get(`/eam/alarmsetting/getById/${id}`);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 删除
+ */
+export async function remove(data) {
+  const res = await request.delete(`/eam/alarmsetting/delete`, { data });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+
+/**
+ * 列表
+ */
+export async function alarmlogsheetPage(params) {
+  const res = await request.get('/eam/alarmlogsheet/page', { params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}

+ 165 - 0
src/components/DepartmentTree/index.vue

@@ -0,0 +1,165 @@
+<template>
+  <div class="tree-wrapper">
+    <el-tree
+      :data="treeList"
+      :props="defaultProps"
+      v-loading="treeLoading"
+      :node-key="nodeKey"
+      ref="tree"
+      :highlight-current="true"
+      :expand-on-click-node="false"
+      @node-click="handleNodeClick"
+      v-bind="$attrs"
+      :default-expand-all="defaultExpandAll"
+    >
+    </el-tree>
+  </div>
+</template>
+
+<script>
+  import { listOrganizations } from '@/api/system/organization';
+  // let originId = '';
+  // let originType = '';
+  export default {
+    props: {
+      // treeList私有化处理
+      treeFormate: {
+        type: Function,
+        default: null
+      },
+      defaultProps: {
+        type: Object,
+        default: function () {
+          return {
+            children: 'children',
+            value: 'id',
+            label: 'name'
+          };
+        }
+      },
+      defaultExpandAll: {
+        type: Boolean,
+        default: function () {
+          return true;
+        }
+      },
+      // 初始请求treeList
+      init: {
+        type: Boolean,
+        default: true
+      },
+
+      isFirstRefreshTable: {
+        type: Boolean,
+        default: true
+      },
+      id: {
+        type: String,
+        default: '0'
+      },
+      nodeKey: {
+        type: String,
+        default: 'id'
+      }
+      // appendRoot: {
+      //   type: Boolean,
+      //   default: false
+      // },
+    },
+    data() {
+      return {
+        treeList: [],
+        treeLoading: false,
+        parentName: '',
+        parentId: '',
+        currentKey: ''
+      };
+    },
+    mounted() {
+      if (this.init) {
+        this.getTreeData();
+      }
+    },
+    methods: {
+      getInstance() {
+        return this.$refs.tree;
+      },
+      // 获取树结构数据
+      async getTreeData(params = {}) {
+        try {
+          this.treeLoading = true;
+
+          const data = await listOrganizations(params);
+          this.treeLoading = false;
+          this.$emit('setRootId', data[0].id);
+          this.treeList = this.$util.toTreeData({
+            data: data || [],
+            idField: 'id',
+            parentIdField: 'parentId'
+          });
+          this.$nextTick(() => {
+            // 默认高亮第一级树节点
+            if (this.treeList[0] && this.isFirstRefreshTable) {
+              this.setCurrentKey(this.treeList[0].id);
+              this.handleNodeClick(
+                this.treeList[0],
+                this.$refs.tree.getCurrentNode()
+              );
+            }
+          });
+          return this.treeList;
+        } catch (error) {
+          console.error(error);
+        }
+        this.treeLoading = false;
+      },
+      // 递归 - 往树children里面添加parentName
+      // _setParentName (tree) {
+      //   let data = tree;
+      //   for (let i = 0; i < data.length; i++) {
+      //     if (data[i].parentId === '0') {
+      //       this.parentName = data[i].name;
+      //       originId = data[i].id;
+      //       originType = data[i].type;
+      //     }
+
+      //     data[i]['originId'] = originId;
+      //     data[i]['originType'] = originType;
+      //     data[i]['parentId'] = data[i]['parentId'];
+      //     if (data[i].children && data[i].children.length > 0) {
+      //       this._setParentName(data[i].children);
+      //     }
+      //   }
+      //   return data;
+      // },
+
+      handleNodeClick(data, node) {
+        this.$emit('handleNodeClick', data, node);
+      },
+      // 设置默认高亮行
+      setCurrentKey(id) {
+        this.currentKey = id;
+        this.$refs.tree.setCurrentKey(this.currentKey);
+      },
+
+      // 获取树的选中状态
+      getSelectList() {
+        const selectList = this.$refs.tree.getCurrentNode();
+        return selectList;
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .tree-wrapper {
+    width: 100%;
+    height: 100%;
+    overflow: auto;
+
+    :deep(.el-tree) {
+      display: inline-block;
+      min-width: 100%;
+    }
+  }
+</style>

+ 94 - 0
src/components/user-select/user-select-search.vue

@@ -0,0 +1,94 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    size="small"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="24">
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+      <el-form-item>
+          <el-input
+            clearable
+            size="small"
+            v-model.trim="where.jobNumber"
+            placeholder="请输入工号"
+          />
+        </el-form-item>
+        </el-col>
+
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+
+
+        <el-form-item>
+          <el-input
+            clearable
+            size="small"
+            v-model.trim="where.loginName"
+            placeholder="请输入用户账号"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { md: 6 } : { span: 6 }">
+        <el-form-item>
+          <el-input
+            clearable
+            size="small"
+            v-model.trim="where.name"
+            placeholder="请输入姓名"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ?  { md: 6 } : { span: 6 }">
+        <el-form-item>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+          >
+            查询
+          </el-button>
+          <el-button @click="reset">重置</el-button>
+          <slot></slot>
+        </el-form-item>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        jobNumber: '',
+        loginName: '',
+        name: ''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere }
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    methods: {
+      /* 搜索 */
+      search() {
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>

+ 226 - 0
src/components/user-select/user-select.vue

@@ -0,0 +1,226 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="visible"
+    :before-close="handleClose"
+    :close-on-click-modal="false"
+    top="5vh"
+    :close-on-press-escape="false"
+    append-to-body
+    width="70%"
+  >
+    <el-card shadow="never">
+      <ele-split-layout
+        width="244px"
+        allow-collapse
+        :right-style="{ overflow: 'hidden' }"
+      >
+        <div class="ele-border-lighter split-layout-right-content">
+          <DepartmentTree
+            @handleNodeClick="handleNodeClick"
+            :isFirstRefreshTable="false"
+            ref="treeList"
+          />
+        </div>
+        <!-- 表格 -->
+        <template v-slot:content>
+          <user-select-search @search="reload"></user-select-search>
+          <ele-pro-table
+            ref="table"
+            :columns="columns"
+            :datasource="datasource"
+            row-key="id"
+            height="calc(100vh - 430px)"
+            class="dict-table"
+            @cell-click="cellClick"
+          >
+            <!-- 表头工具栏 -->
+            <template v-slot:action="{ row }">
+              <el-radio class="radio" v-model="radio" :label="row.id"
+                ><i></i
+              ></el-radio>
+            </template>
+          </ele-pro-table>
+        </template>
+      </ele-split-layout>
+    </el-card>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" size="small" @click="selected">选择</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  import { getUserPage } from '@/api/system/organization';
+  import DepartmentTree from '@/components/DepartmentTree/index.vue';
+  import userSelectSearch from './user-select-search.vue';
+  export default {
+    components: {
+      DepartmentTree,
+      userSelectSearch
+    },
+
+    data() {
+      return {
+        currentIndex: 0,
+        title: '选择',
+        visible: false,
+        statusOptions: [
+          { value: 1, label: '全职' },
+          { value: 2, label: '兼职' },
+          { value: 3, label: '实习' },
+          { value: 4, label: '正式' },
+          { value: 5, label: '试用' },
+          { value: 6, label: '离职' }
+        ],
+        columns: [
+          {
+            action: 'action',
+            slot: 'action',
+            align: 'center',
+            label: '选择'
+          },
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'name',
+            label: '姓名',
+            sortable: 'custom',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'jobNumber',
+            label: '工号',
+            sortable: 'custom',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'loginName',
+            label: '用户账号',
+            sortable: 'custom',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'sex',
+            label: '性别',
+            sortable: 'custom',
+            showOverflowTooltip: true,
+            minWidth: 80,
+            formatter: (_row, _column, cellValue) => {
+              return cellValue == 1 ? '男' : cellValue == 2 ? '女' : '';
+            }
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            sortable: 'custom',
+            width: 80,
+            formatter: (_row, _column, cellValue) => {
+              const dom = this.statusOptions.find((item) => {
+                return item.value == cellValue;
+              });
+              return dom ? dom.label : '';
+            }
+          }
+        ],
+
+        radio: null
+      };
+    },
+
+    watch: {},
+    methods: {
+      open(item, index = 0) {
+        if (item) {
+          this.radio = item.id;
+        }
+        this.currentIndex = index;
+
+        this.visible = true;
+      },
+
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getUserPage({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ pageNum: 1, where: where });
+      },
+
+      handleNodeClick(data, node) {
+        this.curNodeData = data;
+        this.reload({ groupId: data.id });
+      },
+
+      // 单击获取id
+      cellClick(row) {
+        this.current = row;
+        this.radio = row.id;
+      },
+      handleClose() {
+        this.visible = false;
+        this.current = null;
+        this.radio = '';
+      },
+
+      selected() {
+        if (!this.current) {
+          return this.$message.warning('请至少选择一项');
+        }
+        this.$emit('changeParent', this.current, this.currentIndex);
+        this.handleClose();
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .tree_col {
+    border: 1px solid #eee;
+    padding: 10px 0;
+    box-sizing: border-box;
+    height: 500px;
+    overflow: auto;
+  }
+
+  .table_col {
+    padding-left: 10px;
+
+    ::v-deep .el-table th.el-table__cell {
+      background: #f2f2f2;
+    }
+  }
+
+  .pagination {
+    text-align: right;
+    padding: 10px 0;
+  }
+
+  .btns {
+    text-align: center;
+    padding: 10px 0;
+  }
+
+  .topsearch {
+    margin-bottom: 15px;
+  }
+</style>

+ 423 - 0
src/views/alarmConfiguration/alarmDialog.vue

@@ -0,0 +1,423 @@
+<template>
+  <ele-modal
+    :visible.sync="visible"
+    :title="isEdit ? '编辑告警配置' : '新增告警配置'"
+    width="70%"
+    append-to-body
+    :maxable="true"
+    @close="cancel"
+  >
+    <el-form
+      ref="form"
+      :model="form"
+      :rules="rules"
+      label-width="120px"
+      class="el-form-box"
+    >
+      <!-- 第一部分:基本信息 -->
+      <header-title title="基本信息"></header-title>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="告警级别:" prop="alarmLevel">
+            <el-select v-model="form.alarmLevel" placeholder="请选择" style="width: 100%">
+              <el-option
+                v-for="item in options.alarmLevel"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="告警名称:" prop="alarmName">
+            <el-input v-model="form.alarmName" placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="告警对象:" prop="alarmTarget">
+            <el-select v-model="form.alarmTarget" placeholder="请选择" style="width: 100%">
+              <el-option
+                v-for="item in options.alarmTarget"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="告警设备类型:" prop="deviceType">
+            <el-select v-model="form.deviceType" placeholder="请选择" style="width: 100%">
+              <el-option
+                v-for="item in options.deviceType"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="16">
+          <el-form-item label="告警描述:" prop="alarmDesc">
+            <el-input v-model="form.alarmDesc" placeholder="请输入" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="状态:" prop="status">
+            <el-switch v-model="form.status" active-color="#409EFF"></el-switch>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <!-- 添加设备表格 -->
+      <div class="table-header">
+        <el-button type="primary" size="small" @click="addDevice">添加设备</el-button>
+      </div>
+      <el-table :data="form.deviceList" border style="width: 100%; margin-bottom: 20px" max-height="250">
+        <el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
+        <el-table-column prop="meterCode" label="表计编码" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="meterNumber" label="表计编号" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="meterName" label="表计名称" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="meterType" label="表计类型" min-width="100" align="center"></el-table-column>
+        <el-table-column prop="energyType" label="用能分类" min-width="100" align="center"></el-table-column>
+        <el-table-column prop="energyArea" label="用能分区" min-width="100" align="center"></el-table-column>
+        <el-table-column prop="useDept" label="使用部门" min-width="100" align="center"></el-table-column>
+        <el-table-column prop="ownerDept" label="权属部门" min-width="100" align="center"></el-table-column>
+        <el-table-column prop="areaManager" label="片区负责人" min-width="100" align="center"></el-table-column>
+        <el-table-column label="操作" width="80" align="center" fixed="right">
+          <template slot-scope="scope">
+            <el-button type="text" class="danger-text" @click="removeDevice(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 第二部分:触发条件 -->
+      <header-title title="触发条件"></header-title>
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="触发条件:" prop="triggerCondition">
+            <el-select v-model="form.triggerCondition" placeholder="请选择" style="width: 100%">
+              <el-option
+                v-for="item in options.triggerCondition"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <!-- 条件列表 -->
+      <div class="condition-list">
+        <div v-for="(item, index) in form.conditions" :key="index" class="condition-row">
+          <div class="condition-item">
+            <el-select v-model="item.field" placeholder="请选择">
+              <el-option
+                v-for="field in options.conditionField"
+                :key="field.value"
+                :label="field.label"
+                :value="field.value"
+              ></el-option>
+            </el-select>
+          </div>
+          <div class="condition-item">
+            <el-select v-model="item.operator" placeholder="=">
+              <el-option
+                v-for="op in options.conditionOperator"
+                :key="op.value"
+                :label="op.label"
+                :value="op.value"
+              ></el-option>
+            </el-select>
+          </div>
+          <div class="condition-item value-item">
+            <template v-if="item.field === 'energyType' || item.field === 'energyArea'">
+              <el-select v-model="item.value" placeholder="请选择">
+                <el-option
+                  v-for="val in options.energyValue"
+                  :key="val.value"
+                  :label="val.label"
+                  :value="val.value"
+                ></el-option>
+              </el-select>
+            </template>
+            <template v-else>
+              <el-input type="number" v-model="item.value" placeholder="请输入">
+                <template slot="append">{{ getUnitLabel(item.unit) }}</template>
+              </el-input>
+            </template>
+          </div>
+          <span class="condition-link">且</span>
+          <el-button type="text" class="danger-text" @click="removeCondition(index)">删除</el-button>
+        </div>
+        <el-button type="text" class="add-condition-btn" @click="addCondition">
+          <i class="el-icon-plus"></i> 增加条件
+        </el-button>
+      </div>
+
+      <!-- 第三部分:通知设置 -->
+      <header-title title="通知设置"></header-title>
+      <div class="table-header">
+        <el-button type="primary" size="small" @click="addNotifyPerson">添加</el-button>
+      </div>
+      <el-table :data="form.notifyList" border style="width: 100%" max-height="250">
+        <el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
+        <el-table-column label="通知人" min-width="150" align="center">
+          <template slot-scope="scope">
+            <el-select v-model="scope.row.person" placeholder="请选择" style="width: 100%">
+              <el-option
+                v-for="person in options.notifyPerson"
+                :key="person.value"
+                :label="person.label"
+                :value="person.value"
+              ></el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="手机号码" min-width="150" align="center">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.phone" placeholder="请输入手机号码" />
+          </template>
+        </el-table-column>
+        <el-table-column label="邮箱" min-width="150" align="center">
+          <template slot-scope="scope">
+            <el-input v-model="scope.row.email" placeholder="请输入邮箱" />
+          </template>
+        </el-table-column>
+        <el-table-column label="通知方式" min-width="200" align="center">
+          <template slot-scope="scope">
+            <el-checkbox v-model="scope.row.notifySms">短信</el-checkbox>
+            <el-checkbox v-model="scope.row.notifyEmail">邮件</el-checkbox>
+            <el-checkbox v-model="scope.row.notifySystem">系统</el-checkbox>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="80" align="center" fixed="right">
+          <template slot-scope="scope">
+            <el-button type="text" class="danger-text" @click="removeNotifyPerson(scope.$index)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+
+    <template v-slot:footer>
+      <el-button type="primary" @click="save()" v-loading="loading">确定</el-button>
+      <el-button @click="cancel">取消</el-button>
+    </template>
+  </ele-modal>
+</template>
+
+<script>
+  const defForm = {
+    alarmLevel: '',
+    alarmName: '',
+    alarmTarget: 'device',
+    deviceType: '',
+    alarmDesc: '',
+    status: true,
+    deviceList: [
+      { meterCode: 'D-1008#', meterNumber: '090809', meterName: '08#电表', meterType: '电表', energyType: '用电', energyArea: '生产区', useDept: '', ownerDept: '', areaManager: '' },
+      { meterCode: 'D-1007#', meterNumber: '070707', meterName: '07#电表', meterType: '电表', energyType: '用电', energyArea: '生活区', useDept: '', ownerDept: '', areaManager: '' },
+      { meterCode: 'D-1006#', meterNumber: '060606', meterName: '06#电表', meterType: '电表', energyType: '用电', energyArea: '办公区', useDept: '', ownerDept: '', areaManager: '' }
+    ],
+    triggerCondition: 'all',
+    conditions: [
+      { field: 'energyType', operator: 'eq', value: 'water' },
+      { field: 'energyArea', operator: 'eq', value: '' },
+      { field: 'dailyUsage', operator: 'gte', value: '1000', unit: 'm³' },
+      { field: 'monthlyUsage', operator: 'gte', value: '30000', unit: 'm³' }
+    ],
+    notifyList: [
+      { person: '', phone: '', email: '', notifySms: false, notifyEmail: false, notifySystem: false },
+      { person: '', phone: '', email: '', notifySms: false, notifyEmail: false, notifySystem: false },
+      { person: '', phone: '', email: '', notifySms: false, notifyEmail: false, notifySystem: false }
+    ]
+  };
+
+  // 选项配置数据
+  const optionsConfig = {
+    alarmLevel: [
+      { label: '紧急', value: 'urgent' },
+      { label: '重要', value: 'important' },
+      { label: '一般', value: 'normal' },
+      { label: '提示', value: 'info' }
+    ],
+    alarmTarget: [
+      { label: '数采设备', value: 'device' },
+      { label: '用能统计', value: 'energy' }
+    ],
+    deviceType: [
+      { label: '电表', value: 'electric' },
+      { label: '水表', value: 'water' },
+      { label: '气表', value: 'gas' }
+    ],
+    triggerCondition: [
+      { label: '当满足以下所有条件时', value: 'all' },
+      { label: '当满足以下任一条件时', value: 'any' }
+    ],
+    conditionField: [
+      { label: '用能分类', value: 'energyType' },
+      { label: '用能分区', value: 'energyArea' },
+      { label: '日用量', value: 'dailyUsage' },
+      { label: '月用量', value: 'monthlyUsage' }
+    ],
+    conditionOperator: [
+      { label: '=', value: 'eq' },
+      { label: '>', value: 'gt' },
+      { label: '<', value: 'lt' },
+      { label: '>=', value: 'gte' },
+      { label: '<=', value: 'lte' }
+    ],
+    energyValue: [
+      { label: '用水', value: 'water' },
+      { label: '用电', value: 'electric' },
+      { label: '用气', value: 'gas' }
+    ],
+    notifyPerson: [
+      { label: '张三', value: '1' },
+      { label: '李四', value: '2' },
+      { label: '王五', value: '3' }
+    ]
+  };
+
+  export default {
+    data() {
+      return {
+        visible: false,
+        loading: false,
+        isEdit: false,
+        form: JSON.parse(JSON.stringify(defForm)),
+        options: optionsConfig,
+        rules: {
+          alarmLevel: [
+            { required: true, message: '请选择告警级别', trigger: 'change' }
+          ],
+          alarmName: [
+            { required: true, message: '请输入告警名称', trigger: 'blur' }
+          ],
+          alarmTarget: [
+            { required: true, message: '请选择告警对象', trigger: 'change' }
+          ],
+          deviceType: [
+            { required: true, message: '请选择告警设备类型', trigger: 'change' }
+          ],
+          triggerCondition: [
+            { required: true, message: '请选择触发条件', trigger: 'change' }
+          ]
+        }
+      };
+    },
+    methods: {
+      open(row) {
+        this.visible = true;
+        if (row && row.id) {
+          this.isEdit = true;
+          this.form = {
+            ...JSON.parse(JSON.stringify(defForm)),
+            ...row
+          };
+        } else {
+          this.isEdit = false;
+          this.form = JSON.parse(JSON.stringify(defForm));
+        }
+      },
+      cancel() {
+        this.form = JSON.parse(JSON.stringify(defForm));
+        this.visible = false;
+        this.$refs.form && this.$refs.form.clearValidate();
+      },
+      addDevice() {
+        this.$message.info('添加设备功能待实现');
+      },
+      removeDevice(index) {
+        this.form.deviceList.splice(index, 1);
+      },
+      addCondition() {
+        this.form.conditions.push({ field: '', operator: 'eq', value: '', unit: 'm³' });
+      },
+      getUnitLabel(unit) {
+        const unitMap = {
+          'm3': 'm³',
+          'kwh': 'kWh',
+          't': 't',
+          'm³': 'm³'
+        };
+        return unitMap[unit] || unit;
+      },
+      removeCondition(index) {
+        this.form.conditions.splice(index, 1);
+      },
+      addNotifyPerson() {
+        this.form.notifyList.push({ person: '', phone: '', email: '', notifySms: false, notifyEmail: false, notifySystem: false });
+      },
+      removeNotifyPerson(index) {
+        this.form.notifyList.splice(index, 1);
+      },
+      save() {
+        this.$refs.form.validate((valid) => {
+          if (valid) {
+            this.loading = true;
+            setTimeout(() => {
+              this.loading = false;
+              this.$message.success(this.isEdit ? '编辑成功' : '新增成功');
+              this.cancel();
+              this.$emit('reload');
+            }, 500);
+          }
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .el-form-box {
+    max-height: calc(100vh - 300px);
+    overflow-y: auto;
+  }
+  .table-header {
+    margin-bottom: 10px;
+  }
+  .condition-list {
+    margin-bottom: 20px;
+    .condition-row {
+      display: flex;
+      align-items: center;
+      margin-bottom: 10px;
+      .condition-item {
+        flex-shrink: 0;
+        &:first-child {
+          width: 200px;
+        }
+        &:nth-child(2) {
+          width: 120px;
+          margin: 0 10px;
+        }
+        &.value-item {
+          flex: 1;
+          max-width: 250px;
+        }
+        ::v-deep .el-select,
+        ::v-deep .el-input {
+          width: 100%;
+        }
+      }
+      .condition-link {
+        margin: 0 15px;
+        color: #606266;
+        flex-shrink: 0;
+      }
+    }
+    .add-condition-btn {
+      color: #409EFF;
+    }
+  }
+  .danger-text {
+    color: #F56C6C;
+  }
+</style>

+ 332 - 0
src/views/alarmConfiguration/index.vue

@@ -0,0 +1,332 @@
+<template>
+  <div class="alarm-configuration">
+    <el-card shadow="never" class="config-card">
+      <!-- 搜索区域 -->
+      <div class="search-area">
+        <seek-page
+          :seekList="seekList"
+          @search="handleSearch"
+          @reset="handleReset"
+          :formLength="3"
+        />
+      </div>
+
+      <!-- 列表视图 -->
+      <div class="list-view">
+        <ele-pro-table
+          ref="table"
+          row-key="id"
+          :columns="columns"
+          :datasource="datasource"
+          :cache-key="cacheKeyUrl"
+          height="calc(100vh - 350px)"
+          @columns-change="handleColumnChange"
+        >
+          <template v-slot:toolbar
+            ><el-button
+              type="primary"
+              size="small"
+              icon="el-icon-plus"
+              @click="handleAdd"
+              >新增</el-button
+            ></template
+          >
+          <template v-slot:alarmLevel="{ row }">
+            <el-tag
+              :type="getAlarmLevelType(row.alarmLevel)"
+              size="small"
+              effect="dark"
+            >
+              {{ row.alarmLevel }}
+            </el-tag>
+          </template>
+          <template v-slot:status="{ row }">
+            <el-tag
+              :type="row.status === '1' ? 'success' : 'info'"
+              size="small"
+            >
+              {{ row.status === '1' ? '启用' : '停用' }}
+            </el-tag>
+          </template>
+          <template v-slot:action="{ row }">
+            <el-link type="primary" :underline="false" @click="handleEdit(row)"
+              >编辑</el-link
+            >
+            <el-link
+              type="danger"
+              :underline="false"
+              @click="handleDelete(row)"
+              style="margin-left: 8px"
+              >删除</el-link
+            >
+          </template>
+        </ele-pro-table>
+      </div>
+
+      <!-- 新增/编辑弹窗 -->
+      <alarm-dialog ref="alarmDialogRef" @reload="$refs.table.reload()" />
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import AlarmDialog from './alarmDialog.vue';
+  import tabMixins from '@/mixins/tableColumnsMixin';
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
+    components: {
+      AlarmDialog
+    },
+    mixins: [tabMixins, dictMixins],
+
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center'
+          },
+          {
+            prop: 'alarmName',
+            label: '告警名称',
+            align: 'center',
+            minWidth: 150,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'alarmLevel',
+            label: '告警级别',
+            align: 'center',
+            minWidth: 100,
+            slot: 'alarmLevel'
+          },
+          {
+            prop: 'alarmObject',
+            label: '告警对象',
+            align: 'center',
+            minWidth: 120,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'deviceCategory',
+            label: '告警设备分类',
+            align: 'center',
+            minWidth: 120,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'alarmPush',
+            label: '告警推送',
+            align: 'center',
+            minWidth: 120,
+            showOverflowTooltip: true
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            minWidth: 80,
+            slot: 'status'
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 120,
+            align: 'center',
+            slot: 'action'
+          }
+        ],
+        cacheKeyUrl: 'ems-alarm-configuration-list'
+      };
+    },
+    computed: {
+      seekList() {
+        return [
+          {
+            label: '关键词',
+            value: 'keyword',
+            type: 'input',
+            width: 200,
+            placeholder: '请输入'
+          },
+          {
+            label: '告警级别',
+            value: 'alarmLevel',
+            type: 'select',
+            width: 120,
+            placeholder: '全部',
+            planList: [
+              { value: '', label: '全部' },
+              { value: '严重', label: '严重' },
+              { value: '紧急', label: '紧急' },
+              { value: '一般', label: '一般' }
+            ]
+          },
+          {
+            label: '告警对象',
+            value: 'alarmObject',
+            type: 'select',
+            width: 120,
+            placeholder: '全部',
+            planList: [
+              { value: '', label: '全部' },
+              { value: '用电', label: '用电' },
+              { value: '用水', label: '用水' },
+              { value: '用气', label: '用气' }
+            ]
+          },
+          {
+            label: '状态',
+            value: 'status',
+            type: 'select',
+            width: 120,
+            placeholder: '全部',
+            planList: [
+              { value: '', label: '全部' },
+              { value: '1', label: '启用' },
+              { value: '0', label: '停用' }
+            ]
+          }
+        ];
+      }
+    },
+    methods: {
+      // 获取告警级别类型
+      getAlarmLevelType(level) {
+        const typeMap = {
+          严重: 'danger',
+          紧急: 'warning',
+          一般: 'success'
+        };
+        return typeMap[level] || 'info';
+      },
+      // 新增
+      handleAdd() {
+        this.$refs.alarmDialogRef.open();
+      },
+      // 编辑
+      handleEdit(row) {
+        this.$refs.alarmDialogRef.open(row);
+      },
+      // 删除
+      handleDelete(row) {
+        this.$confirm('确认删除该告警配置吗?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+          .then(() => {
+            this.$message.success('删除成功');
+          })
+          .catch(() => {});
+      },
+      // 搜索
+      handleSearch(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+      // 重置
+      handleReset() {
+        this.$refs.table.reload({ page: 1 });
+      },
+      // 表格数据源
+      datasource({ page, limit, where, order }) {
+        const body = {
+          ...where,
+          ...order,
+          pageNum: page,
+          size: limit
+        };
+        // 这里调用实际的API
+        return Promise.resolve({
+          list: [
+            {
+              id: 1,
+              alarmName: '用电量超标告警',
+              alarmLevel: '严重',
+              alarmObject: '用电',
+              deviceCategory: '电表',
+              alarmPush: '短信、APP推送',
+              status: '1'
+            },
+            {
+              id: 2,
+              alarmName: '用水量异常告警',
+              alarmLevel: '紧急',
+              alarmObject: '用水',
+              deviceCategory: '水表',
+              alarmPush: '短信、APP推送',
+              status: '1'
+            },
+            {
+              id: 3,
+              alarmName: '设备离线告警',
+              alarmLevel: '严重',
+              alarmObject: '用电',
+              deviceCategory: '电表',
+              alarmPush: '短信、APP推送',
+              status: '1'
+            },
+            {
+              id: 4,
+              alarmName: '用气量超标告警',
+              alarmLevel: '一般',
+              alarmObject: '用气',
+              deviceCategory: '气表',
+              alarmPush: 'APP推送',
+              status: '1'
+            },
+            {
+              id: 5,
+              alarmName: '电表故障告警',
+              alarmLevel: '紧急',
+              alarmObject: '用电',
+              deviceCategory: '电表',
+              alarmPush: '短信、APP推送',
+              status: '0'
+            }
+          ],
+          total: 5
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped>
+  .alarm-configuration {
+    .config-card {
+      height: calc(100vh - 100px);
+
+      ::v-deep .el-card__body {
+        height: 100%;
+        padding: 15px;
+        display: flex;
+        flex-direction: column;
+      }
+    }
+
+    // 搜索区域
+    .search-area {
+      margin-bottom: 15px;
+      padding-bottom: 15px;
+      border-bottom: 1px solid #ebeef5;
+    }
+
+    // 列表视图
+    .list-view {
+      flex: 1;
+      overflow: hidden;
+
+      ::v-deep .ele-pro-table {
+        .el-table {
+          border: 1px solid #ebeef5;
+          border-radius: 4px;
+        }
+      }
+    }
+  }
+</style>

+ 111 - 41
src/views/maintenance/components/MaterialAdd.vue

@@ -47,7 +47,18 @@
             :selection.sync="selection"
             row-key="id"
             :initLoad="false"
+            :highlight-current-row="singleSelect"
+            @current-change="handleCurrentChange"
           >
+            <template v-slot:radio="{ row }">
+              <el-radio
+                v-model="radio"
+                :label="row.id"
+                @change="chooseRow(row)"
+                @click.native.stop
+                ><i></i
+              ></el-radio>
+            </template>
             <template v-slot:modelType="{ row }">
               <span>{{ row.category.modelType }}</span>
             </template>
@@ -95,19 +106,17 @@
         },
         type: null,
         disposalType: '',
-        // 表格列配置
-        columns: [
-          {
-            columnKey: 'selection',
-            type: 'selection',
-            width: 45,
-            align: 'center',
-            selectable: (row, index) => {
-              return !this.processData.some((id) => id == row.id);
-            },
-            reserveSelection: true,
-            fixed: 'left'
-          },
+        singleSelect: false,
+        radio: null,
+        current: {},
+        // 表格选中数据
+        selection: [],
+        processData: []
+      };
+    },
+    computed: {
+      columns() {
+        const baseColumns = [
           {
             label: '设备名称',
             prop: 'name'
@@ -116,6 +125,10 @@
             label: '编码',
             prop: 'code'
           },
+          {
+            label: '编号',
+            prop: 'codeNumber'
+          },
           {
             label: '固资编码',
             prop: 'fixCode'
@@ -167,12 +180,34 @@
                 : '';
             }
           }
-        ],
-
-        // 表格选中数据
-        selection: [],
-        processData: []
-      };
+        ];
+        if (this.singleSelect) {
+          return [
+            {
+              columnKey: 'radio',
+              width: 45,
+              align: 'center',
+              slot: 'radio',
+              fixed: 'left'
+            },
+            ...baseColumns
+          ];
+        }
+        return [
+          {
+            columnKey: 'selection',
+            type: 'selection',
+            width: 45,
+            align: 'center',
+            selectable: (row, index) => {
+              return !this.processData.some((id) => id == row.id);
+            },
+            reserveSelection: true,
+            fixed: 'left'
+          },
+          ...baseColumns
+        ];
+      }
     },
     methods: {
       /* 表格数据源 */
@@ -189,20 +224,31 @@
         this.categoryId = res.list[0]?.categoryId;
         return res;
       },
-      open(ruleIdList, ruleIdListIndex, isAlone, data, disposalType) {
+      open(
+        ruleIdList,
+        ruleIdListIndex,
+        isAlone,
+        data,
+        disposalType,
+        singleSelect = false
+      ) {
         this.disposalType = disposalType;
-        console.log(ruleIdList);
-        console.log(ruleIdListIndex);
+        this.singleSelect = singleSelect;
+        this.radio = null;
+        this.current = {};
+
         let list = [];
         if (isAlone) {
           list = data;
         } else {
-          list = ruleIdList
-            .map((item) => {
-              return item.equipmentList;
-            })
-            .flat();
-          this.ruleIdListIndex = ruleIdListIndex;
+          if (ruleIdList) {
+            list = ruleIdList
+              .map((item) => {
+                return item.equipmentList;
+              })
+              .flat();
+            this.ruleIdListIndex = ruleIdListIndex;
+          }
         }
         console.log(list);
         if (list.length > 0) {
@@ -247,22 +293,46 @@
 
       handleClose() {
         this.visible = false;
-        this.$refs.table.setSelectedRows([]);
-        this.selection = [];
+        if (this.singleSelect) {
+          this.radio = null;
+          this.current = {};
+        } else {
+          this.$refs.table.setSelectedRows([]);
+          this.selection = [];
+        }
+      },
+      chooseRow(row) {
+        this.current = row;
+      },
+      handleCurrentChange(row) {
+        if (this.singleSelect && row) {
+          this.radio = row.id;
+          this.current = row;
+        }
       },
       selected() {
-        if (!this.selection.length) {
-          this.$message.error('请至少选择一条数据');
-          return;
+        if (this.singleSelect) {
+          if (!this.current?.id) {
+            this.$message.error('请选择一条数据');
+            return;
+          }
+          this.$emit(
+            'chooseEquipment',
+            this.current,
+    
+          );
+        } else {
+          if (!this.selection.length) {
+            this.$message.error('请至少选择一条数据');
+            return;
+          }
+          this.$emit(
+            'chooseEquipment',
+            this.selection,
+            this.ruleIdListIndex,
+            this.categoryId
+          );
         }
-        const selectList = this.$refs.treeRef.getCheckedNodes();
-        console.log('selectList-----------', selectList);
-        this.$emit(
-          'chooseEquipment',
-          this.selection,
-          this.ruleIdListIndex,
-          this.categoryId
-        );
         this.handleClose();
       }
     }

+ 12 - 16
src/views/warning/warningMessage/components/message-search.vue

@@ -8,17 +8,18 @@
   >
     <el-row :gutter="15">
       <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
-        <el-form-item label="告警级别:" label-width="80px">
-          <DictSelection dictName="告警级别" clearable v-model="where.staus">
-          </DictSelection>
+        <el-form-item label="告警级别:" prop="level">
+          <el-select filterable v-model="where.level" size="small">
+            <el-option label="提示" :value="1"></el-option>
+            <el-option label="一般" :value="2"></el-option>
+            <el-option label="严重" :value="3"></el-option>
+            <el-option label="紧急" :value="4"></el-option>
+            <el-option label="致命" :value="5"></el-option>
+          </el-select>
         </el-form-item>
       </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
-        <el-form-item label="告警设备分类:">
-          <equipmentSelect v-model="where.categoryLevelId" />
-        </el-form-item>
-      </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
+
+      <!-- <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
         <el-form-item label="告警时间:" label-width="80px">
           <el-date-picker
             v-model="time"
@@ -32,7 +33,7 @@
           >
           </el-date-picker>
         </el-form-item>
-      </el-col>
+      </el-col> -->
       <!-- <el-col v-bind="styleResponsive ? { lg: 5, md: 12 } : { span: 5 }">
         <el-form-item label="组织机构:">
           <auth-selection v-model="where.deptIds" style="width: 100%"></auth-selection>
@@ -70,12 +71,7 @@
     data() {
       // 默认表单数据
       const defaultWhere = {
-        name: '',
-        ruleName: '',
-        code: '',
-        groupId: '',
-        status: '',
-        categoryLevelId: ''
+        level: ''
       };
       return {
         // 表单数据

+ 133 - 146
src/views/warning/warningMessage/index.vue

@@ -1,146 +1,133 @@
-<template>
-  <div
-    class="ele-body"
-    :style="
-      $route.query.isDrawer
-        ? {
-            position: 'fixed',
-            height: '100vh',
-            top: '0',
-            bottom: '0',
-            left: '0',
-            right: '0',
-            zIndex: 1000,
-            background: '#fff'
-          }
-        : {}
-    "
-  >
-    <el-card shadow="never" v-loading="loading">
-      <message-search @search="reload"> </message-search>
-      <!-- 数据表格 -->
-      <ele-pro-table
-        ref="table"
:pageSizes="tablePageSizes"
-        :columns="columns"
-        :datasource="datasource"
-        cache-key="systemRoleTable"
-      >
-        <!--        <template v-slot:code="{ row }">
-          <el-link type="primary" :underline="false">
-            {{ row.code }}
-          </el-link>
-        </template> -->
-      </ele-pro-table>
-    </el-card>
-  </div>
-</template>
-
-<script>
-  import MessageSearch from './components/message-search.vue';
-  import { planConfigPage, removeRule } from '@/api/ruleManagement/plan';
-  import dictMixins from '@/mixins/dictMixins';
-  export default {
-    mixins: [dictMixins],
-    components: {
-      MessageSearch
-    },
-    data() {
-      return {
-        // 表格列配置
-        columns: [
-          {
-            columnKey: 'index',
-            label: '序号',
-            type: 'index',
-            width: 55,
-            align: 'center',
-            showOverflowTooltip: true,
-            fixed: 'left'
-          },
-          {
-            prop: 'code',
-            label: '告警级别',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110,
-            slot: 'code'
-          },
-          {
-            prop: 'name',
-            label: '告警设备分类',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-          {
-            prop: 'groupName',
-            label: '设备编号',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-          {
-            prop: 'categoryName',
-            label: '设备名称',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-          {
-            prop: 'ruleName',
-            label: '告警内容',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-          {
-            prop: 'autoOrder',
-            label: '告警方式',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110,
-            formatter: (_row, _column, cellValue) => {
-              let autoOrder =
-                _row.autoOrder == 1 ? '是' : _row.autoOrder == 0 ? '否' : '-';
-              return autoOrder;
-            }
-          },
-          {
-            prop: 'createTime',
-            label: '告警时间',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110,
-            formatter: (_row, _column, cellValue) => {
-              return this.$util.toDateString(cellValue);
-            }
-          }
-        ],
-        // 加载状态
-        loading: false
-      };
-    },
-    computed: {},
-    created() {
-      this.requestDict('规则状态');
-    },
-    methods: {
-      /* 表格数据源 */
-      datasource({ page, limit, where, order }) {
-        return planConfigPage({
-          pageNum: page,
-          size: limit,
-          ...where,
-          ruleType: 2
-        });
-      },
-
-      /* 刷新表格 */
-      reload(where) {
-        this.$refs.table.reload({ page: 1, where, ruleType: 2 });
-      }
-    }
-  };
-</script>
-
-<style lang="scss" scoped></style>
+<template>
+  <div
+    class="ele-body"
+    :style="
+      $route.query.isDrawer
+        ? {
+            position: 'fixed',
+            height: '100vh',
+            top: '0',
+            bottom: '0',
+            left: '0',
+            right: '0',
+            zIndex: 1000,
+            background: '#fff'
+          }
+        : {}
+    "
+  >
+    <el-card shadow="never" v-loading="loading">
+      <message-search @search="reload"> </message-search>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :pageSizes="tablePageSizes"
+        :columns="columns"
+        :datasource="datasource"
+        cache-key="systemRoleTable"
+      >
+      </ele-pro-table>
+    </el-card>
+  </div>
+</template>
+
+<script>
+  import MessageSearch from './components/message-search.vue';
+  import { alarmlogsheetPage } from '@/api/warning/index.js';
+
+  import dictMixins from '@/mixins/dictMixins';
+  export default {
+    mixins: [dictMixins],
+    components: {
+      MessageSearch
+    },
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'alarmLevel',
+            label: '告警级别',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (_row, _column, cellValue) => {
+              const map = { 1: '提示', 2: '一般', 3: '严重', 4: '紧急', 5: '致命' };
+              return map[cellValue] || '-';
+            }
+          },
+          {
+            prop: 'deviceCode',
+            label: '设备编号',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'deviceName',
+            label: '设备名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'description',
+            label: '告警描述',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 180
+          },
+          {
+            prop: 'remark',
+            label: '备注',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'alarmTime',
+            label: '告警时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 160,
+            formatter: (_row, _column, cellValue) => {
+              return this.$util.toDateString(cellValue);
+            }
+          }
+        ],
+        // 加载状态
+        loading: false
+      };
+    },
+    computed: {},
+    created() {
+      this.requestDict('规则状态');
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return alarmlogsheetPage({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where, ruleType: 2 });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>

+ 375 - 219
src/views/warning/warningSetting/components/addWarningDialog.vue

@@ -1,19 +1,13 @@
 <template>
-  <el-dialog
-    :title="dialogTitle"
+  <ele-modal
+    :title="dialogType == 'add' ? '新增' : 'edit' ? '修改' : '详情'"
     :visible.sync="addWarningDialog"
     width="60%"
-    :close-on-click-modal="false"
+    :close-on-click-modal="true"
     :close-on-press-escape="false"
     :before-close="handleClose"
-    :fullscreen="fullscreen"
-    class="fullscreen"
-    ><template slot="title">
-      <modalTitle
-        :title="dialogTitle"
-        @setFullscreen="fullscreen = !fullscreen"
-      ></modalTitle>
-    </template>
+    :maxable="true"
+  >
     <el-tabs
       type="border-card"
       v-model="tabActiveName"
@@ -26,58 +20,69 @@
           :rules="baseInfoFormRules"
           ref="baseInfoFormRef"
           label-width="120px"
+          :disabled="dialogType == 'view'"
         >
           <el-row>
-            <el-col :span="10">
-              <el-form-item label="告警级别:" prop="alarmLevel">
-                <DictSelection
-                  dictName="告警级别"
-                  clearable
-                  v-model="baseInfoForm.alarmLevel"
-                  style="width: 80%"
-                >
-                </DictSelection>
+            <el-col :span="12">
+              <el-form-item label="告警级别:" prop="level">
+                <el-select filterable v-model="baseInfoForm.level" size="small">
+                  <el-option label="提示" :value="1"></el-option>
+                  <el-option label="一般" :value="2"></el-option>
+                  <el-option label="严重" :value="3"></el-option>
+                  <el-option label="紧急" :value="4"></el-option>
+                  <el-option label="致命" :value="5"></el-option>
+                </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="12">
               <el-form-item
-                label="告警设备类型:"
-                prop="alarmEquipmentName"
+                label="告警设备:"
+                prop="deviceName"
                 style="width: 90%"
               >
-                <equipmentSelect v-model="baseInfoForm.alarmEquipmentName" />
+                <el-input
+                  v-model="baseInfoForm.deviceName"
+                  style="width: 80%"
+                  placeholder="请选择"
+                  readonly
+                  @click.native="
+                    $refs.materialAddRef.open(
+                      null,
+                      null,
+                      false,
+                      null,
+                      null,
+                      true
+                    )
+                  "
+                ></el-input>
               </el-form-item>
             </el-col>
           </el-row>
           <el-row>
-            <el-col :span="10">
-              <el-form-item label="告警名称:" prop="alarmName">
+            <el-col :span="12">
+              <el-form-item label="告警名称:" prop="name">
                 <el-input
-                  v-model="baseInfoForm.alarmName"
+                  v-model="baseInfoForm.name"
                   style="width: 80%"
                   placeholder="请输入告警名称"
                   size="small"
                 ></el-input>
               </el-form-item>
             </el-col>
-            <el-col :span="4">
-              <el-form-item label="生成报修记录:">
-                <el-switch
-                  v-model="baseInfoForm.isCreate"
-                  active-color="#13ce66"
-                  inactive-color="#989898"
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="4">
-              <el-form-item label="状态:">
-                <el-switch
-                  v-model="baseInfoForm.status"
-                  active-color="#13ce66"
-                  inactive-color="#989898"
-                />
+            <!-- <el-col :span="12">
+              <el-form-item label="选择生成单据:">
+                <el-radio-group
+                  v-model="baseInfoForm.generateDocumentType"
+                  @change="isCreateChange"
+                >
+                  <el-radio :label="3">报修记录</el-radio>
+                  <el-radio :label="1">巡点检</el-radio>
+                  <el-radio :label="2">保养</el-radio>
+                  <el-radio :label="5">量具送检</el-radio>
+                </el-radio-group>
               </el-form-item>
-            </el-col>
+            </el-col> -->
           </el-row>
           <el-row>
             <el-col :span="24">
@@ -87,7 +92,7 @@
                   :rows="3"
                   resize="none"
                   size="small"
-                  v-model="baseInfoForm.alarmDescribe"
+                  v-model="baseInfoForm.description"
                   placeholder="请输入告警描述"
                   style="width: 85%"
                 ></el-input>
@@ -96,33 +101,30 @@
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="触发条件:" prop="alarmTrigger">
+              <el-form-item label="触发条件:" prop="triggerLogic">
                 <el-select
                   filterable
-                  v-model="baseInfoForm.alarmTrigger"
+                  v-model="baseInfoForm.triggerLogic"
                   size="small"
                 >
                   <el-option
                     label="当满足以下所有条件时"
-                    :value="0"
+                    :value="1"
                   ></el-option>
                   <el-option
                     label="当满足以下任一条件时"
-                    :value="1"
+                    :value="2"
                   ></el-option>
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="24" class="table_wrapper">
-              <el-table
-                :data="baseInfoForm.alarmTriggerList"
-                style="width: 100%"
-              >
+            <el-col :span="24" class="table_wrapper"></el-col>
+              <el-table :data="baseInfoForm.conditions" style="width: 100%">
                 <el-table-column label="">
                   <template slot-scope="scope">
                     <el-select
                       filterable
-                      v-model="scope.row.alarmType"
+                      v-model="scope.row.attributeCode"
                       size="small"
                       style="width: 100%"
                       placeholder="请选择"
@@ -132,6 +134,7 @@
                         :key="item.identifier"
                         :value="item.identifier"
                         :label="item.name"
+                        @click.native="attributeChange(item, scope.$index)"
                       ></el-option>
                     </el-select>
                   </template>
@@ -141,7 +144,7 @@
                     <DictSelection
                       dictName="告警触发条件"
                       clearable
-                      v-model="scope.row.alarmCondition"
+                      v-model="scope.row.operator"
                     >
                     </DictSelection>
                   </template>
@@ -149,7 +152,7 @@
                 <el-table-column label="">
                   <template slot-scope="scope">
                     <el-input
-                      v-model="scope.row.alarmValue"
+                      v-model="scope.row.thresholdValue"
                       oninput="value=value.replace(/[^\d.]/g,'')"
                       size="small"
                       placeholder="请输入值"
@@ -160,13 +163,10 @@
                   <template slot-scope="scope">
                     <div class="alarm_trigger_handler">
                       <div
-                        v-if="
-                          scope.$index <
-                          baseInfoForm.alarmTriggerList.length - 1
-                        "
+                        v-if="scope.$index < baseInfoForm.conditions.length - 1"
                       >
-                        <span v-if="baseInfoForm.alarmTrigger === 0">且</span>
-                        <span v-if="baseInfoForm.alarmTrigger === 1">或</span>
+                        <span v-if="baseInfoForm.triggerLogic === 1">且</span>
+                        <span v-if="baseInfoForm.triggerLogic === 2">或</span>
                       </div>
                       <el-button
                         v-if="scope.$index > 0"
@@ -186,35 +186,153 @@
               >
             </el-col>
           </el-row>
-          <el-row>
-            <el-col :span="12">
-              <el-form-item label="告警方式:">
-                <DictSelection
-                  dictName="告警方式"
-                  clearable
-                  v-model="baseInfoForm.alarmMode"
-                >
-                </DictSelection>
-              </el-form-item>
-            </el-col>
-          </el-row>
         </el-form>
+
+        <el-button
+          v-if="[1, 2, 5].includes(baseInfoForm.generateDocumentType)"
+          type="primary"
+          size="small"
+          style="margin-bottom: 10px"
+          @click="handleAddTab"
+          >添加规则</el-button
+        >
+        <div
+          class="el-tab_box"
+          v-if="[1, 2, 5].includes(baseInfoForm.generateDocumentType)"
+        >
+          <div class="ruleMatters_box">
+            <header-title title="规则事项">
+              <div>
+                <el-button
+                  size="small"
+                  icon="el-icon-plus"
+                  class="ele-btn-icon"
+                  type="primary"
+                  @click="addPostscript"
+                  >新增</el-button
+                >
+              </div>
+            </header-title>
+            <el-table :data="baseInfoForm.workItems" border>
+              <el-table-column label="序号" width="50">
+                <template slot-scope="scope">
+                  <span>{{ scope.$index + 1 }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="零部件编码"
+                prop="categoryCode"
+                width="100"
+              >
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.categoryCode"
+                      placeholder="请输入零部件编码"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="零部件名称"
+                prop="categoryName"
+                width="100"
+              >
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.categoryName"
+                      placeholder="请输入零部件名称"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="事项" prop="name" width="100">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.name"
+                      placeholder="请输入内容"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="内容" prop="content" width="200">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.content"
+                      placeholder="请输入内容"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作指导" prop="operationGuide">
+                <template slot-scope="scope">
+                  <div
+                    class="operationGuide_box"
+                    @click="
+                      openOperationGuideDialogDialog(
+                        scope.row.operationGuide,
+                        scope.$index
+                      )
+                    "
+                  >
+                    <div class="left_content">
+                      <template v-if="scope.row.operationGuide">
+                        <div
+                          v-for="(item, index) in scope.row.operationGuide
+                            .toolList"
+                          :key="item.id"
+                          >{{ index + 1 }}.{{ item.name }}</div
+                        >
+                      </template>
+                    </div>
+                    <div class="right_content">
+                      <template v-if="scope.row.operationGuide">
+                        <div
+                          v-for="(item, index) in scope.row.operationGuide
+                            .procedureList"
+                          :key="item.id"
+                          >{{ index + 1 }}.{{ item.content }}</div
+                        >
+                      </template>
+                    </div>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="标准" prop="norm" width="100">
+                <template slot-scope="scope">
+                  <div>
+                    <el-input
+                      v-model="scope.row.norm"
+                      placeholder="请输入内容"
+                    ></el-input>
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="100">
+                <template slot-scope="scope">
+                  <el-button type="text" @click="deleteItem(scope.$index)"
+                    >删除</el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+          </div>
+        </div>
       </el-tab-pane>
-      <el-tab-pane label="短信设置" name="shortMessage" disabled
+      <!-- <el-tab-pane label="短信设置" name="shortMessage" disabled
         >短信设置</el-tab-pane
       >
-      <el-tab-pane label="邮箱设置" name="email" disabled>邮箱设置</el-tab-pane>
+      <el-tab-pane label="邮箱设置" name="email" disabled>邮箱设置</el-tab-pane> -->
       <el-tab-pane label="通知设置" name="notice">
         <div class="add_notice_table_row">
           <el-button type="primary" size="small" @click="handleAddNoticeRow"
             >添加</el-button
           >
         </div>
-        <el-table
-          :data="baseInfoForm.alarmNoticeSetList"
-          style="width: 100%"
-          border
-        >
+        <el-table :data="baseInfoForm.notices" style="width: 100%" border>
           <el-table-column label="" align="center" width="60">
             <template slot-scope="scope">
               <span>{{ scope.$index + 1 }}</span>
@@ -224,7 +342,7 @@
             <template slot-scope="scope">
               <el-select
                 filterable
-                v-model="scope.row.alarmNotifierId"
+                v-model="scope.row.receiverIds"
                 size="small"
               >
                 <el-option
@@ -232,11 +350,12 @@
                   :key="item.id"
                   :value="item.id"
                   :label="item.name"
+                  @click.native="receiver(item, scope.$index)"
                 ></el-option>
               </el-select>
             </template>
           </el-table-column>
-          <el-table-column label="手机号码" align="center">
+          <!-- <el-table-column label="手机号码" align="center">
             <template slot-scope="scope">
               <el-input
                 v-model="scope.row.alarmNotifierPhone"
@@ -245,8 +364,8 @@
                 @blur="checkPhone(scope.$index, scope.row.alarmNotifierPhone)"
               ></el-input>
             </template>
-          </el-table-column>
-          <el-table-column label="邮箱" align="center">
+          </el-table-column> -->
+          <!-- <el-table-column label="邮箱" align="center">
             <template slot-scope="scope">
               <el-input
                 v-model="scope.row.alarmNotifierMailbox"
@@ -255,14 +374,14 @@
                 @blur="checkMailbox(scope.$index, scope.row.mailbox)"
               ></el-input>
             </template>
-          </el-table-column>
-          <el-table-column label="通知方式" width="260px" align="center">
+          </el-table-column> -->
+          <!-- <el-table-column label="通知方式" width="260px" align="center">
             <template slot-scope="scope">
               <el-checkbox v-model="scope.row.shortMessage">短信</el-checkbox>
               <el-checkbox v-model="scope.row.mail">邮件</el-checkbox>
               <el-checkbox v-model="scope.row.system">系统</el-checkbox>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column label="操作" width="70px" align="center">
             <template slot-scope="scope">
               <el-button
@@ -277,74 +396,95 @@
     </el-tabs>
     <span slot="footer" class="dialog-footer">
       <el-button size="small" @click="handleClose">取 消</el-button>
-      <el-button size="small" type="primary" @click="saveWarningSetting"
+      <el-button size="small" type="primary" @click="saveWarningSetting" v-if="dialogType!='view'"
         >确 定</el-button
       >
     </span>
-  </el-dialog>
+    <MaterialAdd ref="materialAddRef" @chooseEquipment="chooseEquipment">
+    </MaterialAdd>
+
+    <!-- 添加规则 -->
+    <ele-modal
+      width="800px"
+      :visible="addDialog"
+      :append-to-body="true"
+      title="规则配置"
+      :close-on-click-modal="true"
+      :maxable="true"
+    >
+      <el-select v-model="ruleId" size="small" style="width: 100%" filterable>
+        <el-option
+          v-for="item in ruleNameList"
+          :key="item.id"
+          :value="item.id"
+          :label="item.code + '-' + item.name"
+        ></el-option>
+      </el-select>
+      <template v-slot:footer>
+        <el-button @click="addDialog = false">取消</el-button>
+        <el-button type="primary" @click="addRule"> 添加 </el-button>
+      </template>
+    </ele-modal>
+  </ele-modal>
 </template>
 
 <script>
-  import modalTitle from '@/components/modalTitle.vue';
-  import equipmentSelect from '@/components/CommomSelect/equipment-select.vue';
+  import MaterialAdd from '@/views/maintenance/components/MaterialAdd.vue';
+  import { getDetail } from '@/api/ruleManagement/matter';
+  import { getRule } from '@/api/ruleManagement/plan';
   import { getUserPage } from '@/api/system/organization';
+  import { getPhysicalModel } from '@/api/ledgerAssets/equipment';
+  import { save, update, getById } from '@/api/warning/index.js';
+
   export default {
-    components: { equipmentSelect, modalTitle },
-    props: {
-      equipmentList: {
-        type: Array,
-        default: () => {
-          return [];
-        }
-      },
-      viewForm: {
-        type: Object,
-        default: () => {
-          return {};
-        }
-      },
-      dialogTitle: {
-        type: String,
-        default: ''
-      }
-    },
+    components: { MaterialAdd },
+    props: {},
     data() {
       return {
-        fullscreen: false,
         addWarningDialog: false,
+        dialogType: 'add',
+        addDialog: false,
         tabActiveName: 'baseInfo',
+        ruleNameList: [],
+        workItems: [],
+        ruleId: '',
         saveLoading: false,
         baseInfoForm: {
-          alarmLevel: '', // 告警级别
-          alarmEquipmentId: '', // 告警设备类型id
-          alarmEquipmentName: '', // 告警设备类型name
-          alarmName: '', // 告警名称
-          status: false, // 状态
-          isCreate: false, // 是否生成保修工单
-          alarmDescribe: '', // 告警描述
-          alarmTrigger: 0, // 告警触发条件类型选择
+          level: '', // 告警级别
+          deviceId: '',
+          deviceName: '',
+          deviceCode: '',
+
+          name: '', // 告警名称
+          generateDocumentType: null, // 是否生成保修工单
+          description: '', // 告警描述
+          triggerLogic: 1, // 告警触发条件类型选择
           alarmMode: '', // 告警方式
-          alarmTriggerList: [{}], // 基本信息触发条件表格
-          alarmNoticeSetList: [
+          conditions: [
+            // {
+            //   attributeCode: 'identifier',
+            //   attributeName: '温度'
+            // }
+            {
+            
+            }
+          ], // 基本信息触发条件表格
+          notices: [
             {
-              alarmNotifierId: '', // 告警通知人id
-              alarmNotifierName: '', // 告警通知人name
-              alarmNotifierMailbox: '', // 邮箱
-              alarmNotifierPhone: '', // 电话
-              mail: false, // 邮件
-              shortMessage: false, // 短信
-              system: false // 系统
+              receiverIds: '', // 告警通知人id
+              receiverName: '', // 告警通知人name
+              noticeTypes: '3'
             }
           ] // 通知设置表格
         },
         baseInfoFormRules: {
-          alarmLevel: [
+          level: [
             { required: true, message: '请选择告警级别', trigger: 'change' }
           ],
-          alarmEquipmentName: [
-            { required: true, message: '请选择告警设备类型', trigger: 'change' }
+          deviceName: [
+            { required: true, message: '请选择告警设备', trigger: 'change' }
           ],
-          alarmName: [
+          name: [
             { required: true, message: '请输入告警名称', trigger: 'blur' }
           ],
           alarmTrigger: [
@@ -355,47 +495,16 @@
         temperatureList: []
       };
     },
-    watch: {
-      viewForm(val) {
-        console.log('shujval', val);
-        this.baseInfoForm = val;
-        this.getTemperatureList(val.alarmEquipmentId);
-      }
-    },
+    watch: {},
     methods: {
-      getTemperatureList(val) {
-        warningSetting.getAlarmTermType(val).then((res) => {
-          if (res?.success) {
-            this.temperatureList = res.data;
-          }
+      async chooseEquipment(data) {
+        this.baseInfoForm.deviceId = data.id;
+        this.baseInfoForm.deviceName = data.name;
+        this.baseInfoForm.deviceCode = data.code;
+        getPhysicalModel(data.id).then((res) => {
+          this.temperatureList = res.properties;
         });
       },
-
-      // 告警设备类型变更
-      async handleEquipmentChange(val) {
-        this.baseInfoForm.alarmEquipmentId = val;
-        warningSetting
-          .getAlarmTermType(this.baseInfoForm.alarmEquipmentId)
-          .then((res) => {
-            if (res?.success) {
-              this.temperatureList = res.data;
-              console.log('列表数据', this.temperatureList);
-              this.baseInfoForm.alarmTriggerList.forEach((item) => {
-                if (item.alarmType) {
-                  item.alarmType = '';
-                }
-              });
-            }
-          })
-          .catch((err) => {
-            this.temperatureList = [];
-            this.baseInfoForm.alarmTriggerList.forEach((item) => {
-              if (item.alarmType) {
-                item.alarmType = '';
-              }
-            });
-          });
-      },
       // 获取通知人列表数据
       async getUserList() {
         try {
@@ -404,7 +513,17 @@
           this.alarmNotifierList = res.list;
         } catch (error) {}
       },
-
+      async isCreateChange(val) {
+        const res = await getRule({
+          status: 1,
+          type: val,
+          pageNum: 1,
+          size: -1
+        });
+        if (res.list) {
+          this.ruleNameList = res.list || [];
+        }
+      },
       // tab栏切换
       handleTabClick(tab) {
         // 获取通知人下拉数据
@@ -412,40 +531,91 @@
           this.getUserList();
         }
       },
+      handleAddTab() {
+        this.ruleId = '';
+        this.addDialog = true;
+      },
+      async addRule() {
+        const data = await getDetail(this.ruleId);
+        this.baseInfoForm.workItems = data.ruleItems;
+        this.addDialog = false;
+      },
+      /* 打开操作手册编辑款 */
+      openOperationGuideDialogDialog(row, index) {
+        if (this.dialogTitle !== '派单') {
+          this.$refs.operationGuideDialog.open(row, index);
+        }
+      },
+      attributeChange(item, index) {
+        this.$set(
+          this.baseInfoForm.conditions[index],
+          'attributeName',
+          item.name
+        );
+      },
+      receiver(item, index) {
+        console.log(index,'index')
+        this.$set(this.baseInfoForm.notices[index], 'receiverName', item.name);
+      },
+
+      deleteItem(index) {
+        if (this.baseInfoForm.workItems.length > 1) {
+          this.baseInfoForm.workItems.splice(index, 1);
+        } else {
+          this.$message.error('至少要有一个规则事项!');
+        }
+      },
+      addPostscript() {
+        this.baseInfoForm.workItems.push({
+          sort: null,
+          name: '',
+          content: '',
+          norm: '',
+          isNew: true,
+          operationGuide: {
+            procedureList: [],
+            toolList: []
+          }
+        });
+      },
       // 关闭新增弹窗
       handleClose() {
         this.addWarningDialog = false;
         this._resetDialogInfo();
       },
+      async open(type, row) {
+        this.tabActiveName = 'baseInfo';
+        this.addWarningDialog = true;
+        this.dialogType = type;
+        if (row) {
+          this.baseInfoForm = await getById(row.id);
+        }
+      },
       // 增加触发条件
       handleAddTriggerCondition() {
-        this.baseInfoForm.alarmTriggerList.push({});
+        this.baseInfoForm.conditions.push({});
       },
       // 删除触发条件
       handleDeleteTriggerCondition(index) {
-        this.baseInfoForm.alarmTriggerList.splice(index, 1);
+        this.baseInfoForm.conditions.splice(index, 1);
       },
       // 通知设置 - 添加表格一行
       handleAddNoticeRow() {
-        this.baseInfoForm.alarmNoticeSetList.push({
-          alarmNotifierId: '', // 告警通知人id
-          alarmNotifierName: '', // 告警通知人name
-          alarmNotifierMailbox: '', // 邮箱
-          alarmNotifierPhone: '', // 电话
-          mail: false, // 邮件
-          shortMessage: false, // 短信
-          system: false // 系统
+        this.baseInfoForm.notices.push({
+          receiverIds: '', // 告警通知人id
+          receiverName: '', // 告警通知人name
+          noticeTypes: '3'
         });
       },
       // 通知设置 - 删除表格一行
       handleDeleteNoticeRow(index) {
-        this.baseInfoForm.alarmNoticeSetList.splice(index, 1);
+        this.baseInfoForm.notices.splice(index, 1);
       },
       // 验证手机号
       checkPhone(index, phone) {
         const phoneReg = /^1[345789]\d{9}$/;
         if (phone && !phoneReg.test(phone)) {
-          this.baseInfoForm.alarmNoticeSetList[index].alarmNotifierPhone = '';
+          this.baseInfoForm.notices[index].alarmNotifierPhone = '';
           return this.$message.error('手机号码格式错误,请重新输入!');
         }
       },
@@ -453,53 +623,44 @@
       checkMailbox(index, mailbox) {
         const mailReg = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
         if (mailbox && !mailReg.test(mailbox)) {
-          this.baseInfoForm.alarmNoticeSetList[index].alarmNotifierMailbox = '';
+          this.baseInfoForm.notices[index].alarmNotifierMailbox = '';
           return this.$message.error('邮箱格式错误,请重新输入!');
         }
       },
+
       // 保存
       async saveWarningSetting() {
         this.$refs.baseInfoFormRef.validate(async (valid) => {
-          if (valid) {
-            try {
-              this.saveLoading = true;
-              const res = await warningSetting.saveWarningSetting(
-                this.baseInfoForm
-              );
-              // console.log('新增告警结果:', res)
-              this.addWarningDialog = false;
-              this._resetDialogInfo();
-              this.saveLoading = false;
-              this.$emit('refreshList');
-              this.$message.success('新增成功!');
-            } catch (error) {
-              this.saveLoading = false;
-            }
-          }
+          this.saveLoading = true;
+          let api=this.baseInfoForm.id?update:save
+          api(this.baseInfoForm).then((res) => {
+            this._resetDialogInfo();
+            this.saveLoading = false;
+            this.addWarningDialog = false;
+            this.$emit('refreshList');
+            this.$message.success('操作成功!');
+            this.saveLoading = false;
+          });
         });
       },
       // 重置弹窗信息
       _resetDialogInfo() {
         this.baseInfoForm = {
-          alarmLevel: '', // 告警级别
+          level: '', // 告警级别
           alarmEquipmentId: '', // 告警设备类型id
           alarmEquipmentName: '', // 告警设备类型name
-          alarmName: '', // 告警名称
+          name: '', // 告警名称
           status: false, // 状态
-          isCreate: false, // 是否生成保修工单
-          alarmDescribe: '', // 告警描述
+          generateDocumentType: false, // 是否生成保修工单
+          description: '', // 告警描述
           alarmTrigger: 0, // 告警触发条件类型选择
           alarmMode: '', // 告警方式
-          alarmTriggerList: [{}], // 基本信息触发条件表格
-          alarmNoticeSetList: [
+          conditions: [{}], // 基本信息触发条件表格
+          notices: [
             {
-              alarmNotifierId: '', // 告警通知人id
-              alarmNotifierName: '', // 告警通知人name
-              alarmNotifierMailbox: '', // 邮箱
-              alarmNotifierPhone: '', // 电话
-              mail: false, // 邮件
-              shortMessage: false, // 短信
-              system: false // 系统
+              receiverIds: '', // 告警通知人id
+              receiverName: '', // 告警通知人name
+              noticeTypes: '3'
             }
           ] // 通知设置表格
         };
@@ -511,11 +672,6 @@
 </script>
 
 <style lang="scss" scoped>
-  ::v-deep .el-dialog__headerbtn .el-dialog__close {
-    color: #fff;
-    font-weight: 700;
-    font-size: 20px;
-  }
   .table_wrapper {
     padding-left: 120px;
     padding-right: 8vw;

+ 9 - 8
src/views/warning/warningSetting/components/setting-search.vue

@@ -8,16 +8,17 @@
   >
     <el-row :gutter="15">
       <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-        <el-form-item label="告警级别:">
-          <DictSelection dictName="告警级别" clearable v-model="where.staus">
-          </DictSelection>
-        </el-form-item>
-      </el-col>
-      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
-        <el-form-item label="告警设备分类:">
-          <equipmentSelect v-model="where.categoryLevelId" />
+        <el-form-item label="告警级别:" prop="level">
+          <el-select filterable v-model="where.level" size="small">
+            <el-option label="提示" :value="1"></el-option>
+            <el-option label="一般" :value="2"></el-option>
+            <el-option label="严重" :value="3"></el-option>
+            <el-option label="紧急" :value="4"></el-option>
+            <el-option label="致命" :value="5"></el-option>
+          </el-select>
         </el-form-item>
       </el-col>
+
       <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
         <el-form-item label="组织机构:">
           <auth-selection

+ 192 - 186
src/views/warning/warningSetting/index.vue

@@ -1,186 +1,192 @@
-<template>
-  <div class="ele-body">
-    <el-card shadow="never" v-loading="loading">
-      <setting-search @search="reload"> </setting-search>
-      <!-- 数据表格 -->
-      <ele-pro-table
-        ref="table"
:pageSizes="tablePageSizes"
-        :columns="columns"
-        :datasource="datasource"
-        cache-key="systemRoleTable"
-      >
-        <!-- 表头工具栏 -->
-        <template v-slot:toolbar>
-          <el-button
-            size="small"
-            type="primary"
-            icon="el-icon-plus"
-            class="ele-btn-icon"
-            @click="openEdit()"
-          >
-            新建
-          </el-button>
-        </template>
-        <template v-slot:enable="{ row }">
-          <el-switch
-            v-model="row.enable"
-            active-color="#13ce66"
-            inactive-color="#ff4949"
-            :active-value="1"
-            :inactive-value="0"
-            disabled
-          >
-          </el-switch>
-        </template>
-        <!-- 操作列 -->
-        <template v-slot:action="{ row }">
-          <el-link
-            type="primary"
-            :underline="false"
-            icon="el-icon-edit"
-            @click="openEdit(row)"
-          >
-            修改
-          </el-link>
-          <el-popconfirm
-            class="ele-action"
-            title="确定要删除此告警设置吗?"
-            @confirm="remove(row)"
-          >
-            <template v-slot:reference>
-              <el-link type="danger" :underline="false" icon="el-icon-delete">
-                删除
-              </el-link>
-            </template>
-          </el-popconfirm>
-        </template>
-      </ele-pro-table>
-    </el-card>
-	
-	<AddWarningDialog
-	  ref="addWarningDialogRef"
-	  :dialogTitle="dialogTitle"
-	  @refreshList="reload"
-	/>
-
-  </div>
-</template>
-
-<script>
-  import SettingSearch from './components/setting-search.vue';
-  import AddWarningDialog from './components/addWarningDialog.vue'
-  import dictMixins from '@/mixins/dictMixins';
-  import { planConfigPage, removeRule } from '@/api/ruleManagement/plan';
-  export default {
-    mixins: [dictMixins],
-    components: {
-      SettingSearch, AddWarningDialog
-    },
-    data () {
-      return {
-        // 表格列配置
-        columns: [
-          {
-            columnKey: 'index',
-            label: '序号',
-            type: 'index',
-            width: 55,
-            align: 'center',
-            showOverflowTooltip: true,
-            fixed: 'left'
-          },
-          {
-            prop: 'status',
-            label: '告警级别',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110,
-            formatter: (_row, _column, cellValue) => {
-              return this.getDictValue('告警级别', _row.status);
-            }
-          },		  
-          {
-            prop: 'enable',
-            label: '状态',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-          {
-            prop: 'fl',
-            label: '告警设备分类',
-            align: 'center',
-            showOverflowTooltip: true,
-            minWidth: 110
-          },
-		  {
-		    prop: 'groupName',
-		    label: '告警名称',
-		    align: 'center',
-		    showOverflowTooltip: true,
-		    minWidth: 110
-		  },
-		  {
-		    prop: 'categoryName',
-		    label: '告警描述',
-		    align: 'center',
-		    showOverflowTooltip: true,
-		    minWidth: 110
-		  },
-          {
-            columnKey: 'action',
-            label: '操作',
-            width: 150,
-            align: 'center',
-            resizable: false,
-            slot: 'action',
-            showOverflowTooltip: true
-          }
-        ],
-        // 加载状态
-        loading: false,
-        pageType: 'add',
-        dialogTitle: '',
-        isBindPlan: false
-      };
-    },
-    computed: {},
-    created () {
-      this.requestDict('告警级别');
-    },
-    methods: {
-      /* 表格数据源 */
-      datasource ({ page, limit, where, order }) {
-        return planConfigPage({
-          pageNum: page,
-          size: limit,
-          ...where,
-          ruleType: 2
-        });
-      },
-
-      /* 刷新表格 */
-      reload (where) {
-        this.$refs.table.reload({ page: 1, where, ruleType: 2 });
-      },
-
-      openEdit (row) {
-		  if(row){
-			  this.dialogTitle = '编辑告警'
-		  }else{
-			  this.dialogTitle = '新增告警'
-		  }
-		  this.$refs.addWarningDialogRef.addWarningDialog = true
-      },
-
-      remove (row) {
-        removeRule([row.id]).then((res) => {
-          this.$message.success('删除成功!');
-          this.reload();
-        });
-      }
-    }
-  };
-</script>
-
-<style lang="scss" scoped></style>
+<template>
+  <div class="ele-body">
+    <el-card shadow="never" v-loading="loading">
+      <setting-search @search="reload"> </setting-search>
+      <!-- 数据表格 -->
+      <ele-pro-table
+        ref="table"
+        :pageSizes="tablePageSizes"
+        :columns="columns"
+        :datasource="datasource"
+        cache-key="systemRoleTable"
+        height="calc(100vh - 350px)"
+      >
+        <!-- 表头工具栏 -->
+        <template v-slot:toolbar>
+          <el-button
+            size="small"
+            type="primary"
+            icon="el-icon-plus"
+            class="ele-btn-icon"
+            @click="openEdit('add')"
+          >
+            新建
+          </el-button>
+        </template>
+        <template v-slot:enable="{ row }">
+          <el-switch
+            v-model="row.enable"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            :active-value="1"
+            :inactive-value="0"
+            disabled
+          >
+          </el-switch>
+        </template>
+        <template v-slot:code="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            @click="openEdit('view', row)"
+          >
+            {{ row.code }}
+          </el-link>
+        </template>
+        <!-- 操作列 -->
+        <template v-slot:action="{ row }">
+          <el-link
+            type="primary"
+            :underline="false"
+            icon="el-icon-edit"
+            @click="openEdit('edit', row)"
+          >
+            修改
+          </el-link>
+          <el-popconfirm
+            class="ele-action"
+            title="确定要删除此告警设置吗?"
+            @confirm="remove(row)"
+          >
+            <template v-slot:reference>
+              <el-link type="danger" :underline="false" icon="el-icon-delete">
+                删除
+              </el-link>
+            </template>
+          </el-popconfirm>
+        </template>
+      </ele-pro-table>
+    </el-card>
+
+    <AddWarningDialog ref="addWarningDialogRef" @refreshList="reload" />
+  </div>
+</template>
+
+<script>
+  import SettingSearch from './components/setting-search.vue';
+  import AddWarningDialog from './components/addWarningDialog.vue';
+  import dictMixins from '@/mixins/dictMixins';
+  import { getList, remove } from '@/api/warning/index.js';
+  export default {
+    mixins: [dictMixins],
+    components: {
+      SettingSearch,
+      AddWarningDialog
+    },
+    data() {
+      return {
+        // 表格列配置
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            prop: 'code',
+            label: '告警编码',
+            align: 'center',
+            slot: 'code',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'name',
+            label: '告警名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'level',
+            label: '告警级别',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (_row, _column, cellValue) => {
+              return { 1: '提示', 2: '一般', 3: '严重', 4: '紧急', 5: '致命' }[
+                cellValue
+              ];
+            }
+          },
+
+          {
+            prop: 'deviceName',
+            label: '告警设备名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+
+          {
+            prop: 'description',
+            label: '告警描述',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            columnKey: 'action',
+            label: '操作',
+            width: 150,
+            align: 'center',
+            resizable: false,
+            slot: 'action',
+            showOverflowTooltip: true
+          }
+        ],
+        // 加载状态
+        loading: false,
+        pageType: 'add',
+        dialogTitle: '',
+        isBindPlan: false
+      };
+    },
+    computed: {},
+    created() {
+      this.requestDict('告警级别');
+    },
+    methods: {
+      /* 表格数据源 */
+      datasource({ page, limit, where, order }) {
+        return getList({
+          pageNum: page,
+          size: limit,
+          ...where
+        });
+      },
+
+      /* 刷新表格 */
+      reload(where) {
+        this.$refs.table.reload({ page: 1, where });
+      },
+
+      openEdit(type, row) {
+        this.$refs.addWarningDialogRef.open(type, row);
+      },
+
+      remove(row) {
+        remove([row.id]).then((res) => {
+          this.$message.success('删除成功!');
+          this.reload();
+        });
+      }
+    }
+  };
+</script>
+
+<style lang="scss" scoped></style>