Procházet zdrojové kódy

update 页面显示

bzd_lxf před 3 měsíci
rodič
revize
c4d243aba7

+ 44 - 0
pm_ui/src/api/control/control.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询设备控制记录列表
+export function listControl(query) {
+    return request({
+        url: '/control/control/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询设备控制记录详细
+export function getControl(id) {
+    return request({
+        url: '/control/control/' + id,
+        method: 'get'
+    })
+}
+
+// 新增设备控制记录
+export function addControl(data) {
+    return request({
+        url: '/control/control',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改设备控制记录
+export function updateControl(data) {
+    return request({
+        url: '/control/control',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除设备控制记录
+export function delControl(id) {
+    return request({
+        url: '/control/control/' + id,
+        method: 'delete'
+    })
+}

+ 44 - 0
pm_ui/src/api/driver/device.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询设备基础信息列表
+export function listDevice(query) {
+    return request({
+        url: '/driver/device/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询设备基础信息详细
+export function getDevice(id) {
+    return request({
+        url: '/driver/device/' + id,
+        method: 'get'
+    })
+}
+
+// 新增设备基础信息
+export function addDevice(data) {
+    return request({
+        url: '/driver/device',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改设备基础信息
+export function updateDevice(data) {
+    return request({
+        url: '/driver/device',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除设备基础信息
+export function delDevice(id) {
+    return request({
+        url: '/driver/device/' + id,
+        method: 'delete'
+    })
+}

+ 44 - 0
pm_ui/src/api/waring/waring.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询设备告警列表
+export function listWaring(query) {
+    return request({
+        url: '/waring/waring/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询设备告警详细
+export function getWaring(id) {
+    return request({
+        url: '/waring/waring/' + id,
+        method: 'get'
+    })
+}
+
+// 新增设备告警
+export function addWaring(data) {
+    return request({
+        url: '/waring/waring',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改设备告警
+export function updateWaring(data) {
+    return request({
+        url: '/waring/waring',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除设备告警
+export function delWaring(id) {
+    return request({
+        url: '/waring/waring/' + id,
+        method: 'delete'
+    })
+}

+ 1 - 0
pm_ui/src/assets/icons/svg/caller.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744785499666" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3138" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><path d="M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512zM334.367347 261.22449a73.142857 73.142857 0 1 0 73.142857 73.142857 73.142857 73.142857 0 0 0-73.142857-73.142857z m198.530612 0a52.244898 52.244898 0 1 0 52.244898 52.244898 52.244898 52.244898 0 0 0-52.244898-52.244898z m-5.22449 135.836734C415.148408 397.061224 365.714286 420.362449 365.714286 532.897959c0 42.840816 80.854204 52.871837 94.040816 94.040817 21.472653 67.186939-33.436735 161.018776 67.918367 167.183673 112.326531 6.896327 161.959184-96.444082 161.959184-208.979592s-49.423673-188.081633-161.959184-188.081633zM710.530612 303.020408a52.244898 52.244898 0 1 0 52.244898 52.244898 52.244898 52.244898 0 0 0-52.244898-52.244898z" p-id="3139"></path></svg>

+ 1 - 0
pm_ui/src/assets/icons/svg/elevator.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744785497210" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2981" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><path d="M955.84 0A68.48 68.48 0 0 1 1024 68.16v887.68a68.48 68.48 0 0 1-68.16 68.16H68.16A68.48 68.48 0 0 1 0 955.84V68.16A68.48 68.48 0 0 1 68.16 0h887.68z m-10.56 78.72H78.72v866.56h866.56z m-472.64 39.36v787.84H118.08V118.08z m433.28 0v787.84H512V118.08zM733.44 420.8h-52.48v96h-52.48l78.72 141.76 78.72-141.76h-52.48zM308.8 398.4l-79.04 141.44h52.48v96h52.48v-96h52.8z" p-id="2982"></path></svg>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
pm_ui/src/assets/icons/svg/logistics.svg


+ 1 - 0
pm_ui/src/assets/icons/svg/passageway.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744785503049" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3295" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><path d="M981.2 42.8C953.7 15.4 916.5 0 877.7 0H146.3c-38.8 0-76 15.4-103.4 42.8C15.4 70.3 0 107.5 0 146.3v731.4c0 38.8 15.4 76 42.8 103.4 27.4 27.4 64.6 42.9 103.4 42.9h731.4c38.8 0 76-15.4 103.4-42.9 27.4-27.4 42.8-64.6 42.8-103.4V146.3c0.2-38.8-15.2-76-42.6-103.5z m-234.4-2.9h64c8.8 0 16 7.2 16 16s-7.2 16-16 16h-64c-8.8 0-16-7.2-16-16 0-8.9 7.2-16 16-16z m-92.4 833.4v-87.7H171.9V664.2h482.5v-89.3l223.3 149.2-223.3 149.2zM852.1 398H369.6v95.4L146.3 336.5l223.3-146.7v86.8h482.5V398z m92-261.6c-3.1-15.8-14.6-35.6-19.8-40-5.1-4.4-16.3-12.9-32.7-14.9-8.8-1.1-15-9.1-13.9-17.8 1.1-8.8 9.1-15 17.8-13.9 16.6 2 31 10.5 42.5 17.7 18.1 11.3 32.3 35.6 37.6 62.8 1.7 8.7-4 17.1-12.6 18.8-1 0.2-2.1 0.3-3.1 0.3-7.6-0.1-14.3-5.4-15.8-13z m39.8 327.9c0 8.8-7.2 16-16 16s-16-7.2-16-16V379c0-8.8 7.2-16 16-16s16 7.2 16 16v85.3z m0-170.7c0 8.8-7.2 16-16 16s-16-7.2-16-16v-85.3c0-8.8 7.2-16 16-16s16 7.2 16 16v85.3z" p-id="3296"></path></svg>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
pm_ui/src/assets/icons/svg/ridership.svg


+ 19 - 12
pm_ui/src/layout/components/Navbar.vue

@@ -19,7 +19,7 @@
           </div>
         </el-tooltip>
         <!-- 弹框组件 -->
-        <el-dialog v-model="dialogVisible" title="通知" width="30%">
+        <el-dialog v-model="dialogVisible" title="通知" width="30%" :before-close="close">
           <el-row :gutter="20">
             <el-col :span="24">
               <div class="dialog-item">
@@ -30,14 +30,14 @@
             <el-col :span="24">
               <div class="dialog-item">
                 <span class="label">类型:</span>
-                <!--                <el-select v-model="noticeType" readonly placeholder="请选择公告类型" style="width: 90%;">
-                  <el-option
-                      v-for="dict in dict.type.sys_notice_type"
-                      :key="dict.value"
-                      :label="dict.label"
-                      :value="dict.value"
-                  ></el-option>
-                </el-select>-->
+                  <el-select v-model="noticeType" disabled placeholder="请选择公告类型" style="width: 90%;">
+                    <el-option
+                        v-for="dict in sys_notice_type"
+                        :key="dict.value"
+                        :label="dict.label"
+                        :value="dict.value"
+                    ></el-option>
+                </el-select>
               </div>
             </el-col>
             <el-col :span="24">
@@ -47,9 +47,11 @@
               </div>
             </el-col>
           </el-row>
-          <span slot="footer" class="dialog-footer">
-            <el-button type="primary" @click="dialogVisible = false">已 读</el-button>
-          </span>
+          <template #footer>
+            <div class="dialog-footer">
+              <el-button type="primary" @click="close">已 读</el-button>
+            </div>
+          </template>
         </el-dialog>
         <header-search id="header-search" class="right-menu-item" />
         <screenfull id="screenfull" class="right-menu-item hover-effect" />
@@ -104,6 +106,8 @@ import { getNotice, show } from "@/api/system/notice";
 import useAppStore from '@/store/modules/app'
 import useUserStore from '@/store/modules/user'
 import useSettingsStore from '@/store/modules/settings'
+const { proxy } = getCurrentInstance();
+const { sys_notice_status, sys_notice_type } = proxy.useDict("sys_notice_status", "sys_notice_type");
 
 const appStore = useAppStore()
 const userStore = useUserStore()
@@ -154,6 +158,9 @@ function showDetail() {
   } else {
     dialogVisible.value = true;
   }
+}
+function close() {
+  dialogVisible.value = false;
   show({ noticeId: notice_id.value }).then(response => {
     getlistNotice();
   })

+ 328 - 0
pm_ui/src/views/control/control/index.vue

@@ -0,0 +1,328 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="设备ID" prop="deviceId">
+        <el-input
+            v-model="queryParams.deviceId"
+            placeholder="请输入设备ID"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="点位ID" prop="pointId">
+        <el-input
+            v-model="queryParams.pointId"
+            placeholder="请输入点位ID"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="控制结果(0-失败,1-成功)" prop="controlResult">
+        <el-input
+            v-model="queryParams.controlResult"
+            placeholder="请输入控制结果(0-失败,1-成功)"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="操作人姓名" prop="operatorName">
+        <el-input
+            v-model="queryParams.operatorName"
+            placeholder="请输入操作人姓名"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+            v-hasPermi="['control:control:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['control:control:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['control:control:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['control:control:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="controlList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="设备ID" align="center" prop="deviceId" />
+      <el-table-column label="点位ID" align="center" prop="pointId" />
+      <el-table-column label="控制类型" align="center" prop="controlType" />
+      <el-table-column label="原值" align="center" prop="oldValue" />
+      <el-table-column label="新值" align="center" prop="newValue" />
+      <el-table-column label="控制结果(0-失败,1-成功)" align="center" prop="controlResult" />
+      <el-table-column label="操作人ID" align="center" prop="operatorId" />
+      <el-table-column label="操作人姓名" align="center" prop="operatorName" />
+      <el-table-column label="操作时间" align="center" prop="operateTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.operateTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['control:control:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['control:control:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改设备控制记录对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="controlRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="设备ID" prop="deviceId">
+          <el-input v-model="form.deviceId" placeholder="请输入设备ID" />
+        </el-form-item>
+        <el-form-item label="点位ID" prop="pointId">
+          <el-input v-model="form.pointId" placeholder="请输入点位ID" />
+        </el-form-item>
+        <el-form-item label="原值" prop="oldValue">
+          <el-input v-model="form.oldValue" placeholder="请输入原值" />
+        </el-form-item>
+        <el-form-item label="新值" prop="newValue">
+          <el-input v-model="form.newValue" placeholder="请输入新值" />
+        </el-form-item>
+        <el-form-item label="控制结果(0-失败,1-成功)" prop="controlResult">
+          <el-input v-model="form.controlResult" placeholder="请输入控制结果(0-失败,1-成功)" />
+        </el-form-item>
+        <el-form-item label="操作人ID" prop="operatorId">
+          <el-input v-model="form.operatorId" placeholder="请输入操作人ID" />
+        </el-form-item>
+        <el-form-item label="操作人姓名" prop="operatorName">
+          <el-input v-model="form.operatorName" placeholder="请输入操作人姓名" />
+        </el-form-item>
+        <el-form-item label="操作时间" prop="operateTime">
+          <el-date-picker clearable
+                          v-model="form.operateTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择操作时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Control">
+import { listControl, getControl, delControl, addControl, updateControl } from "@/api/control/control";
+
+const { proxy } = getCurrentInstance();
+
+const controlList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    deviceId: null,
+    pointId: null,
+    controlType: null,
+    controlResult: null,
+    operatorName: null,
+  },
+  rules: {
+    deviceId: [
+      { required: true, message: "设备ID不能为空", trigger: "blur" }
+    ],
+    pointId: [
+      { required: true, message: "点位ID不能为空", trigger: "blur" }
+    ],
+    controlType: [
+      { required: true, message: "控制类型不能为空", trigger: "change" }
+    ],
+    operatorId: [
+      { required: true, message: "操作人ID不能为空", trigger: "blur" }
+    ],
+    operatorName: [
+      { required: true, message: "操作人姓名不能为空", trigger: "blur" }
+    ],
+    operateTime: [
+      { required: true, message: "操作时间不能为空", trigger: "blur" }
+    ],
+    createTime: [
+      { required: true, message: "创建时间不能为空", trigger: "blur" }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询设备控制记录列表 */
+function getList() {
+  loading.value = true;
+  listControl(queryParams.value).then(response => {
+    controlList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    deviceId: null,
+    pointId: null,
+    controlType: null,
+    oldValue: null,
+    newValue: null,
+    controlResult: null,
+    operatorId: null,
+    operatorName: null,
+    operateTime: null,
+    remark: null,
+    createTime: null
+  };
+  proxy.resetForm("controlRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加设备控制记录";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _id = row.id || ids.value
+  getControl(_id).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改设备控制记录";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["controlRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateControl(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addControl(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value;
+  proxy.$modal.confirm('是否确认删除设备控制记录编号为"' + _ids + '"的数据项?').then(function() {
+    return delControl(_ids);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('control/control/export', {
+    ...queryParams.value
+  }, `control_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 368 - 0
pm_ui/src/views/device/device/index.vue

@@ -0,0 +1,368 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="设备编码" prop="deviceCode">
+        <el-input
+            v-model="queryParams.deviceCode"
+            placeholder="请输入设备编码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="设备名称" prop="deviceName">
+        <el-input
+            v-model="queryParams.deviceName"
+            placeholder="请输入设备名称"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+            v-hasPermi="['driver:device:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['driver:device:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['driver:device:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['driver:device:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" stripe border :data="deviceList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="设备ID" align="center" prop="id" />
+      <el-table-column label="设备编码" align="center" prop="deviceCode" width="90"/>
+      <el-table-column label="设备名称" align="center" prop="deviceName" width="120"/>
+      <el-table-column label="设备类型" align="center" prop="deviceType" />
+      <el-table-column label="子系统类型" align="center" prop="subsystemType" width="120"/>
+      <el-table-column label="所属空间ID" align="center" prop="spaceId" width="100"/>
+      <el-table-column label="所属空间名称" align="center" prop="spaceName" width="110"/>
+      <el-table-column label="品牌" align="center" prop="brand" />
+      <el-table-column label="型号" align="center" prop="model" width="90"/>
+      <el-table-column label="序列号" align="center" prop="serialNumber" width="120"/>
+      <el-table-column label="生产日期" align="center" prop="manufactureDate" width="110" sortable
+      >
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.manufactureDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="安装日期" align="center" prop="installDate" width="110">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.installDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="保修期(月)" align="center" prop="warrantyPeriod" width="90"/>
+      <el-table-column label="状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :options="sys_drivce_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="是否在线" align="center" prop="isOnline">
+        <template #default="scope">
+          <dict-tag :options="sys_yes_no_tf" :value="scope.row.isOnline"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="设备描述" align="center" prop="description" width="140"/>
+      <el-table-column label="操作" min-width="140" fixed="right" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['driver:device:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['driver:device:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改设备基础信息对话框 -->
+    <el-dialog :title="title" v-model="open" width="1000px" append-to-body>
+      <el-form ref="deviceRef" :model="form" :rules="rules" label-width="180px">
+        <el-form-item label="设备编码" prop="deviceCode">
+          <el-input v-model="form.deviceCode" placeholder="请输入设备编码" />
+        </el-form-item>
+        <el-form-item label="设备名称" prop="deviceName">
+          <el-input v-model="form.deviceName" placeholder="请输入设备名称" />
+        </el-form-item>
+        <el-form-item label="设备类型(空调/新风/配电等)" prop="deviceType">
+          <el-input v-model="form.deviceType" placeholder="请输入设备类型" />
+        </el-form-item>
+        <el-form-item label="子系统类型" prop="subsystemType">
+          <el-input v-model="form.subsystemType" placeholder="请输入子系统类型" />
+        </el-form-item>
+        <el-form-item label="所属空间ID" prop="spaceId">
+          <el-input v-model="form.spaceId" placeholder="请输入所属空间ID" />
+        </el-form-item>
+        <el-form-item label="所属空间名称" prop="spaceName">
+          <el-input v-model="form.spaceName" placeholder="请输入所属空间名称" />
+        </el-form-item>
+        <el-form-item label="品牌" prop="brand">
+          <el-input v-model="form.brand" placeholder="请输入品牌" />
+        </el-form-item>
+        <el-form-item label="型号" prop="model">
+          <el-input v-model="form.model" placeholder="请输入型号" />
+        </el-form-item>
+        <el-form-item label="序列号" prop="serialNumber">
+          <el-input v-model="form.serialNumber" placeholder="请输入序列号" />
+        </el-form-item>
+        <el-form-item label="生产日期" prop="manufactureDate">
+          <el-date-picker clearable
+                          v-model="form.manufactureDate"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择生产日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="安装日期" prop="installDate">
+          <el-date-picker clearable
+                          v-model="form.installDate"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择安装日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="保修期(月)" prop="warrantyPeriod">
+          <el-input v-model="form.warrantyPeriod" placeholder="请输入保修期(月)" />
+        </el-form-item>
+        <el-form-item label="设备状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio
+                v-for="dict in sys_drivce_status"
+                :key="dict.value"
+                :label="parseInt(dict.value)"
+            >{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="是否在线" prop="isOnline">
+         <el-select v-model="form.isOnline" placeholder="请选择">
+            <el-option v-for="dict in sys_yes_no_tf" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="设备描述" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Device">
+import {listDevice, getDevice, delDevice, addDevice, updateDevice} from "@/api/driver/device";
+import {show} from "@/api/system/notice.js";
+
+const {proxy} = getCurrentInstance();
+const {sys_drivce_status,sys_yes_no_tf} = proxy.useDict('sys_drivce_status','sys_yes_no_tf');
+
+const deviceList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    deviceCode: null,
+    deviceName: null,
+    deviceType: null,
+  },
+  rules: {
+    deviceCode: [
+      {required: true, message: "设备编码不能为空", trigger: "blur"}
+    ],
+    deviceName: [
+      {required: true, message: "设备名称不能为空", trigger: "blur"}
+    ],
+    device_type: [
+      {required: true, message: "设备类型不能为空", trigger: "blur"}
+    ],
+    deviceType: [
+      {required: true, message: "设备类型(空调/新风/配电等)不能为空", trigger: "change"}
+    ],
+    subsystemType: [
+      {required: true, message: "子系统类型不能为空", trigger: "change"}
+    ],
+    createTime: [
+      {required: true, message: "创建时间不能为空", trigger: "blur"}
+    ],
+    updateTime: [
+      {required: true, message: "更新时间不能为空", trigger: "blur"}
+    ]
+  }
+});
+
+const {queryParams, form, rules} = toRefs(data);
+
+/** 查询设备基础信息列表 */
+function getList() {
+  loading.value = true;
+  listDevice(queryParams.value).then(response => {
+    deviceList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    deviceCode: null,
+    deviceName: null,
+    deviceType: null,
+    subsystemType: null,
+    spaceId: null,
+    spaceName: null,
+    brand: null,
+    model: null,
+    serialNumber: null,
+    manufactureDate: null,
+    installDate: null,
+    warrantyPeriod: null,
+    status: null,
+    isOnline: null,
+    description: null,
+    createTime: null,
+    updateTime: null
+  };
+  proxy.resetForm("deviceRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加设备基础信息";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _id = row.id || ids.value
+  getDevice(_id).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改设备基础信息";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["deviceRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateDevice(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addDevice(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value;
+  proxy.$modal.confirm('是否确认删除设备基础信息编号为"' + _ids + '"的数据项?').then(function () {
+    return delDevice(_ids);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {
+  });
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('driver/device/export', {
+    ...queryParams.value
+  }, `device_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 377 - 0
pm_ui/src/views/waring/waring/index.vue

@@ -0,0 +1,377 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="告警编码" prop="alarmCode">
+        <el-input
+            v-model="queryParams.alarmCode"
+            placeholder="请输入告警编码"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="告警级别" prop="alarmLevel">
+        <el-input
+            v-model="queryParams.alarmLevel"
+            placeholder="请输入告警级别(1-一般,2-重要,3-紧急)"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+            v-hasPermi="['waring:waring:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+            v-hasPermi="['waring:waring:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+            v-hasPermi="['waring:waring:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="warning"
+            plain
+            icon="Download"
+            @click="handleExport"
+            v-hasPermi="['waring:waring:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="waringList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="告警ID" align="center" prop="id" />
+      <el-table-column label="告警编码" align="center" prop="alarmCode" />
+      <el-table-column label="设备ID" align="center" prop="deviceId" />
+      <el-table-column label="点位ID" align="center" prop="pointId" />
+      <el-table-column label="告警级别(1-一般,2-重要,3-紧急)" align="center" prop="alarmLevel">
+        <template #default="scope">
+          <dict-tag :options="sys_drivce_status" :value="scope.row.alarmLevel"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="告警类型" align="center" prop="alarmType" />
+      <el-table-column label="告警标题" align="center" prop="alarmTitle" />
+      <el-table-column label="告警内容" align="center" prop="alarmContent" />
+      <el-table-column label="触发值" align="center" prop="triggerValue" />
+      <el-table-column label="正常值" align="center" prop="normalValue" />
+      <el-table-column label="开始时间" align="center" prop="startTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.startTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="结束时间" align="center" prop="endTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.endTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="持续时间(秒)" align="center" prop="duration" />
+      <el-table-column label="状态(0-未处理,1-已处理,2-已忽略)" align="center" prop="status" />
+      <el-table-column label="处理人ID" align="center" prop="handlerId" />
+      <el-table-column label="处理人姓名" align="center" prop="handlerName" />
+      <el-table-column label="处理时间" align="center" prop="handleTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.handleTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理方法" align="center" prop="handleMethod" />
+      <el-table-column label="关联服务单ID" align="center" prop="serviceOrderId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['waring:waring:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['waring:waring:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改设备告警对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="waringRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="告警编码" prop="alarmCode">
+          <el-input v-model="form.alarmCode" placeholder="请输入告警编码" />
+        </el-form-item>
+        <el-form-item label="设备ID" prop="deviceId">
+          <el-input v-model="form.deviceId" placeholder="请输入设备ID" />
+        </el-form-item>
+        <el-form-item label="点位ID" prop="pointId">
+          <el-input v-model="form.pointId" placeholder="请输入点位ID" />
+        </el-form-item>
+        <el-form-item label="告警级别(1-一般,2-重要,3-紧急)" prop="alarmLevel">
+          <el-input v-model="form.alarmLevel" placeholder="请输入告警级别(1-一般,2-重要,3-紧急)" />
+        </el-form-item>
+        <el-form-item label="告警标题" prop="alarmTitle">
+          <el-input v-model="form.alarmTitle" placeholder="请输入告警标题" />
+        </el-form-item>
+        <el-form-item label="告警内容">
+          <editor v-model="form.alarmContent" :min-height="192"/>
+        </el-form-item>
+        <el-form-item label="触发值" prop="triggerValue">
+          <el-input v-model="form.triggerValue" placeholder="请输入触发值" />
+        </el-form-item>
+        <el-form-item label="正常值" prop="normalValue">
+          <el-input v-model="form.normalValue" placeholder="请输入正常值" />
+        </el-form-item>
+        <el-form-item label="开始时间" prop="startTime">
+          <el-date-picker clearable
+                          v-model="form.startTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择开始时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="结束时间" prop="endTime">
+          <el-date-picker clearable
+                          v-model="form.endTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择结束时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="持续时间(秒)" prop="duration">
+          <el-input v-model="form.duration" placeholder="请输入持续时间(秒)" />
+        </el-form-item>
+        <el-form-item label="处理人ID" prop="handlerId">
+          <el-input v-model="form.handlerId" placeholder="请输入处理人ID" />
+        </el-form-item>
+        <el-form-item label="处理人姓名" prop="handlerName">
+          <el-input v-model="form.handlerName" placeholder="请输入处理人姓名" />
+        </el-form-item>
+        <el-form-item label="处理时间" prop="handleTime">
+          <el-date-picker clearable
+                          v-model="form.handleTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择处理时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="处理方法" prop="handleMethod">
+          <el-input v-model="form.handleMethod" placeholder="请输入处理方法" />
+        </el-form-item>
+        <el-form-item label="关联服务单ID" prop="serviceOrderId">
+          <el-input v-model="form.serviceOrderId" placeholder="请输入关联服务单ID" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Waring">
+import { listWaring, getWaring, delWaring, addWaring, updateWaring } from "@/api/waring/waring";
+
+const { proxy } = getCurrentInstance();
+
+const waringList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    alarmCode: null,
+    alarmLevel: null,
+    alarmType: null,
+    status: null,
+  },
+  rules: {
+    alarmCode: [
+      { required: true, message: "告警编码不能为空", trigger: "blur" }
+    ],
+    deviceId: [
+      { required: true, message: "设备ID不能为空", trigger: "blur" }
+    ],
+    alarmLevel: [
+      { required: true, message: "告警级别(1-一般,2-重要,3-紧急)不能为空", trigger: "blur" }
+    ],
+    alarmType: [
+      { required: true, message: "告警类型不能为空", trigger: "change" }
+    ],
+    alarmTitle: [
+      { required: true, message: "告警标题不能为空", trigger: "blur" }
+    ],
+    startTime: [
+      { required: true, message: "开始时间不能为空", trigger: "blur" }
+    ],
+    status: [
+      { required: true, message: "状态(0-未处理,1-已处理,2-已忽略)不能为空", trigger: "change" }
+    ],
+    createTime: [
+      { required: true, message: "创建时间不能为空", trigger: "blur" }
+    ],
+    updateTime: [
+      { required: true, message: "更新时间不能为空", trigger: "blur" }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询设备告警列表 */
+function getList() {
+  loading.value = true;
+  listWaring(queryParams.value).then(response => {
+    waringList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    id: null,
+    alarmCode: null,
+    deviceId: null,
+    pointId: null,
+    alarmLevel: null,
+    alarmType: null,
+    alarmTitle: null,
+    alarmContent: null,
+    triggerValue: null,
+    normalValue: null,
+    startTime: null,
+    endTime: null,
+    duration: null,
+    status: null,
+    handlerId: null,
+    handlerName: null,
+    handleTime: null,
+    handleMethod: null,
+    serviceOrderId: null,
+    createTime: null,
+    updateTime: null
+  };
+  proxy.resetForm("waringRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加设备告警";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _id = row.id || ids.value
+  getWaring(_id).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改设备告警";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["waringRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateWaring(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addWaring(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value;
+  proxy.$modal.confirm('是否确认删除设备告警编号为"' + _ids + '"的数据项?').then(function() {
+    return delWaring(_ids);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('waring/waring/export', {
+    ...queryParams.value
+  }, `waring_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 2 - 2
pm_ui/vite.config.js

@@ -31,8 +31,8 @@ export default defineConfig(({ mode, command }) => {
       proxy: {
         // https://cn.vitejs.dev/config/#server-proxy
         '/dev-api': {
-          // target: 'http://localhost:8080',
-          target: 'http://192.168.11.46:8080',
+          target: 'http://localhost:8010',
+          // target: 'http://192.168.11.46:8080',
           changeOrigin: true,
           rewrite: (p) => p.replace(/^\/dev-api/, '')
         }

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů