liwei19941102 2 лет назад
Родитель
Сommit
591d7a2290

+ 13 - 9
ruoyi-ui-vue3/src/views/device/camera/add.vue

@@ -21,7 +21,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.name" placeholder="请输入设备名称" />
+                                <el-input v-model="vidoeParams.name"  placeholder="请输入设备名称" />
                             </div>
                         </el-descriptions-item>
                         <el-descriptions-item>
@@ -32,7 +32,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.sn" placeholder="请输入平台编码" />
+                                <el-input v-model="vidoeParams.sn"  placeholder="请输入平台编码" />
                             </div>
                         </el-descriptions-item>
 
@@ -44,7 +44,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.type" placeholder="请输入主设备类型" />
+                                <el-input v-model="vidoeParams.type"  placeholder="请输入主设备类型" />
                             </div>
                         </el-descriptions-item>
 
@@ -56,7 +56,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.protocolType" placeholder="请输入主设备协议类型" />
+                                <el-input v-model="vidoeParams.protocolType"  placeholder="请输入主设备协议类型" />
                             </div>
                         </el-descriptions-item>
 
@@ -68,7 +68,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.connectCode" placeholder="请输入设备互联网编码" />
+                                <el-input v-model="vidoeParams.connectCode"  placeholder="请输入设备互联网编码" />
                             </div>
                         </el-descriptions-item>
 
@@ -80,7 +80,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.model" placeholder="请输入设备型号" />
+                                <el-input v-model="vidoeParams.model"  placeholder="请输入设备型号" />
                             </div>
                         </el-descriptions-item>
 
@@ -92,7 +92,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.videoFormat" placeholder="请输入设备制式" />
+                                <el-input v-model="vidoeParams.videoFormat"  placeholder="请输入设备制式" />
                             </div>
                         </el-descriptions-item>
 
@@ -104,7 +104,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.vendorType" placeholder="请输入设备提供商类型" />
+                                <el-input v-model="vidoeParams.vendorType"  placeholder="请输入设备提供商类型" />
                             </div>
                         </el-descriptions-item>
 
@@ -116,7 +116,7 @@
 
                             </template>
                             <div class="content-w">
-                                <el-input v-model="vidoeParams.serialNumber" placeholder="请输入序列号" />
+                                <el-input v-model="vidoeParams.serialNumber"  placeholder="请输入序列号" />
                             </div>
                         </el-descriptions-item>
                     </el-descriptions>
@@ -230,6 +230,8 @@ const router = useRouter();
 
 const { proxy } = getCurrentInstance();
 
+const isDisabled = ref(true)
+
 const tableData = ref([]);
 
 const title = ref("新增")
@@ -238,6 +240,7 @@ const dialogTitle = ref("新增");
 
 const dialogFormVisible = ref(false);
 
+
 const vidoeParams = ref({
     id: null,
     name: "",
@@ -269,6 +272,7 @@ const videoDeTailParams = ref({
 })
 
 let objId = route.query.id
+isDisabled.value = route.query.isEdit
 
 const getVideoData = () => {
     getVideo(objId).then(res => {

+ 66 - 19
ruoyi-ui-vue3/src/views/device/camera/detail.vue

@@ -9,15 +9,20 @@
       <el-row>
         <el-col :span="24">
           <el-descriptions :column="4">
-            <el-descriptions-item label-class-name="mylabel" label="设备名称">kooriookami</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="平台编码">18100000000</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="主设备类型">Suzhou</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="主设备协议类型">Suzhou</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="设备互联编码">Suzhou</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="设备类型">Suzhou</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="视频制式">Suzhou</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="设备提供商类型">Suzhou</el-descriptions-item>
-            <el-descriptions-item label-class-name="mylabel" label="序列号">Suzhou</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="设备名称: ">{{ vidoeParams.name }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="平台编码:">{{ vidoeParams.sn }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="主设备类型:">{{ vidoeParams.type }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="主设备协议类型:">{{
+          vidoeParams.protocolType }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="设备互联编码:">{{
+          vidoeParams.connectCode }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="设备类型:">{{ vidoeParams.model }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="视频制式:">{{
+          vidoeParams.videoFormat }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="设备提供商类型: ">{{
+          vidoeParams.vendorType }}</el-descriptions-item>
+            <el-descriptions-item label-class-name="mylabel" label="序列号: ">{{
+              vidoeParams.serialNumber}}</el-descriptions-item>
           </el-descriptions>
         </el-col>
       </el-row>
@@ -32,15 +37,15 @@
       <el-row>
         <el-col :span="24">
           <el-table :data="tableData" border>
-            <el-table-column width="180" prop="name" label="视频输入通道号"></el-table-column>
-            <el-table-column width="180" prop="code" label="摄像机编码"></el-table-column>
-            <el-table-column prop="type" label="摄像机名称"></el-table-column>
-            <el-table-column prop="protocol" label="摄像机类型"></el-table-column>
-            <el-table-column prop="protocol" label="纬度"></el-table-column>
-            <el-table-column prop="protocol" label="经度"></el-table-column>
-            <el-table-column prop="protocol" label="摄像机安装高度"></el-table-column>
-            <el-table-column  width="180" prop="protocol" label="摄像机绑定音频通道"></el-table-column>
-            <el-table-column prop="protocol" label="是否支持组播"></el-table-column>
+            <el-table-column width="180" prop="videoChannel" label="视频输入通道号"></el-table-column>
+            <el-table-column width="180" prop="cameraCode" label="摄像机编码"></el-table-column>
+            <el-table-column prop="cameraName" label="摄像机名称"></el-table-column>
+            <el-table-column prop="cameraType" label="摄像机类型"></el-table-column>
+            <el-table-column prop="longitude" label="纬度"></el-table-column>
+            <el-table-column prop="latitude" label="经度"></el-table-column>
+            <el-table-column prop="height" label="摄像机安装高度"></el-table-column>
+            <el-table-column prop="voiceOutCode" label="摄像机绑定音频通道"></el-table-column>
+            <el-table-column prop="isSupportBoardcast" label="是否支持组播"></el-table-column>
           </el-table>
         </el-col>
       </el-row>
@@ -52,10 +57,51 @@
 </template>
 
 <script setup lang="ts" name="Units">
-import {ref} from "vue";
+import { ref } from "vue";
+import { useRoute, useRouter } from "vue-router";
+import { listVideo, getVideo, delVideo, addVideo, updateVideo } from "@/api/data/video";
+import { listVideoDetail, getVideoDetail, delVideoDetail, addVideoDetail, updateVideoDetail } from "@/api/data/videoDetail";
 
 const tableData = ref([]);
 
+const route = useRoute();
+const router = useRouter();
+
+let objId = route.query.id
+
+const vidoeParams = ref({
+  id: null,
+  name: "",
+  sn: "",
+  type: "",
+  protocolType: '',
+  connectCode: "",
+  model: "",
+  videoFormat: "",
+  vendorType: '',
+  serialNumber: ''
+})
+
+const getVideoData = () => {
+  getVideo(objId).then(res => {
+    if (res.code == 200) {
+      vidoeParams.value = res.data
+    }
+  })
+}
+
+const getVideoDetailList = () => {
+  listVideoDetail({ videoId: objId }).then(res => {
+    console.log(res);
+    if (res.code == 200) {
+      tableData.value = res.rows
+    }
+  })
+}
+
+getVideoData();
+getVideoDetailList();
+
 </script>
 
 <style lang="scss" scoped>
@@ -64,6 +110,7 @@ const tableData = ref([]);
   flex-direction: row;
   justify-content: space-between;
 }
+
 :deep(.mylabel) {
   font-size: 15px;
   color: #000;

+ 66 - 6
ruoyi-ui-vue3/src/views/device/camera/index.vue

@@ -36,6 +36,7 @@
             </div>
             <div>
               <el-button type="primary" plain>重置</el-button>
+              <el-button type="danger" @click="deleteall">批量删除</el-button>
               <el-button type="primary" @click="getVideoList">搜索</el-button>
             </div>
           </div>
@@ -54,7 +55,8 @@
 
           <el-row>
             <el-col :span="24" style="padding-left: 10px">
-              <el-table :data="devicetabledata" :border="true">
+              <el-table :data="devicetabledata" :border="true" ref="tableref" >
+                <el-table-column type="selection" width="55"></el-table-column>
                 <el-table-column label="设备名称" prop="name"></el-table-column>
                 <el-table-column label="平台编码" prop="sn"></el-table-column>
                 <el-table-column label="设备类型" prop="type"></el-table-column>
@@ -71,6 +73,13 @@
                           </el-icon>
                         </el-tooltip>
                       </el-button>
+                      <el-button link @click="goDetail(scope.row)">
+                        <el-tooltip effect="dark" content="详情">
+                          <el-icon>
+                            <Document />
+                          </el-icon>
+                        </el-tooltip>
+                      </el-button>
                       <el-popconfirm title="确定删除该编码?" @confirm="godelVideo(scope.row)">
                         <template #reference>
                           <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
@@ -103,6 +112,7 @@ import { LayTree } from "@layui/layui-vue";
 import "@layui/layui-vue/lib/index.css";
 import { listVideo, getVideo, delVideo, addVideo, updateVideo } from "@/api/data/video";
 import { listVideoDetail, getVideoDetail, delVideoDetail, addVideoDetail, updateVideoDetail } from "@/api/data/videoDetail";
+import { ElMessage, ElMessageBox } from "element-plus";
 
 
 const route = useRoute();
@@ -110,6 +120,21 @@ const router = useRouter();
 
 const treeList = ref([])
 
+// const tableref = ref(null);
+
+const vidoeParams = ref({
+    id: null,
+    name: "",
+    sn: "",
+    type: "",
+    protocolType: '',
+    connectCode: "",
+    model: "",
+    videoFormat: "",
+    vendorType: '',
+    serialNumber: ''
+})
+
 const handleClick = (node) => {
   if (node.videoId != null) {
     searchform.value.id = node.videoId
@@ -178,9 +203,9 @@ const onchangepage = (page) => {
   getVideoList();
 }
 
-const godetail = () => {
-  router.push("/device/camera/detail")
-}
+// const godetail = () => {
+//   router.push("/device/camera/detail")
+// }
 
 const godelVideo = (item) => {
   console.log(item)
@@ -191,7 +216,7 @@ const godelVideo = (item) => {
   })
 }
 
-async function getVideoDetailList() {
+const getVideoDetailList = () => {
   listVideoDetail({ pageSize: 10000 }).then(res => {
     console.log(treeList.value);
     treeList.value.forEach(video => {
@@ -209,6 +234,37 @@ async function getVideoDetailList() {
   })
 }
 
+const tableref = ref(null);
+
+const deleteall = () => {
+  let selected = tableref.value.getSelectionRows();
+  if (selected.length == 0) {
+    ElMessage.warning("请选择要删除的行");
+    return;
+  }
+
+  if (selected.length > 0) {
+    ElMessageBox.confirm(
+      `是否删除${selected.length}条数据`,
+      "警告",
+      {
+        confirmButtonText: "确认",
+        cancelButtonText: "取消",
+        type: 'warning',
+      }
+    ).then(() => {
+
+      delVideo(selected.map(i => i.id).join(",")).then((res) => {
+        ElMessage.success("删除成功");
+        getVideoList();
+        getVideoDeviceList();
+      })
+
+    });
+  }
+
+}
+
  function getVideoDeviceList() {
   listVideo({ pageSize: 10000 }).then(res => {
     treeList.value = res.rows;
@@ -216,6 +272,10 @@ async function getVideoDetailList() {
   })
 }
 
+const goDetail = (item ) => {
+  router.push({ path: '/device/camera/detail',query: { id: item.id } })
+}
+
 const getVideoList = () => {
   console.log(searchform.value);
   listVideo({ ...searchform.value, pageSize: pagedata.value.size, pageNum: pagedata.value.current }).then(res => {
@@ -224,7 +284,7 @@ const getVideoList = () => {
 }
 
 const goAdd = () => {
-  router.push("/device/camera/add")
+  router.push({ path: '/device/camera/add'})
 }
 
 const goUpdate = (item) => {

+ 183 - 84
ruoyi-ui-vue3/src/views/device/device/index.vue

@@ -1,16 +1,14 @@
 <template>
   <div style="padding: 10px 15px">
-    <el-card class="box-card" >
+    <el-card class="box-card">
       <div style="display: flex; flex-direction: row; justify-content: space-between">
         <div>
-          <div
-            style="
+          <div style="
               display: flex;
               flex-direction: row;
               flex-wrap: nowrap;
               align-items: center;
-            "
-          >
+            ">
             <div style="font-size: 12px; width: 80px">模板名称:</div>
             <el-input v-model="searchform.name" placeholder="设备名称"></el-input>
           </div>
@@ -29,16 +27,16 @@
           <div>
             <el-button type="primary" @click="adddevice">添加</el-button>
             <el-button type="danger" @click="deleteall">批量删除</el-button>
-            <el-button type="primary" plain @click="ziduanshow=true">显示字段</el-button>
+            <el-button type="primary" plain @click="ziduanshow = true">显示字段</el-button>
           </div>
         </div>
       </template>
 
       <el-row>
         <el-col :span="24" style="padding-left: 10px">
-          <el-table  ref="tableref" :data="devicetabledata" :border="true">
+          <el-table ref="tableref" :data="devicetabledata" :border="true">
             <el-table-column type="selection" width="55"></el-table-column>
-            <el-table-column v-for="item in cloumdata.filter(i=>i.visible)" :prop="item.prop" :label="item.label" >
+            <el-table-column v-for="item in cloumdata.filter(i => i.visible)" :prop="item.prop" :label="item.label">
             </el-table-column>
             <el-table-column label="操作">
               <template #default="scope">
@@ -50,12 +48,18 @@
                       </el-icon>
                     </el-tooltip>
                   </el-button>
+                  <el-button link @click="detailrow(scope.row)">
+                    <el-tooltip effect="dark" content="详情">
+                      <el-icon>
+                        <Document />
+                      </el-icon>
+                    </el-tooltip>
+                  </el-button>
                   <el-popconfirm title="确定删除该设备模板?" @confirm="deleterow(scope.row)">
                     <template #reference>
-                      <el-button link
-                        ><el-tooltip effect="dark" content="删除"
-                          ><el-icon><Delete /></el-icon></el-tooltip
-                      ></el-button>
+                      <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
+                            <Delete />
+                          </el-icon></el-tooltip></el-button>
                     </template>
                   </el-popconfirm>
                 </div>
@@ -66,27 +70,14 @@
 
         </el-col>
         <el-col :span="24" style="margin-top: 10px;">
-          <el-pagination style="float: right;"
-                         small
-                         background
-                         layout="prev, pager, next"
-                         :total="pagedata.total"
-                         :page-size="pagedata.size"
-                         :current-page="pagedata.current"
-                         @current-change="onchangepage"
-                         class="mt-4"
-          />
+          <el-pagination style="float: right;" small background layout="prev, pager, next" :total="pagedata.total"
+            :page-size="pagedata.size" :current-page="pagedata.current" @current-change="onchangepage" class="mt-4" />
         </el-col>
       </el-row>
     </el-card>
 
 
-    <el-dialog
-      title="添加设备"
-      v-model="addshow"
-      width="50%"
-      @close="addshow = false"
-    >
+    <el-dialog title="添加设备" v-model="addshow" width="50%" @close="addshow = false">
       <div>
         <el-descriptions :column="2">
           <el-descriptions-item label="设备名称">
@@ -96,7 +87,7 @@
               </div>
             </template>
             <div class="content-w">
-                <el-input v-model="currentdata.name" placeholder="设备名称" />
+              <el-input v-model="currentdata.name" placeholder="设备名称" />
             </div>
           </el-descriptions-item>
           <el-descriptions-item label="设备型号">
@@ -106,7 +97,7 @@
               </div>
             </template>
             <div class="content-w">
-                <el-input v-model="currentdata.model" placeholder="设备型号"  />
+              <el-input v-model="currentdata.model" placeholder="设备型号" />
             </div>
           </el-descriptions-item>
           <el-descriptions-item label="设备类型">
@@ -126,36 +117,99 @@
               </div>
             </template>
             <div class="content-w">
-                <el-input v-model="currentdata.producer" placeholder="生产厂商"  />
+              <el-input v-model="currentdata.producer" placeholder="生产厂商" />
             </div>
           </el-descriptions-item>
           <el-descriptions-item label="制造商">
             <template #label>
-               <div style="display: inline-block;min-width: 100px;text-align: right">
-                 制造商
-               </div>
-           </template>
-          <div class="content-w">
-            <el-input v-model="currentdata.manufacturer" placeholder="制造商"  />
-           </div>
+              <div style="display: inline-block;min-width: 100px;text-align: right">
+                制造商
+              </div>
+            </template>
+            <div class="content-w">
+              <el-input v-model="currentdata.manufacturer" placeholder="制造商" />
+            </div>
           </el-descriptions-item>
 
         </el-descriptions>
 
       </div>
-      <div slot="footer" class="dialog-footer" style="text-align: right" >
+      <div slot="footer" class="dialog-footer" style="text-align: right">
         <el-button @click="addshow = false">取 消</el-button>
         <el-button type="primary" @click="dosave">保 存</el-button>
       </div>
 
     </el-dialog>
 
-    <el-dialog
-      title="字段显示"
-      v-model="ziduanshow"
-      width="50%"
-      @close="ziduanshow = false"
-    >
+    <el-dialog title="设备详情" v-model="detailDialog" width="50%" @close="detailDialog = false">
+      <div>
+        <el-descriptions :column="2">
+          <el-descriptions-item label="设备名称">
+            <template #label>
+              <div style="display: inline-block;min-width: 100px;text-align: right">
+                设备名称
+              </div>
+            </template>
+            <div class="content-w">
+              {{ detailObj.name }}
+            </div>
+          </el-descriptions-item>
+          <el-descriptions-item label="设备型号">
+            <template #label>
+              <div style="display: inline-block;min-width: 100px;text-align: right">
+                设备型号
+              </div>
+            </template>
+            <div class="content-w">
+              <!-- <el-input v-model="currentdata.model" placeholder="设备型号" /> -->
+              {{ detailObj.model }}
+            </div>
+          </el-descriptions-item>
+          <el-descriptions-item label="设备类型">
+            <template #label>
+              <div style="display: inline-block;min-width: 100px;text-align: right">
+                设备类型
+              </div>
+            </template>
+            <div class="content-w">
+              <!-- <el-input v-model="currentdata.type" placeholder="设备类型" /> -->
+              {{ detailObj.type }}
+            </div>
+          </el-descriptions-item>
+          <el-descriptions-item label="生产厂商">
+            <template #label>
+              <div style="display: inline-block;min-width: 100px;text-align: right">
+                生产厂商
+              </div>
+            </template>
+            <div class="content-w">
+              <!-- <el-input v-model="currentdata.producer" placeholder="生产厂商" /> -->
+              {{ detailObj.producer }}
+            </div>
+          </el-descriptions-item>
+          <el-descriptions-item label="制造商">
+            <template #label>
+              <div style="display: inline-block;min-width: 100px;text-align: right">
+                制造商
+              </div>
+            </template>
+            <div class="content-w">
+              <!-- <el-input v-model="currentdata.manufacturer" placeholder="制造商" /> -->
+              {{ detailObj.manufacturer }}
+            </div>
+          </el-descriptions-item>
+
+        </el-descriptions>
+
+      </div>
+      <div slot="footer" class="dialog-footer" style="text-align: right">
+        <el-button @click="addshow = false">取 消</el-button>
+        <el-button type="primary" @click="dosave">保 存</el-button>
+      </div>
+
+    </el-dialog>
+
+    <el-dialog title="字段显示" v-model="ziduanshow" width="50%" @close="ziduanshow = false">
       <div style="display: flex;flex-wrap: wrap;align-content: center;justify-content: center;align-items: center;">
         <el-checkbox v-for="item in cloumdata" v-model="item.visible" :label="item.label" size="large" />
       </div>
@@ -165,24 +219,44 @@
 </template>
 
 <script setup lang="ts" name="Units">
-import {ref, watch} from "vue";
-import {listEquipment,addEquipment,delEquipment,updateEquipment} from "@/api/data/equipment"
+import { ref, watch } from "vue";
+import { listEquipment, addEquipment, delEquipment, updateEquipment } from "@/api/data/equipment"
 import moment from "moment/moment";
-import {ElMessage, ElMessageBox} from "element-plus";
+import { ElMessage, ElMessageBox } from "element-plus";
 
-const addshow  = ref(false);
+const route = useRoute();
+const router = useRouter();
+
+const detailObj = ref({
+  "name": "",
+  "sn": "",
+  "model": "",
+  "specs": "",
+  "type": "",
+  "equipmentTypeId": 93,
+  "manufacturer": "",
+  "producer": "",
+  "pictures": "",
+  "remark": "",
+  "gatewayId": null,
+  "protocalType": null
+})
+
+const addshow = ref(false);
+const detailDialog = ref(false)
 
 const ziduanshow = ref(false);
 const cloumdata = ref([
-  {label: '设备名称', prop:'name',visible:true},
-  {label: '型号', prop:'model',visible:true},
-  {label: '设备类型', prop:'type',visible:true},
-  {label: '生产厂商', prop:'manufacturer',visible:true},
-  {label: '制造商', prop:'producer',visible:true},
+  { label: '设备名称', prop: 'name', visible: true },
+  { label: '型号', prop: 'model', visible: true },
+  { label: '设备类型', prop: 'type', visible: true },
+  { label: '生产厂商', prop: 'manufacturer', visible: true },
+  { label: '制造商', prop: 'producer', visible: true },
 ]);
 
 
-const  currentdata = ref({ "name": "",
+const currentdata = ref({
+  "name": "",
   "sn": "",
   "model": "",
   "specs": "",
@@ -193,36 +267,59 @@ const  currentdata = ref({ "name": "",
   "pictures": "",
   "remark": "",
   "gatewayId": null,
-  "protocalType": null})
+  "protocalType": null
+})
 
 const searchform = ref({
   name: "",
 });
 
 const pagedata = ref({
-  total:0,
-  size:10,
-  current:1
+  total: 0,
+  size: 10,
+  current: 1
 });
 
+const detailrow = (item) => {
+  detailObj.value = item
+  detailDialog.value = true
+}
+
+const refresh = () => {
+  currentdata.value = {
+    "name": "",
+    "sn": "",
+    "model": "",
+    "specs": "",
+    "type": "",
+    "equipmentTypeId": 93,
+    "manufacturer": "",
+    "producer": "",
+    "pictures": "",
+    "remark": "",
+    "gatewayId": null,
+    "protocalType": null
+  }
+}
+
 
-const editrow = (item)=>{
+const editrow = (item) => {
   currentdata.value = item;
-  addshow.value=true;
+  addshow.value = true;
 }
 
-const deleterow =(item)=>{
-  delEquipment(item.id).then((res)=>{
+const deleterow = (item) => {
+  delEquipment(item.id).then((res) => {
     ElMessage.success("删除成功");
     getalldata();
   })
 }
 
-const  tableref = ref(null);
+const tableref = ref(null);
 
-const deleteall = ()=>{
-  let selected =  tableref.value.getSelectionRows();
-  if(selected.length==0) {
+const deleteall = () => {
+  let selected = tableref.value.getSelectionRows();
+  if (selected.length == 0) {
     ElMessage.warning("请选择要删除的行");
     return;
   }
@@ -248,32 +345,33 @@ const deleteall = ()=>{
 
 }
 
-const initdata = ()=>{
+const initdata = () => {
   searchform.value = {
-    name:""
+    name: ""
   }
   pagedata.value = {
-    total:0,
-    size:10,
-    current:1
+    total: 0,
+    size: 10,
+    current: 1
   }
 }
 
-const adddevice = ()=>{
-  addshow.value=true;
+const adddevice = () => {
+  refresh();
+  addshow.value = true;
   initdata();
 }
 
-const dosave = ()=>{
-  if(currentdata.value["id"]!=undefined){
+const dosave = () => {
+  if (currentdata.value["id"] != undefined) {
     updateEquipment(currentdata.value).then((res) => {
-        addshow.value=false;
-        ElMessage.success("修改成功!")
-        getalldata();
+      addshow.value = false;
+      ElMessage.success("修改成功!")
+      getalldata();
     });
-  }else{
+  } else {
     addEquipment(currentdata.value).then((res) => {
-      addshow.value=false;
+      addshow.value = false;
       ElMessage.success("添加成功!")
       getalldata();
     });
@@ -295,9 +393,9 @@ const devicetabledata = ref([]);
 
 
 
-const getalldata = ()=>{
-  listEquipment({...searchform.value,pageSize:pagedata.value.size,pageNum:pagedata.value.current}).then((res) => {
-    const {rows} = res;
+const getalldata = () => {
+  listEquipment({ ...searchform.value, pageSize: pagedata.value.size, pageNum: pagedata.value.current }).then((res) => {
+    const { rows } = res;
     devicetabledata.value = rows;
   });
 
@@ -314,6 +412,7 @@ getalldata();
   flex-direction: row;
   justify-content: space-between;
 }
+
 .content-w {
   display: inline-flex;
 

+ 27 - 24
ruoyi-ui-vue3/src/views/device/equipmentdash/add.vue

@@ -6,8 +6,8 @@
           <span v-show="objId == null">设备台账-新增</span>
           <span v-show="objId != null">设备台账-修改</span>
           <div>
-            <el-button type="warning" @click="">复位</el-button>
-            <el-button type="primary" @click="submit()">保存</el-button>
+            <el-button type="warning" @click="" v-if="isDisabled.value">复位</el-button>
+            <el-button type="primary" @click="submit()" v-if="isDisabled.value">保存</el-button>
             <el-button type="primary" plain @click="router.back();">返回</el-button>
           </div>
         </div>
@@ -24,7 +24,7 @@
 
               </template>
               <div class="content-w">
-                <el-input v-model="queryParams.sn" placeholder="请输入设备编码" />
+                <el-input :disabled="isDisabled"  v-model="queryParams.sn" placeholder="请输入设备编码" />
               </div>
             </el-descriptions-item>
             <el-descriptions-item>
@@ -34,7 +34,7 @@
                 </div>
               </template>
               <div class="content-w">
-                <el-input v-model="queryParams.name" placeholder="请输入设备名称" />
+                <el-input :disabled="isDisabled"  v-model="queryParams.name" placeholder="请输入设备名称" />
               </div>
             </el-descriptions-item>
             <el-descriptions-item>
@@ -44,7 +44,7 @@
                 </div>
               </template>
               <div class="content-w">
-                <el-tree-select v-model="queryParams.equipmentTreeId" :data="treeList"
+                <el-tree-select :disabled="isDisabled"  v-model="queryParams.equipmentTreeId" :data="treeList"
                   :props="{ value: 'id', label: 'name', children: 'children' }" value-key="id" placeholder="请选上层位置"
                   check-strictly />
               </div>
@@ -56,7 +56,7 @@
                 </div>
               </template>
               <div class="content-w">
-                <el-select v-model="queryParams.status" filterable placeholder="Select">
+                <el-select :disabled="isDisabled"  v-model="queryParams.status" filterable placeholder="Select">
                   <el-option v-for="item in statusList" :key="item.dictValue" :label="item.dictLabel"
                     :value="item.dictValue" />
                 </el-select>
@@ -82,7 +82,7 @@
                 </div>
               </template>
               <div class="content-w">
-                <el-select v-model="equipmentObj" value-key="id" filterable placeholder="Select"
+                <el-select :disabled="isDisabled"  v-model="equipmentObj" value-key="id" filterable placeholder="Select"
                   @change="selectEquipment">
                   <el-option v-for="item in equipmentList" :key="item.id" :label="item.name" :value="item" />
                 </el-select>
@@ -112,7 +112,7 @@
                   负责人
                 </div>
               </template>
-              <div class="content-w"> <el-input v-model="queryParams.personInCharge" placeholder="" /> </div>
+              <div class="content-w"> <el-input :disabled="isDisabled" v-model="queryParams.personInCharge" placeholder="" /> </div>
             </el-descriptions-item>
             <!-- <el-descriptions-item>
               <template #label>
@@ -131,7 +131,7 @@
                 </div>
               </template>
               <div class="content-w" style="min-width: 500px">
-                <el-select v-model="tagidArry" filterable placeholder="Select" multiple>
+                <el-select :disabled="isDisabled"   v-model="tagidArry" filterable placeholder="Select" multiple>
                   <el-option v-for="item in tagList" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
               </div>
@@ -162,7 +162,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.supplier" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.supplier" placeholder="" />
                   </div>
                 </el-descriptions-item>
                 <el-descriptions-item>
@@ -173,7 +173,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-date-picker value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.manufacturingDate" type="date"
+                    <el-date-picker :disabled="isDisabled"  value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.manufacturingDate" type="date"
                       placeholder="请选择" />
                   </div>
                 </el-descriptions-item>
@@ -186,7 +186,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.usefulLife" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.usefulLife" placeholder="" />
                   </div>
                 </el-descriptions-item>
 
@@ -198,7 +198,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-date-picker value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.endOfWarrantyPeriod"
+                    <el-date-picker :disabled="isDisabled"  value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.endOfWarrantyPeriod"
                       type="date" placeholder="请选择" />
                   </div>
                 </el-descriptions-item>
@@ -210,7 +210,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-date-picker value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.installationDate" type="date"
+                    <el-date-picker :disabled="isDisabled"  value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.installationDate" type="date"
                       placeholder="请选择" />
                   </div>
                 </el-descriptions-item>
@@ -222,7 +222,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.address" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.address" placeholder="" />
                   </div>
                 </el-descriptions-item>
                 <el-descriptions-item>
@@ -233,7 +233,7 @@
 
                   </template>
                   <div class="content-w">
-                    <el-date-picker value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.changeDate" type="date"
+                    <el-date-picker :disabled="isDisabled"  value-format="YYYY-MM-DD HH:mm:ss" v-model="queryParams.changeDate" type="date"
                       placeholder="请选择" />
                   </div>
                 </el-descriptions-item>
@@ -274,7 +274,7 @@
                     </div>
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.assetNo" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.assetNo" placeholder="" />
                   </div>
                 </el-descriptions-item>
                 <el-descriptions-item>
@@ -284,7 +284,7 @@
                     </div>
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.serialNumber" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.serialNumber" placeholder="" />
                   </div>
                 </el-descriptions-item>
                 <el-descriptions-item>
@@ -294,7 +294,7 @@
                     </div>
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.useCertificateNo" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.useCertificateNo" placeholder="" />
                   </div>
                 </el-descriptions-item>
                 <el-descriptions-item>
@@ -304,7 +304,7 @@
                     </div>
                   </template>
                   <div class="content-w">
-                    <el-input v-model="queryParams.securityLevel" placeholder="" />
+                    <el-input :disabled="isDisabled"  v-model="queryParams.securityLevel" placeholder="" />
                   </div>
                 </el-descriptions-item>
                 <!-- <el-descriptions-item>
@@ -339,10 +339,10 @@
 
     <el-card class="box-card" style="margin-top: 20px" v-if="objId != null">
       <template #header>
-        <div class="card-header">
+        <div class="card-header" >
           <span>Mqtt分发</span>
           <div>
-            <el-button type="primary" plain @click="getnoListByDeviceId">添加</el-button>
+            <el-button type="primary" plain @click="getnoListByDeviceId" v-if="isDisabled.value">添加</el-button>
           </div>
         </div>
       </template>
@@ -373,7 +373,7 @@
           </el-table-column>
           <el-table-column prop="name" label="操作" width="150">
             <template #default="scope">
-              <el-popconfirm title="确定解绑该设备?" @confirm="dellink(scope.row)">
+              <el-popconfirm title="确定解绑该设备?" @confirm="dellink(scope.row)" v-if="isDisabled.value">
                 <template #reference>
                   <el-button link><el-tooltip effect="dark" content="解绑设备"><el-icon>
                         <Delete />
@@ -430,6 +430,8 @@ const router = useRouter();
 
 const { proxy } = getCurrentInstance();
 
+const isDisabled = ref(true)
+
 const queryParams = ref({
   id: null,
   equipmentTreeId: "",
@@ -465,7 +467,8 @@ const mqttSelect = ref([])
 
 let objId = route.query.id
 console.log(objId);
-
+isDisabled.value = route.query.isEdit
+console.log(isDisabled.value)
 // queryParams.value = router.params;
 
 const equipmentObj = ref({

+ 80 - 69
ruoyi-ui-vue3/src/views/device/equipmentdash/index.vue

@@ -26,6 +26,13 @@
                     <el-icon @click="updateOrganizational(data)">
                       <Edit />
                     </el-icon>
+                    <el-popconfirm title="确定删除该标签?" @confirm="deleteOrganizational(data)">
+                      <template #reference>
+                        <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
+                              <Delete />
+                            </el-icon></el-tooltip></el-button>
+                      </template>
+                    </el-popconfirm>
                   </div>
                 </div>
               </template>
@@ -71,23 +78,22 @@
               <div>
                 <el-button type="primary" @click="goadd">添加</el-button>
                 <el-button type="danger">批量删除</el-button>
-                <el-button type="primary" plain @click="ziduanshow=true">显示字段</el-button>
+                <el-button type="primary" plain @click="ziduanshow = true">显示字段</el-button>
               </div>
             </div>
           </template>
 
           <el-row>
             <el-col :span="24" style="padding-left: 10px">
-              <el-table :data="devicetabledata" :border="true" >
+              <el-table :data="devicetabledata" :border="true">
                 <el-table-column type="selection" width="55" />
-                <el-table-column v-for="item in columns.filter(i => i.visible)" :prop="item.prop"
-                  :label="item.label">
-                   <template #default="scope" v-if="item.isTemplate">
-                      <span>
-                          {{ getData(item.func,scope.row,item.prop) }}
-                          <!-- {{ eval(item.prop)}} -->
-                      </span>
-                   </template>
+                <el-table-column v-for="item in columns.filter(i => i.visible)" :prop="item.prop" :label="item.label">
+                  <template #default="scope" v-if="item.isTemplate">
+                    <span>
+                      {{ getData(item.func, scope.row, item.prop) }}
+                      <!-- {{ eval(item.prop)}} -->
+                    </span>
+                  </template>
                 </el-table-column>
                 <!-- <el-table-column label="设备类型">
                   <template #default="scope">
@@ -97,13 +103,6 @@
                 <el-table-column label="操作">
                   <template #default="scope">
                     <div>
-<!--                      <el-button link>-->
-<!--                        <el-tooltip effect="dark" content="详情">-->
-<!--                          <el-icon>-->
-<!--                            <Memo />-->
-<!--                          </el-icon>-->
-<!--                        </el-tooltip>-->
-<!--                      </el-button>-->
                       <el-button link @click="goUpdate(scope.row)">
                         <el-tooltip effect="dark" content="修改">
                           <el-icon>
@@ -111,6 +110,13 @@
                           </el-icon>
                         </el-tooltip>
                       </el-button>
+                      <el-button link @click="goDetail(scope.row)">
+                        <el-tooltip effect="dark" content="详情">
+                          <el-icon>
+                            <Document />
+                          </el-icon>
+                        </el-tooltip>
+                      </el-button>
                       <el-popconfirm title="确定删除该标签?" @confirm="deleteDevice(scope.row)">
                         <template #reference>
                           <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
@@ -127,7 +133,8 @@
             </el-col>
             <el-col :span="24" style="margin-top: 10px;">
               <el-pagination style="float: right;" small background layout="prev, pager, next" :total="pagedata.total"
-                :page-size="pagedata.size" :current-page="pagedata.current" @current-change="onchangepage" class="mt-4" />
+                :page-size="pagedata.size" :current-page="pagedata.current" @current-change="onchangepage"
+                class="mt-4" />
             </el-col>
           </el-row>
         </el-card>
@@ -161,12 +168,7 @@
       </template>
     </el-dialog>
 
-    <el-dialog
-      title="字段显示"
-      v-model="ziduanshow"
-      width="50%"
-      @close="ziduanshow = false"
-    >
+    <el-dialog title="字段显示" v-model="ziduanshow" width="50%" @close="ziduanshow = false">
       <div style="display: flex;flex-wrap: wrap;align-content: center;justify-content: center;align-items: center;">
         <el-checkbox v-for="item in columns" v-model="item.visible" :label="item.label" size="large" />
       </div>
@@ -181,10 +183,10 @@ import { LayTree } from "@layui/layui-vue";
 import "@layui/layui-vue/lib/index.css";
 
 import { useRoute, useRouter } from "vue-router";
-import { listEquipmentOrganizational, addEquipmentOrganizational, updateEquipmentOrganizational } from "@/api/data/equipmentOrganizational"
+import { listEquipmentOrganizational, addEquipmentOrganizational, updateEquipmentOrganizational, delEquipmentOrganizational } from "@/api/data/equipmentOrganizational"
 import { listEquipmentSbook, updateEquipmentSbook } from "@/api/data/equipmentSbook"
 import { getDicts } from '@/api/system/dict/data'
-import {cloneDeep} from "lodash";
+import { cloneDeep } from "lodash";
 
 
 
@@ -193,10 +195,6 @@ const router = useRouter();
 
 const { proxy } = getCurrentInstance();
 
-const goadd = () => {
-  router.push("/device/equipmentdash/add")
-}
-
 const dialogFormVisible = ref(false)
 
 const ziduanshow = ref(false)
@@ -235,8 +233,16 @@ const goUpdate = (item) => {
   // router.push({path:"/device/equipmentdash/add",params:item})
 }
 
-const handleClick = (node) =>{
-     console.log(node);
+const goadd = () => {
+  router.push("/device/equipmentdash/add")
+}
+
+const goDetail = (item) => {
+  router.push({ path: '/device/equipmentdash/add', query: { id: item.id, isEdit: false } })
+}
+
+const handleClick = (node) => {
+  console.log(node);
 }
 
 const handleClickTitle = (node) => {
@@ -266,34 +272,34 @@ const searchform = ref({
 
 const columns = ref([
   // {label: '上层位置', prop: 'v', visible: true},
-  { label: '上层位置', prop: 'deptName', visible: true ,isTemplate:false},
-  { label: '设备编码', prop: 'sn', visible: true ,isTemplate:false},
-  { label: '备用编码', prop: 'spareSn', visible: true ,isTemplate:false},
-  { label: '设备名称', prop: 'name', visible: true ,isTemplate:false},
-  { label: '设备模板', prop: 'equipment.name', visible: true ,isTemplate:false},
+  { label: '上层位置', prop: 'deptName', visible: true, isTemplate: false },
+  { label: '设备编码', prop: 'sn', visible: true, isTemplate: false },
+  { label: '备用编码', prop: 'spareSn', visible: true, isTemplate: false },
+  { label: '设备名称', prop: 'name', visible: true, isTemplate: false },
+  { label: '设备模板', prop: 'equipment.name', visible: true, isTemplate: false },
   //{label: '所属公司', prop: 'parity', visible: true},
   // { label: '所属组织机构', prop: 'deptName', visible: true },
-  { label: '所属类型', prop: 'equipment.type', visible: true,},
-  { label: '负责人', prop: 'uuid', visible: false ,isTemplate:false},
-  { label: '安装日期', prop: 'installationDate', visible: false ,isTemplate:false},
-  { label: '安装地点地址', prop: 'address', visible: false ,isTemplate:false},
-  { label: '关联设备Id', prop: 'protocolDesc', visible: false ,isTemplate:false},
-  { label: '标签', prop: 'tagids', visible: false ,isTemplate:false},
-  { label: '状态', prop: 'status', visible: false ,isTemplate:false},
-  { label: '保修期结束日期', prop: 'endOfWarrantyPeriod', visible: false ,isTemplate:false},
-  { label: '制造日期', prop: 'manufacturingDate', visible: false ,isTemplate:false},
-  { label: '资产编码', prop: 'assetNo', visible: false ,isTemplate:false},
-  { label: '资产编号', prop: 'serialNumber', visible: false ,isTemplate:false},
-  { label: '使用证编号', prop: 'useCertificateNo', visible: false ,isTemplate:false},
-  { label: '安全级别', prop: 'securityLevel', visible: false ,isTemplate:false},
-  { label: '使用年限', prop: 'usefulLife', visible: false ,isTemplate:false},
-  { label: '变动日期', prop: 'changeDate', visible: false ,isTemplate:false},
-  { label: '供货厂家', prop: 'supplier', visible: false ,isTemplate:false},
-  { label: '创建人', prop: 'createBy', visible: false ,isTemplate:false},
-  { label: '创建时间', prop: 'createTime', visible: false ,isTemplate:false},
-  { label: '更新人', prop: 'updateBy', visible: false ,isTemplate:false},
-  { label: '更新时间', prop: 'updateTime', visible: false ,isTemplate:false},
-  { label: '备注', prop: 'remark', visible: false ,isTemplate:false},
+  { label: '所属类型', prop: 'equipment.type', visible: true, },
+  { label: '负责人', prop: 'uuid', visible: false, isTemplate: false },
+  { label: '安装日期', prop: 'installationDate', visible: false, isTemplate: false },
+  { label: '安装地点地址', prop: 'address', visible: false, isTemplate: false },
+  { label: '关联设备Id', prop: 'protocolDesc', visible: false, isTemplate: false },
+  { label: '标签', prop: 'tagids', visible: false, isTemplate: false },
+  { label: '状态', prop: 'status', visible: false, isTemplate: false },
+  { label: '保修期结束日期', prop: 'endOfWarrantyPeriod', visible: false, isTemplate: false },
+  { label: '制造日期', prop: 'manufacturingDate', visible: false, isTemplate: false },
+  { label: '资产编码', prop: 'assetNo', visible: false, isTemplate: false },
+  { label: '资产编号', prop: 'serialNumber', visible: false, isTemplate: false },
+  { label: '使用证编号', prop: 'useCertificateNo', visible: false, isTemplate: false },
+  { label: '安全级别', prop: 'securityLevel', visible: false, isTemplate: false },
+  { label: '使用年限', prop: 'usefulLife', visible: false, isTemplate: false },
+  { label: '变动日期', prop: 'changeDate', visible: false, isTemplate: false },
+  { label: '供货厂家', prop: 'supplier', visible: false, isTemplate: false },
+  { label: '创建人', prop: 'createBy', visible: false, isTemplate: false },
+  { label: '创建时间', prop: 'createTime', visible: false, isTemplate: false },
+  { label: '更新人', prop: 'updateBy', visible: false, isTemplate: false },
+  { label: '更新时间', prop: 'updateTime', visible: false, isTemplate: false },
+  { label: '备注', prop: 'remark', visible: false, isTemplate: false },
 ])
 
 const onchangepage = (page) => {
@@ -309,13 +315,13 @@ const getTreedata = () => {
   })
 }
 
-const getData = (str,data,prop) =>{
-     console.log(data);
-    //  let value = eval("data."+prop);
-    //  console.log(value)
-      let value = eval(str+"(data)")
-      console.log(value);
-      return value
+const getData = (str, data, prop) => {
+  console.log(data);
+  //  let value = eval("data."+prop);
+  //  console.log(value)
+  let value = eval(str + "(data)")
+  console.log(value);
+  return value
 }
 // function getlistEquipmentSbook(){
 //   listEquipmentSbook({ ...searchform.value, pageSize: pagedata.value.size, pageNum: pagedata.value.current }).then(res => {
@@ -365,6 +371,11 @@ const updateOrganizational = (data) => {
   dialogFormVisible.value = true
 }
 
+const deleteOrganizational = (data) => {
+  delEquipmentOrganizational(data.id).then(res => {
+    getTreedata();
+  })
+}
 
 const getTypeName = (scope) => {
   console.log(scope)
@@ -391,8 +402,8 @@ const saveOrgainzational = () => {
 
   if (organizationalQuery.value.id != null) {
     let datac = cloneDeep(organizationalQuery.value);
-    delete  datac.parentNode;
-    delete  datac.children;
+    delete datac.parentNode;
+    delete datac.children;
     updateEquipmentOrganizational(datac).then(res => {
       console.log(res);
       if (res.code == 200) {
@@ -402,8 +413,8 @@ const saveOrgainzational = () => {
     })
   } else {
     let datac = cloneDeep(organizationalQuery.value);
-    delete  datac.parentNode;
-    delete  datac.children;
+    delete datac.parentNode;
+    delete datac.children;
     addEquipmentOrganizational(datac).then(res => {
       if (res.code == 200) {
         getTreedata();

+ 166 - 166
ruoyi-ui-vue3/src/views/device/sensordash/index.vue

@@ -7,25 +7,21 @@
             <div class="card-header">
               <span>设备区域</span>
               <div style="display: none">
-                <el-button type="primary" >
+                <el-button type="primary">
                   添加
                 </el-button>
               </div>
             </div>
           </template>
           <div class="tree">
-            <LayTree
-              :data="data"
-              :tail-node-icon="false"
-              :onlyIconControl="true"
-              v-model:selectedKey="selectedKey"
-              @node-click="handleClick"
-            >
+            <LayTree :data="data" :tail-node-icon="false" :onlyIconControl="true" v-model:selectedKey="selectedKey"
+              @node-click="handleClick">
               <template #title="{ data }">
-                <div style="display: flex;align-items: center;"><el-icon v-if="(data.id+'').indexOf('device')!=-1" ><Cpu /></el-icon> {{ data.name }}</div>
+                <div style="display: flex;align-items: center;"><el-icon v-if="(data.id + '').indexOf('device') != -1">
+                    <Cpu />
+                  </el-icon> {{ data.name }}</div>
               </template>
             </LayTree>
-
           </div>
         </el-card>
       </el-col>
@@ -34,33 +30,23 @@
         <el-card class="box-card">
           <div style="display: flex; flex-direction: row; justify-content: space-between">
             <div style="display: flex; flex-direction: row;">
-              <div
-                style="
+              <div style="
                   display: flex;
                   flex-direction: row;
                   flex-wrap: nowrap;
                   align-items: center;
-                "
-              >
+                ">
                 <div style="font-size: 12px; width: 100px;">传感器编号:</div>
-                <el-input
-                  v-model="searchform.sn"
-                  placeholder="请输入"
-                ></el-input>
+                <el-input v-model="searchform.sn" placeholder="请输入"></el-input>
               </div>
-              <div
-                style="
+              <div style="
                   display: flex;
                   flex-direction: row;
                   flex-wrap: nowrap;
                   align-items: center;
-                "
-              >
+                ">
                 <div style="font-size: 12px; width: 80px;margin-right: 10px;text-align: right;">描述:</div>
-                <el-input
-                  v-model="searchform.desc"
-                  placeholder="请输入"
-                ></el-input>
+                <el-input v-model="searchform.desc" placeholder="请输入"></el-input>
               </div>
             </div>
             <div>
@@ -75,24 +61,35 @@
             <div class="card-header">
               <span>传感器台账</span>
               <div>
+                <el-button type="primary" @click="inportSensor">导入</el-button>
                 <el-button type="primary" @click="goadd">添加</el-button>
                 <el-button type="danger" @click="deleteall">批量删除</el-button>
-                <el-button type="primary" plain  @click="ziduanshow=true">显示字段</el-button>
+                <el-button type="primary" plain @click="ziduanshow = true">显示字段</el-button>
               </div>
-            </div></template>
+            </div>
+          </template>
 
           <el-row>
             <el-col :span="24" style="padding-left: 10px">
               <el-table :data="devicetabledata" ref="tableref" :border="true">
                 <el-table-column type="selection" width="55" />
-                <el-table-column v-for="item in cloumdata.filter(i=>i.visible)" :prop="item.prop" :label="item.label" ></el-table-column>
-
+                <el-table-column v-for="item in cloumdata.filter(i => i.visible)" :prop="item.prop"
+                  :label="item.label"></el-table-column>
+                <el-table-column label="协议">
+                  <template #default="scope">
+                    <div>
+                      {{ getProtocalTypeName(scope.row) }}
+                    </div>
+                  </template>
+                </el-table-column>
                 <el-table-column label="操作">
                   <template #default="scope">
                     <div>
-                      <el-button link @click="lookdata(scope.row)" >
-                        <el-tooltip effect="dark" content="查看数据" >
-                          <el-icon><PieChart /></el-icon>
+                      <el-button link @click="lookdata(scope.row)">
+                        <el-tooltip effect="dark" content="查看数据">
+                          <el-icon>
+                            <PieChart />
+                          </el-icon>
                         </el-tooltip>
                       </el-button>
 
@@ -103,17 +100,18 @@
                           </el-icon>
                         </el-tooltip>
                       </el-button>
-                      <el-button link @click="cdbd(scope.row)" >
-                        <el-tooltip effect="dark" content="测点绑定" >
-                          <el-icon><VideoPlay /></el-icon>
+                      <el-button link @click="cdbd(scope.row)">
+                        <el-tooltip effect="dark" content="测点绑定">
+                          <el-icon>
+                            <VideoPlay />
+                          </el-icon>
                         </el-tooltip>
                       </el-button>
                       <el-popconfirm title="确定删除该传感器?" @confirm="deleterow(scope.row)">
                         <template #reference>
-                          <el-button link
-                          ><el-tooltip effect="dark" content="删除"
-                          ><el-icon><Delete /></el-icon></el-tooltip
-                          ></el-button>
+                          <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
+                                <Delete />
+                              </el-icon></el-tooltip></el-button>
                         </template>
                       </el-popconfirm>
                     </div>
@@ -124,16 +122,9 @@
 
             </el-col>
             <el-col :span="24" style="margin-top: 10px;">
-              <el-pagination style="float: right;"
-                             small
-                             background
-                             layout="prev, pager, next"
-                             :total="pagedata.total"
-                             :page-size="pagedata.pageSize"
-                             :current-page="pagedata.pageNum"
-                             @current-change="onchangepage"
-                             class="mt-4"
-              />
+              <el-pagination style="float: right;" small background layout="prev, pager, next" :total="pagedata.total"
+                :page-size="pagedata.pageSize" :current-page="pagedata.pageNum" @current-change="onchangepage"
+                class="mt-4" />
             </el-col>
           </el-row>
         </el-card>
@@ -141,10 +132,7 @@
     </el-row>
 
 
-    <el-dialog
-      title="测点配置"
-      v-model="cdbdshow"
-    >
+    <el-dialog title="测点配置" v-model="cdbdshow">
 
       <div style="display: flex; flex-direction: row; justify-content: space-between">
         <div style="display: flex; flex-direction: row;">
@@ -165,7 +153,7 @@
         </el-table-column>
         <el-table-column label="名称" prop="label">
           <template #default="scope">
-           <el-input v-model="scope.row.label"></el-input>
+            <el-input v-model="scope.row.label"></el-input>
           </template>
         </el-table-column>
         <el-table-column label="单位" prop="unitId">
@@ -174,7 +162,8 @@
               <template #reference>
                 <el-button plain>{{ `${scope.row.unit}(${scope.row.unitType})` }}</el-button>
               </template>
-              <el-table :data="allUnit" @cellClick="(row1)=>{scope.row.unit=row1.unitName;scope.row.unitType=row1.unitSymbol;}">
+              <el-table :data="allUnit"
+                @cellClick="(row1) => { scope.row.unit = row1.unitName; scope.row.unitType = row1.unitSymbol; }">
                 <el-table-column property="unitName" label="单位名称" />
                 <el-table-column property="unitSymbol" label="单位符号" />
                 <el-table-column property="unitType" label="分类" />
@@ -190,13 +179,14 @@
         </el-table-column>
         <el-table-column label="点表配置" prop="dataPointId">
           <template #default="scope">
-            <span v-if="currentsensor.protocalType==3">无需配置</span>
-            <div  v-if="currentsensor.protocalType!=3">
+            <span v-if="currentsensor.protocalType == 3">无需配置</span>
+            <div v-if="currentsensor.protocalType != 3">
               <el-popover placement="right" :width="400" trigger="click">
                 <template #reference>
-                  <el-button  plain>{{ `${ (currentdatapointlist.find(i=>(i.id+"")==scope.row.dataPointId) ?? {name:'失效'}).name}` }}</el-button>
+                  <el-button plain>{{ `${(currentdatapointlist.find(i => (i.id + "") == scope.row.dataPointId) ??
+        { name: '失效' }).name}` }}</el-button>
                 </template>
-                <el-table :data="currentdatapointlist" @cellClick="(row1)=>{scope.row.dataPointId=row1.id;}">
+                <el-table :data="currentdatapointlist" @cellClick="(row1) => { scope.row.dataPointId = row1.id; }">
                   <el-table-column property="name" label="点位名称" />
                   <el-table-column property="valueType" label="变量类型" />
                   <el-table-column property="addr" label="地址" />
@@ -211,10 +201,9 @@
           <template #default="scope">
             <el-popconfirm title="确定删除该测点?" @confirm="deldatapoint(scope.$index)">
               <template #reference>
-                <el-button link
-                ><el-tooltip effect="dark" content="删除"
-                ><el-icon><Delete /></el-icon></el-tooltip
-                ></el-button>
+                <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
+                      <Delete />
+                    </el-icon></el-tooltip></el-button>
               </template>
             </el-popconfirm>
           </template>
@@ -224,65 +213,62 @@
 
       <template #footer>
         <div class="dialog-footer">
-          <el-button @click="cdbdshow=false;"> 取消 </el-button>
+          <el-button @click="cdbdshow = false;"> 取消 </el-button>
           <el-button type="primary" @click="dosave"> 保存 </el-button>
         </div>
       </template>
     </el-dialog>
 
-    <el-dialog
-      title="字段显示"
-      v-model="ziduanshow"
-      width="50%"
-      @close="ziduanshow = false"
-    >
+    <el-dialog title="字段显示" v-model="ziduanshow" width="50%" @close="ziduanshow = false">
       <div style="display: flex;flex-wrap: wrap;align-content: center;justify-content: center;align-items: center;">
         <el-checkbox v-for="item in cloumdata" v-model="item.visible" :label="item.label" size="large" />
       </div>
 
     </el-dialog>
 
-    <el-dialog
-      title="测点数据查看"
-      v-model="datashow"
-      width="50%"
-      @close="datashow = false"
-    >
+    <el-dialog title="测点数据查看" v-model="datashow" width="50%" @close="datashow = false">
       <div>
-<!--        显示测点实时数据-->
-        <el-table @cellClick="doshowhistory" :data="JSON.parse(currentsensor.datapoints)" style="margin-top: 15px" height="250px">
+        <!--        显示测点实时数据-->
+        <el-table @cellClick="doshowhistory" :data="JSON.parse(currentsensor.datapoints)" style="margin-top: 15px"
+          height="250px">
           <el-table-column label="变量名" prop="name">
             <template #default="scope">
-              <span>{{scope.row.name}}</span>
+              <span>{{ scope.row.name }}</span>
             </template>
           </el-table-column>
           <el-table-column label="名称" prop="name">
             <template #default="scope">
-              <span>{{scope.row.label}}</span>
+              <span>{{ scope.row.label }}</span>
             </template>
           </el-table-column>
           <el-table-column label="数值" prop="name">
             <template #default="scope">
-              <span>{{ (useWSStore().getMessage()[currentsensor.id])?(useWSStore().getMessage()[currentsensor.id][scope.row.name]?.value):'-' }}</span>
+              <span>{{
+        (useWSStore().getMessage()[currentsensor.id]) ?
+          (useWSStore().getMessage()[currentsensor.id][scope.row.name]?.value) : '-'
+      }}</span>
             </template>
           </el-table-column>
           <el-table-column label="单位" prop="name">
             <template #default="scope">
-              <span>{{scope.row.unitType}}</span>
+              <span>{{ scope.row.unitType }}</span>
             </template>
           </el-table-column>
           <el-table-column label="时间" prop="name">
             <template #default="scope">
-              <span>{{ (useWSStore().getMessage()[currentsensor.id])?(useWSStore().getMessage()[currentsensor.id][scope.row.name]?.time):'-' }}</span>
+              <span>{{
+        (useWSStore().getMessage()[currentsensor.id]) ?
+          (useWSStore().getMessage()[currentsensor.id][scope.row.name]?.time) : '-'
+      }}</span>
             </template>
           </el-table-column>
         </el-table>
 
       </div>
       <div>
-        <div style="margin-top: 10px" v-if="currentname!=''">变量 {{currentname}} 数值曲线</div>
-<!--        显示历史数据 折线图-->
-        <div ref="chartlinediv" style="height: 250px" v-loading="isloading" ></div>
+        <div style="margin-top: 10px" v-if="currentname != ''">变量 {{currentname}} 数值曲线</div>
+        <!--        显示历史数据 折线图-->
+        <div ref="chartlinediv" style="height: 250px" v-loading="isloading"></div>
 
 
       </div>
@@ -291,38 +277,38 @@
 </template>
 
 <script setup>
-import {onMounted, ref, watch, watchEffect} from "vue";
-import {LayTree} from "@layui/layui-vue";
+import { onMounted, ref, watch, watchEffect } from "vue";
+import { LayTree } from "@layui/layui-vue";
 import "@layui/layui-vue/lib/index.css";
-import {useRoute, useRouter} from "vue-router";
-import {listEquipmentOrganizational} from "@/api/data/equipmentOrganizational"
-import {listEquipmentSbook} from "@/api/data/equipmentSbook"
-import {listSensor,delSensor,addSensor,updateSensor,listSensorData,listSensorRecordData} from "@/api/data/sensor"
-import {listDatapoint} from "@/api/data/datapoint";
-import {listUnit} from "@/api/data/unit";
+import { useRoute, useRouter } from "vue-router";
+import { listEquipmentOrganizational } from "@/api/data/equipmentOrganizational"
+import { listEquipmentSbook } from "@/api/data/equipmentSbook"
+import { listSensor, delSensor, addSensor, updateSensor, listSensorData, listSensorRecordData } from "@/api/data/sensor"
+import { listDatapoint } from "@/api/data/datapoint";
+import { listUnit } from "@/api/data/unit";
 import useWSStore from "@/store/modules/websocket"
 import * as echarts from 'echarts';
 
 
-import {ElMessage, ElMessageBox} from "element-plus";
+import { ElMessage, ElMessageBox } from "element-plus";
 import moment from "moment";
 
-const {proxy} = getCurrentInstance();
-const {protocal_type, sensor_type, sensor_status} = proxy.useDict("protocal_type", "sensor_type", "sensor_status");
+const { proxy } = getCurrentInstance();
+const { protocal_type, sensor_type, sensor_status } = proxy.useDict("protocal_type", "sensor_type", "sensor_status");
 const pointdata = ref([]);
 
 const route = useRoute();
 const router = useRouter();
 const ziduanshow = ref(false);
 
-const tableref  = ref(null);
+const tableref = ref(null);
 
 const cloumdata = ref([
-  {label: '传感器编号', prop: 'sn', visible: true},
-  {label: '传感器名称', prop: 'name', visible: true},
-  {label: '描述', prop: 'sensorDesc', visible: true},
-  {label: '状态', prop: 'statusname', visible: true},
-  {label: '类型', prop: 'sensorType', visible: true},
+  { label: '传感器编号', prop: 'sn', visible: true },
+  { label: '传感器名称', prop: 'name', visible: true },
+  { label: '描述', prop: 'sensorDesc', visible: true },
+  { label: '状态', prop: 'statusname', visible: true },
+  { label: '类型', prop: 'sensorType', visible: true },
 ])
 
 
@@ -331,23 +317,23 @@ const onchangepage = (page) => {
   getalldata();
 }
 const pagedata = ref({
-  total:0,
-  pageSize:10,
-  pageNum:1
+  total: 0,
+  pageSize: 10,
+  pageNum: 1
 });
 
 const allUnit = ref([])
 
-const deleterow =(item)=>{
-  delSensor(item.id).then((res)=>{
+const deleterow = (item) => {
+  delSensor(item.id).then((res) => {
     ElMessage.success("删除成功");
     getalldata();
   })
 }
 
-const deleteall = ()=>{
-  let selected =  tableref.value.getSelectionRows();
-  if(selected.length==0) {
+const deleteall = () => {
+  let selected = tableref.value.getSelectionRows();
+  if (selected.length == 0) {
     ElMessage.warning("请选择要删除的行");
     return;
   }
@@ -374,13 +360,13 @@ const deleteall = ()=>{
 }
 
 
-const initdata = ()=>{
+const initdata = () => {
   searchform.value.sn = '';
   searchform.value.desc = '';
   pagedata.value = {
-    total:0,
-    pageSize:10,
-    pageNum:1
+    total: 0,
+    pageSize: 10,
+    pageNum: 1
   }
 }
 
@@ -388,11 +374,19 @@ const goadd = () => {
   router.push("/device/sensordash/add?type=0")
 }
 
-const goedit = (item)=>{
-  localStorage.setItem("currentsensor",JSON.stringify(item))
+const goedit = (item) => {
+  localStorage.setItem("currentsensor", JSON.stringify(item))
   router.push("/device/sensordash/add?type=1")
 }
 
+const getProtocalTypeName = (item) => {
+  for (var index in protocal_type.value) {
+    if (protocal_type.value[index].value == item.protocalType) {
+      return protocal_type.value[index].label
+    }
+  }
+}
+
 
 
 const currentnode = ref(null);
@@ -413,22 +407,23 @@ const getalldata = () => {
   let deviceids = getdeviceid(currentnode.value).split(",").filter(i => i != "").join(",");
   if (deviceids != "") {
     deviceids = deviceids.replaceAll("device_", "")
-    listSensor({...pagedata.value, params: {deviceids: deviceids,...searchform.value}}).then(res => {
-      const {rows,total,page,size} = res;
-      pagedata.value = {total:total,pageNum:page, pageSize:10};
+    listSensor({ ...pagedata.value, params: { deviceids: deviceids, ...searchform.value } }).then(res => {
+      const { rows, total, page, size } = res;
+      pagedata.value = { total: total, pageNum: page, pageSize: 10 };
+      console.log(rows);
       devicetabledata.value = rows.map(item => {
-        try{
+        try {
           var statusname = sensor_status.value.find(i => i.value == item.status).label;
           item["statusname"] = statusname;
-        }catch (e) {
+        } catch (e) {
 
         }
         return item;
       });
     })
-  }else{
-    pagedata.value = {total:0,pageNum:1, pageSize:10};
-    devicetabledata.value=[];
+  } else {
+    pagedata.value = { total: 0, pageNum: 1, pageSize: 10 };
+    devicetabledata.value = [];
   }
 }
 
@@ -442,10 +437,10 @@ const data = ref([]);
 
 
 const getTreedata = () => {
-  listEquipmentOrganizational({pageSize: 10000}).then(res => {
-    const {rows, total, page, size} = res;
+  listEquipmentOrganizational({ pageSize: 10000 }).then(res => {
+    const { rows, total, page, size } = res;
     //获取设备数据
-    listEquipmentSbook({page: 1, pageSize: 100000}).then(res1 => {
+    listEquipmentSbook({ page: 1, pageSize: 100000 }).then(res1 => {
       res1.rows.forEach(item => {
         item["parentId"] = item.equipmentTreeId;
         item["id"] = "device_" + item.id;
@@ -469,29 +464,29 @@ const cdbdshow = ref(false);
 const currentsensor = ref(null);
 const cdbd = (item) => {
   cdbdshow.value = true;
-  listDatapoint({sensorId:item.id}).then(res=>{
-    const {rows,total,page,size} = res;
+  listDatapoint({ sensorId: item.id }).then(res => {
+    const { rows, total, page, size } = res;
     currentdatapointlist.value = rows;
     currentsensor.value = item;
-    try{
+    try {
       pointdata.value = JSON.parse(item.datapoints);
-    }catch (e){}
+    } catch (e) { }
 
   })
 
 }
 const realtimedata = ref({})
 const datashow = ref(false);
-const lookdata = (item)=>{
+const lookdata = (item) => {
   //弹窗
   datashow.value = true;
   currentsensor.value = item;
-  listSensorData({page:1,pageSize:10000,id:item.id}).then(res=>{
-    const {rows,total,page,size} = res;
-    if(rows.length>0){
-      if(rows[0].recordData){
+  listSensorData({ page: 1, pageSize: 10000, id: item.id }).then(res => {
+    const { rows, total, page, size } = res;
+    if (rows.length > 0) {
+      if (rows[0].recordData) {
         let data = JSON.parse(rows[0].recordData);
-        useWSStore().setMessagetype1(rows[0].tblSensor.id,data);
+        useWSStore().setMessagetype1(rows[0].tblSensor.id, data);
       }
     }
 
@@ -501,31 +496,31 @@ const lookdata = (item)=>{
 }
 
 
-const deldatapoint = (index)=>{
-  pointdata.value.splice(index,1)
+const deldatapoint = (index) => {
+  pointdata.value.splice(index, 1)
 }
 
-const addrow = ()=>{
-  if(!pointdata.value){pointdata.value = [];}
+const addrow = () => {
+  if (!pointdata.value) { pointdata.value = []; }
   pointdata.value.push({
     name: "",
     unit: "",
     unitType: "0",
     desc: "",
     label: "",
-    dataPointId:null
+    dataPointId: null
   })
 }
-onMounted(()=>{
-  listUnit({}).then(res=>{
+onMounted(() => {
+  listUnit({}).then(res => {
     allUnit.value = res.data;
   })
 })
 
-const dosave = ()=>{
-  let data = JSON.stringify(pointdata.value.filter(i=>i.name!==""));
+const dosave = () => {
+  let data = JSON.stringify(pointdata.value.filter(i => i.name !== ""));
   currentsensor.value.datapoints = data;
-  updateSensor(currentsensor.value).then(res=>{
+  updateSensor(currentsensor.value).then(res => {
     ElMessage.success("保存成功");
     cdbdshow.value = false;
     getalldata();
@@ -536,23 +531,23 @@ const historytabledata = ref([]);
 const chartlinediv = ref(null)
 const currentname = ref("")
 const isloading = ref(false);
-watchEffect(()=>{
-  if(currentsensor.value && useWSStore().getMessage()[currentsensor.value.id]  && useWSStore().getMessage()[currentsensor.value.id][currentname.value] ){
+watchEffect(() => {
+  if (currentsensor.value && useWSStore().getMessage()[currentsensor.value.id] && useWSStore().getMessage()[currentsensor.value.id][currentname.value]) {
     let data = useWSStore().getMessage()[currentsensor.value.id][currentname.value];
     var isadd = false;
-    historytabledata.value.forEach(i=>{
-      if(moment(data.time).utc()-moment(i[0]).utc()>10){
+    historytabledata.value.forEach(i => {
+      if (moment(data.time).utc() - moment(i[0]).utc() > 10) {
         isadd = true;
       }
     })
-    if(isadd){
-      historytabledata.value.push([moment(data.time).toDate(),data.value]);
+    if (isadd) {
+      historytabledata.value.push([moment(data.time).toDate(), data.value]);
     }
 
   }
-  if(historytabledata.value.length>0){
+  if (historytabledata.value.length > 0) {
     const usedmemoryInstance = echarts.init(chartlinediv.value, "macarons");
-    usedmemoryInstance.setOption( {
+    usedmemoryInstance.setOption({
       tooltip: {
         trigger: 'axis',
         position: function (pt) {
@@ -579,18 +574,18 @@ watchEffect(()=>{
       ],
       series: [
         {
-          name:currentname.value,
+          name: currentname.value,
           data: historytabledata.value,
           type: 'line',
           smooth: true
         }
       ]
     });
-    window.addEventListener("resize",()=>{
+    window.addEventListener("resize", () => {
       usedmemoryInstance.resize()
     });
-  }else{
-    if(chartlinediv.value){
+  } else {
+    if (chartlinediv.value) {
       chartlinediv.value.innerHTML = "请选择监测点";
     }
 
@@ -598,19 +593,23 @@ watchEffect(()=>{
 
 
 })
-const doshowhistory = (row)=>{
+const doshowhistory = (row) => {
   isloading.value = true;
   currentname.value = row.name;
   //获取历史数据
-  listSensorRecordData({sensorId:currentsensor.value.id,pointName:row.name,pageNum:1,pageSize:100,orderByColumn:"createTime",isAsc:"desc",params:{name:row.name}}).then(res=>{
-    const {rows,total,page,size} = res;
+  listSensorRecordData({ sensorId: currentsensor.value.id, pointName: row.name, pageNum: 1, pageSize: 100, orderByColumn: "createTime", isAsc: "desc", params: { name: row.name } }).then(res => {
+    const { rows, total, page, size } = res;
     isloading.value = false;
-    historytabledata.value = rows.map(i=>{
-      return [moment(i.createTime).toDate(),i.pointValue]
+    historytabledata.value = rows.map(i => {
+      return [moment(i.createTime).toDate(), i.pointValue]
     });
   })
 }
 
+const inportSensor = () =>{
+  
+}
+
 
 </script>
 
@@ -629,6 +628,7 @@ const doshowhistory = (row)=>{
 
 
 .tree {
+
   *,
   *:before,
   *:after {

+ 2 - 2
ruoyi-ui-vue3/src/views/rules/add.vue

@@ -3,8 +3,8 @@
     <el-card class="box-card">
       <template #header>
         <div class="card-header">
-          <span v-show="objId == null">规则定义-新增</span>
-          <span v-show="objId != null">规则定义-修改</span>
+          <span v-show="objId == null">规则定义(告警模板)-新增</span>
+          <span v-show="objId != null">规则定义(告警模板)-修改</span>
           <div>
             <el-button type="warning" @click="">复位</el-button>
             <el-button type="primary" @click="saveSensor()">保存</el-button>

+ 1 - 1
ruoyi-ui-vue3/src/views/rules/index.vue

@@ -23,7 +23,7 @@
     <el-card class="box-card" style="margin-top: 10px">
       <template #header>
         <div class="card-header">
-          <span>规则定义</span>
+          <span>规则定义-告警模板</span>
           <div>
             <el-button type="primary" @click="goadd">添加</el-button>
             <el-button type="danger">批量删除</el-button>

+ 58 - 45
ruoyi-ui-vue3/src/views/system/devicecode/index.vue

@@ -1,17 +1,31 @@
 <template>
   <div style="padding: 10px 15px">
     <el-card class="box-card">
+      <div style="display: flex; flex-direction: row; justify-content: space-between">
+        <div>
+          <div style="
+              display: flex;
+              flex-direction: row;
+              flex-wrap: nowrap;
+              align-items: center;
+            ">
+            <div style="font-size: 12px; width: 80px">编码名称:</div>
+            <el-input v-model="searchform.name" placeholder="编码名称"></el-input>
+          </div>
+        </div>
+        <div>
+          <el-button type="primary" @click="getalldata">搜索</el-button>
+        </div>
+      </div>
+    </el-card>
+
+    <el-card class="box-card">
       <template #header>
         <div class="card-header">
           <span>设备编码管理</span>
-
-          <el-button
-            type="primary"
-            @click="
-              doedit(null,1)
-            "
-            >添加</el-button
-          >
+          <el-button type="primary" @click="
+              doedit(null, 1)
+              ">添加</el-button>
         </div>
       </template>
       <el-row>
@@ -26,12 +40,9 @@
             <el-table-column label="操作">
               <template #default="scope">
                 <div>
-                  <el-button
-                    link
-                    @click="
-                      doedit(scope.row,2)
-                    "
-                  >
+                  <el-button link @click="
+              doedit(scope.row, 2)
+              ">
                     <el-tooltip effect="dark" content="编辑">
                       <el-icon>
                         <Edit />
@@ -40,10 +51,9 @@
                   </el-button>
                   <el-popconfirm title="确定删除该编码?" @confirm="deleterow(scope.row)">
                     <template #reference>
-                      <el-button link
-                        ><el-tooltip effect="dark" content="删除"
-                          ><el-icon><Delete /></el-icon></el-tooltip
-                      ></el-button>
+                      <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
+                            <Delete />
+                          </el-icon></el-tooltip></el-button>
                     </template>
                   </el-popconfirm>
                 </div>
@@ -54,41 +64,38 @@
       </el-row>
     </el-card>
 
-    <el-dialog
-      :title="`${edittype == 1 ? '新增' : edittype == 2 ? '编辑' : '查看'}设备编码`"
-      v-model="detailshow"
-    >
-      <el-form  :model="dwform" label-width="120px">
+    <el-dialog :title="`${edittype == 1 ? '新增' : edittype == 2 ? '编辑' : '查看'}设备编码`" v-model="detailshow">
+      <el-form :model="dwform" label-width="120px">
         <el-form-item label="名称">
-          <el-input v-model="dwform.name"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.name" :disabled="edittype == 3" />
         </el-form-item>
         <el-form-item label="设备">
-          <el-input v-model="dwform.equipmentInfoId"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.equipmentInfoId" :disabled="edittype == 3" />
         </el-form-item>
-         <el-form-item label="编码前缀">
-          <el-input v-model="dwform.prefix"  :disabled="edittype==3"/>
+        <el-form-item label="编码前缀">
+          <el-input v-model="dwform.prefix" :disabled="edittype == 3" />
         </el-form-item>
-         <el-form-item label="编码序号规则">
-          <el-input v-model="dwform.serialNumRule"  :disabled="edittype==3"/>
+        <el-form-item label="编码序号规则">
+          <el-input v-model="dwform.serialNumRule" :disabled="edittype == 3" />
         </el-form-item>
         <el-form-item label="备注">
-          <el-input type="textarea" v-model="dwform.remark" :disabled="edittype==3"/>
+          <el-input type="textarea" v-model="dwform.remark" :disabled="edittype == 3" />
         </el-form-item>
       </el-form>
       <template #footer>
-      <div class="dialog-footer">
-         <el-button @click="detailshow=false;"> 取消 </el-button>
+        <div class="dialog-footer">
+          <el-button @click="detailshow = false;"> 取消 </el-button>
           <el-button type="primary" @click="dosavedw"> 保存 </el-button>
-      </div>
-    </template>
+        </div>
+      </template>
     </el-dialog>
   </div>
 </template>
 
 <script setup lang="ts" name="Units">
 import { ref } from "vue";
-import { listEquipmentCode,addEquipmentCode,delEquipmentCode,updateEquipmentCode } from '@/api/data/equipmentcode.js'
-import {ElMessage} from "element-plus";
+import { listEquipmentCode, addEquipmentCode, delEquipmentCode, updateEquipmentCode } from '@/api/data/equipmentcode.js'
+import { ElMessage } from "element-plus";
 
 const dwtabledata = ref([]);
 
@@ -97,7 +104,13 @@ const detailshow = ref(false);
 
 const dwform = ref({});
 
-const initdata = ()=>{
+const searchform = ref(
+  {
+    name: null
+  }
+)
+
+const initdata = () => {
   dwform.value = {
     "name": "",
     "equipmentInfoId": "",
@@ -107,17 +120,17 @@ const initdata = ()=>{
   }
 }
 initdata();
-const getalldata = ()=>{
-  listEquipmentCode({}).then((res) => {
+const getalldata = () => {
+  listEquipmentCode(searchform.value).then((res) => {
     dwtabledata.value = res.data;
   });
 }
 getalldata();
 
-const doedit = (item,type) => {
+const doedit = (item, type) => {
   edittype.value = 2;
   dwform.value = item;
-  if(type==1){
+  if (type == 1) {
     initdata();
   }
   detailshow.value = true;
@@ -129,12 +142,12 @@ const gettbheight = () => {
 }
 
 const dosavedw = () => {
-  if(dwform.value["id"]!=undefined&&dwform.value["id"]!=null){
+  if (dwform.value["id"] != undefined && dwform.value["id"] != null) {
     updateEquipmentCode(dwform.value).then((res) => {
       ElMessage.success("保存成功")
       getalldata();
     });
-  }else{
+  } else {
     addEquipmentCode(dwform.value).then((res) => {
       ElMessage.success("保存成功")
       getalldata();
@@ -143,8 +156,8 @@ const dosavedw = () => {
   detailshow.value = false;
 };
 
-const  deleterow = (item) =>{
-  delEquipmentCode(item.id).then(res=>{
+const deleterow = (item) => {
+  delEquipmentCode(item.id).then(res => {
     ElMessage.success("删除成功")
     getalldata();
   })

+ 59 - 43
ruoyi-ui-vue3/src/views/system/devicetag/index.vue

@@ -1,17 +1,35 @@
 <template>
   <div style="padding: 10px 15px">
     <el-card class="box-card">
+      <div style="display: flex; flex-direction: row; justify-content: space-between">
+        <div>
+          <div style="
+              display: flex;
+              flex-direction: row;
+              flex-wrap: nowrap;
+              align-items: center;
+            ">
+            <!-- <div style="font-size: 12px; width: 80px">编码:</div>
+            <el-input v-model="searchform.sn" placeholder="编码"></el-input> -->
+
+            <div style="font-size: 12px; width: 80px">名称:</div>
+            <el-input v-model="searchform.name" placeholder="名称"></el-input>
+          </div>
+
+        </div>
+        <div>
+          <el-button type="primary" @click="getalldata">搜索</el-button>
+        </div>
+      </div>
+    </el-card>
+    <el-card class="box-card">
       <template #header>
         <div class="card-header">
           <span>设备标签管理</span>
 
-          <el-button
-            type="primary"
-            @click="
-                doedit(null,1)
-            "
-            >添加</el-button
-          >
+          <el-button type="primary" @click="
+              doedit(null, 1)
+              ">添加</el-button>
         </div>
       </template>
       <el-row>
@@ -24,12 +42,9 @@
             <el-table-column label="操作">
               <template #default="scope">
                 <div>
-                  <el-button
-                    link
-                    @click="
-                     doedit(scope.row,2)
-                    "
-                  >
+                  <el-button link @click="
+              doedit(scope.row, 2)
+              ">
                     <el-tooltip effect="dark" content="编辑">
                       <el-icon>
                         <Edit />
@@ -38,10 +53,9 @@
                   </el-button>
                   <el-popconfirm title="确定删除该记录?" @confirm="deleterow(scope.row)">
                     <template #reference>
-                      <el-button link
-                        ><el-tooltip effect="dark" content="删除"
-                          ><el-icon><Delete /></el-icon></el-tooltip
-                      ></el-button>
+                      <el-button link><el-tooltip effect="dark" content="删除"><el-icon>
+                            <Delete />
+                          </el-icon></el-tooltip></el-button>
                     </template>
                   </el-popconfirm>
                 </div>
@@ -52,35 +66,32 @@
       </el-row>
     </el-card>
 
-    <el-dialog
-      :title="`${edittype == 1 ? '新增' : edittype == 2 ? '编辑' : '查看'}设备标签`"
-      v-model="detailshow"
-    >
-      <el-form  :model="dwform" label-width="120px">
+    <el-dialog :title="`${edittype == 1 ? '新增' : edittype == 2 ? '编辑' : '查看'}设备标签`" v-model="detailshow">
+      <el-form :model="dwform" label-width="120px">
         <el-form-item label="编码">
-          <el-input v-model="dwform.sn"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.sn" :disabled="edittype == 3" />
         </el-form-item>
         <el-form-item label="名称">
-          <el-input v-model="dwform.name"  :disabled="edittype==3"/>
+          <el-input v-model="dwform.name" :disabled="edittype == 3" />
         </el-form-item>
         <el-form-item label="备注">
-          <el-input type="textarea" v-model="dwform.remark" :disabled="edittype==3"/>
+          <el-input type="textarea" v-model="dwform.remark" :disabled="edittype == 3" />
         </el-form-item>
       </el-form>
       <template #footer>
-      <div class="dialog-footer">
-         <el-button @click="detailshow=false;"> 取消 </el-button>
+        <div class="dialog-footer">
+          <el-button @click="detailshow = false;"> 取消 </el-button>
           <el-button type="primary" @click="dosavedw"> 保存 </el-button>
-      </div>
-    </template>
+        </div>
+      </template>
     </el-dialog>
   </div>
 </template>
 
 <script setup lang="ts" name="Units">
 import { ref } from "vue";
-import { listEquipmentTag,addEquipmentTag,updateEquipmentTag,delEquipmentTag } from '@/api/data/equipmenttag.js'
-import {ElMessage} from "element-plus";
+import { listEquipmentTag, addEquipmentTag, updateEquipmentTag, delEquipmentTag } from '@/api/data/equipmenttag.js'
+import { ElMessage } from "element-plus";
 
 
 const dwtabledata = ref([]);
@@ -88,12 +99,17 @@ const dwtabledata = ref([]);
 const edittype = ref(1);
 const detailshow = ref(false);
 
+const searchform = ref({
+  sn: null,
+  name: null
+})
+
 const dwform = ref({
   "sn": "",
   "name": "",
   "remark": ""
 });
-const initdata = ()=>{
+const initdata = () => {
   dwform.value = ({
     "sn": "",
     "name": "",
@@ -101,10 +117,10 @@ const initdata = ()=>{
   })
 }
 initdata();
-const doedit = (item,type) => {
+const doedit = (item, type) => {
   edittype.value = 2;
   dwform.value = item;
-  if(type==1){
+  if (type == 1) {
     initdata();
   }
   detailshow.value = true;
@@ -115,12 +131,12 @@ const gettbheight = () => {
 }
 
 const dosavedw = () => {
-  if(dwform.value["id"]!=undefined&&dwform.value["id"]!=null){
+  if (dwform.value["id"] != undefined && dwform.value["id"] != null) {
     updateEquipmentTag(dwform.value).then((res) => {
       ElMessage.success("保存成功")
       getalldata();
     });
-  }else{
+  } else {
     addEquipmentTag(dwform.value).then((res) => {
       ElMessage.success("保存成功")
       getalldata();
@@ -130,15 +146,15 @@ const dosavedw = () => {
 
 };
 
-const  deleterow = (item) =>{
-   delEquipmentTag(item.id).then(res=>{
-     ElMessage.success("删除成功")
-     getalldata();
-   })
+const deleterow = (item) => {
+  delEquipmentTag(item.id).then(res => {
+    ElMessage.success("删除成功")
+    getalldata();
+  })
 }
 
-const getalldata = ()=>{
-  listEquipmentTag({}).then((res) => {
+const getalldata = () => {
+  listEquipmentTag(searchform.value).then((res) => {
     dwtabledata.value = res.data;
   });
 

+ 175 - 238
ruoyi-ui-vue3/src/views/system/role/index.vue

@@ -1,250 +1,187 @@
 <template>
-   <div class="app-container">
-      <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
-         <el-form-item label="角色名称" prop="roleName">
-            <el-input
-               v-model="queryParams.roleName"
-               placeholder="请输入角色名称"
-               clearable
-               style="width: 240px"
-               @keyup.enter="handleQuery"
-            />
-         </el-form-item>
-         <el-form-item label="权限字符" prop="roleKey">
-            <el-input
-               v-model="queryParams.roleKey"
-               placeholder="请输入权限字符"
-               clearable
-               style="width: 240px"
-               @keyup.enter="handleQuery"
-            />
-         </el-form-item>
-         <el-form-item label="状态" prop="status">
-            <el-select
-               v-model="queryParams.status"
-               placeholder="角色状态"
-               clearable
-               style="width: 240px"
-            >
-               <el-option
-                  v-for="dict in sys_normal_disable"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-               />
-            </el-select>
-         </el-form-item>
-         <el-form-item label="创建时间" style="width: 308px">
-            <el-date-picker
-               v-model="dateRange"
-               value-format="YYYY-MM-DD HH:mm:ss"
-               type="daterange"
-               range-separator="-"
-               start-placeholder="开始日期"
-               end-placeholder="结束日期"
-               :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
-            ></el-date-picker>
-         </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="['system:role:add']"
-            >新增</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="success"
-               plain
-               icon="Edit"
-               :disabled="single"
-               @click="handleUpdate"
-               v-hasPermi="['system:role:edit']"
-            >修改</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="danger"
-               plain
-               icon="Delete"
-               :disabled="multiple"
-               @click="handleDelete"
-               v-hasPermi="['system:role:remove']"
-            >删除</el-button>
-         </el-col>
-         <el-col :span="1.5">
-            <el-button
-               type="warning"
-               plain
-               icon="Download"
-               @click="handleExport"
-               v-hasPermi="['system:role:export']"
-            >导出</el-button>
-         </el-col>
-         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
-      </el-row>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
+      <el-form-item label="角色名称" prop="roleName">
+        <el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable style="width: 240px"
+          @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="权限字符" prop="roleKey">
+        <el-input v-model="queryParams.roleKey" placeholder="请输入权限字符" clearable style="width: 240px"
+          @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="角色状态" clearable style="width: 240px">
+          <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" style="width: 308px">
+        <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-"
+          start-placeholder="开始日期" end-placeholder="结束日期"
+          :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
+      </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="['system:role:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
+          v-hasPermi="['system:role:edit']">修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
+          v-hasPermi="['system:role:remove']">删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport"
+          v-hasPermi="['system:role:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
 
-      <!-- 表格数据 -->
-      <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
-         <el-table-column type="selection" width="55" align="center" />
-         <el-table-column label="角色编号" prop="roleId" width="120" />
-         <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
-         <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
-         <el-table-column label="显示顺序" prop="roleSort" width="100" />
-         <el-table-column label="状态" align="center" width="100">
-            <template #default="scope">
-               <el-switch
-                  v-model="scope.row.status"
-                  active-value="0"
-                  inactive-value="1"
-                  @change="handleStatusChange(scope.row)"
-               ></el-switch>
-            </template>
-         </el-table-column>
-         <el-table-column label="创建时间" align="center" prop="createTime">
-            <template #default="scope">
-               <span>{{ parseTime(scope.row.createTime) }}</span>
-            </template>
-         </el-table-column>
-         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-            <template #default="scope">
-              <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
-              </el-tooltip>
-              <el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button>
-              </el-tooltip>
-              <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
-              </el-tooltip>
-              <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
-                <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
-              </el-tooltip>
-            </template>
-         </el-table-column>
-      </el-table>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="角色编号" prop="roleId" width="120" />
+      <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
+      <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
+      <el-table-column label="显示顺序" prop="roleSort" width="100" />
+      <el-table-column label="角色有效期" width="100">
+        <template #default="scope">
+          <div v-if="scope.row.roleId != 1">
+            {{ moment(scope.row.remark).format("yy-MM-DD") }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" width="100">
+        <template #default="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+            @change="handleStatusChange(scope.row)"></el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-tooltip content="修改" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)"
+              v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="删除" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)"
+              v-hasPermi="['system:role:remove']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)"
+              v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+          <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)"
+              v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+        </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"
-      />
+    <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="roleRef" :model="form" :rules="rules" label-width="100px">
-            <el-form-item label="角色名称" prop="roleName">
-               <el-input v-model="form.roleName" placeholder="请输入角色名称" />
-            </el-form-item>
-            <el-form-item prop="roleKey">
-               <template #label>
-                  <span>
-                     <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
-                        <el-icon><question-filled /></el-icon>
-                     </el-tooltip>
-                     权限字符
-                  </span>
-               </template>
-               <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
-            </el-form-item>
-            <el-form-item label="角色顺序" prop="roleSort">
-               <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
-            </el-form-item>
-            <el-form-item label="状态">
-               <el-radio-group v-model="form.status">
-                  <el-radio
-                     v-for="dict in sys_normal_disable"
-                     :key="dict.value"
-                     :label="dict.value"
-                  >{{ dict.label }}</el-radio>
-               </el-radio-group>
-            </el-form-item>
-            <el-form-item label="菜单权限">
-               <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
-               <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
-               <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
-               <el-tree
-                  class="tree-border"
-                  :data="menuOptions"
-                  show-checkbox
-                  ref="menuRef"
-                  node-key="id"
-                  :check-strictly="!form.menuCheckStrictly"
-                  empty-text="加载中,请稍候"
-                  :props="{ label: 'label', children: 'children' }"
-               ></el-tree>
-            </el-form-item>
-            <el-form-item label="备注">
-               <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
-            </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>
+    <!-- 添加或修改角色配置对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="roleRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item prop="roleKey">
+          <template #label>
+            <span>
+              <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
+                <el-icon><question-filled /></el-icon>
+              </el-tooltip>
+              权限字符
+            </span>
+          </template>
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
+              }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="菜单权限">
+          <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.menuCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-tree class="tree-border" :data="menuOptions" show-checkbox ref="menuRef" node-key="id"
+            :check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"></el-tree>
+        </el-form-item>
+        <!-- <el-form-item label="备注"> -->
+          <el-form-item label="角色有效期">
+          <!-- <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> -->
+          <el-date-picker v-model="form.remark" type="date" placeholder="Pick a day" :disabled-date="disabledDate"
+            :shortcuts="shortcuts" :size="size" />
+        </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>
 
-      <!-- 分配角色数据权限对话框 -->
-      <el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
-         <el-form :model="form" label-width="80px">
-            <el-form-item label="角色名称">
-               <el-input v-model="form.roleName" :disabled="true" />
-            </el-form-item>
-            <el-form-item label="权限字符">
-               <el-input v-model="form.roleKey" :disabled="true" />
-            </el-form-item>
-            <el-form-item label="权限范围">
-               <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
-                  <el-option
-                     v-for="item in dataScopeOptions"
-                     :key="item.value"
-                     :label="item.label"
-                     :value="item.value"
-                  ></el-option>
-               </el-select>
-            </el-form-item>
-            <el-form-item label="数据权限" v-show="form.dataScope == 2">
-               <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
-               <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
-               <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
-               <el-tree
-                  class="tree-border"
-                  :data="deptOptions"
-                  show-checkbox
-                  default-expand-all
-                  ref="deptRef"
-                  node-key="id"
-                  :check-strictly="!form.deptCheckStrictly"
-                  empty-text="加载中,请稍候"
-                  :props="{ label: 'label', children: 'children' }"
-               ></el-tree>
-            </el-form-item>
-         </el-form>
-         <template #footer>
-            <div class="dialog-footer">
-               <el-button type="primary" @click="submitDataScope">确 定</el-button>
-               <el-button @click="cancelDataScope">取 消</el-button>
-            </div>
-         </template>
-      </el-dialog>
-   </div>
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog :title="title" v-model="openDataScope" width="500px" append-to-body>
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="角色名称">
+          <el-input v-model="form.roleName" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限字符">
+          <el-input v-model="form.roleKey" :disabled="true" />
+        </el-form-item>
+        <el-form-item label="权限范围">
+          <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
+            <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label"
+              :value="item.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+          <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.deptCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'dept')">父子联动</el-checkbox>
+          <el-tree class="tree-border" :data="deptOptions" show-checkbox default-expand-all ref="deptRef" node-key="id"
+            :check-strictly="!form.deptCheckStrictly" empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"></el-tree>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitDataScope">确 定</el-button>
+          <el-button @click="cancelDataScope">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
 </template>
 
 <script setup name="Role">
 import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role";
 import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu";
+import moment from "moment";
 
 const router = useRouter();
 const { proxy } = getCurrentInstance();
@@ -325,7 +262,7 @@ function handleDelete(row) {
   }).then(() => {
     getList();
     proxy.$modal.msgSuccess("删除成功");
-  }).catch(() => {});
+  }).catch(() => { });
 }
 /** 导出按钮操作 */
 function handleExport() {

+ 37 - 3
ruoyi-ui-vue3/src/views/system/units/index.vue

@@ -4,10 +4,12 @@
       <template #header>
         <div class="card-header">
           <span>单位管理</span>
-
+          <div>
           <el-button
             type="primary"
             @click="showdetail(null,1)">添加</el-button>
+            <el-button type="danger" @click="deleteall">批量删除</el-button>
+          </div>
         </div>
       </template>
       <el-row>
@@ -17,7 +19,8 @@
           </el-table>
         </el-col>
         <el-col :span="16" style="padding-left: 10px">
-          <el-table :data="dwtabledata" :border="true" :height="gettbheight()">
+          <el-table :data="dwtabledata" ref="tableref" :border="true" :height="gettbheight()">
+            <el-table-column type="selection" width="55"></el-table-column>
             <el-table-column prop="name" label="名称"></el-table-column>
             <el-table-column prop="unitSymbol" label="单位符号"></el-table-column>
             <el-table-column prop="unitName" label="单位名称"></el-table-column>
@@ -112,7 +115,8 @@
 import {onMounted, ref} from "vue";
 import moment from 'moment'
 import { listUnit,addUnit,delUnit,updateUnit,getUnit } from '@/api/data/unit.js'
-import {ElMessage} from "element-plus";
+// import {ElMessage} from "element-plus";
+import { ElMessage, ElMessageBox } from "element-plus";
 import _ from "lodash"
 
 const dwtypetabledata = ref([]);
@@ -121,6 +125,8 @@ const dwtabledata = ref([]);
 const edittype = ref(1);
 const detailshow = ref(false);
 
+const tableref = ref(null);
+
 const dwtypetable =ref();
 
 const typeoptions = ref([]);
@@ -153,6 +159,34 @@ const showdetail = (item,type) => {
   }
 };
 
+const deleteall = () => {
+  let selected = tableref.value.getSelectionRows();
+  if (selected.length == 0) {
+    ElMessage.warning("请选择要删除的行");
+    return;
+  }
+
+  if (selected.length > 0) {
+    ElMessageBox.confirm(
+      `是否删除${selected.length}条数据`,
+      "警告",
+      {
+        confirmButtonText: "确认",
+        cancelButtonText: "取消",
+        type: 'warning',
+      }
+    ).then(() => {
+      delUnit(selected.map(i => i.id).join(",")).then((res) => {
+        ElMessage.success("删除成功");
+        getalldata();
+      })
+
+    });
+  }
+
+}
+
+
 const gettbheight = () => {
   return window.innerHeight - 200;
 }

+ 172 - 0
ruoyi-ui-vue3/src/views/warnRole/authUser.vue

@@ -0,0 +1,172 @@
+
+<template>
+   <div class="app-container">
+      <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true">
+         <el-form-item label="用户名称" prop="userName">
+            <el-input
+               v-model="queryParams.userName"
+               placeholder="请输入用户名称"
+               clearable
+               style="width: 240px"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="手机号码" prop="phonenumber">
+            <el-input
+               v-model="queryParams.phonenumber"
+               placeholder="请输入手机号码"
+               clearable
+               style="width: 240px"
+               @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="openSelectUser"
+               v-hasPermi="['system:role:add']"
+            >添加用户</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button
+               type="danger"
+               plain
+               icon="CircleClose"
+               :disabled="multiple"
+               @click="cancelAuthUserAll"
+               v-hasPermi="['system:role:remove']"
+            >批量取消授权</el-button>
+         </el-col>
+         <el-col :span="1.5">
+            <el-button 
+               type="warning" 
+               plain 
+               icon="Close"
+               @click="handleClose"
+            >关闭</el-button>
+         </el-col>
+         <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+
+      <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange">
+         <el-table-column type="selection" width="55" align="center" />
+         <el-table-column label="用户名称" prop="userName" :show-overflow-tooltip="true" />
+         <el-table-column label="用户昵称" prop="nickName" :show-overflow-tooltip="true" />
+         <el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
+         <el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
+         <el-table-column label="状态" align="center" prop="status">
+            <template #default="scope">
+               <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+            </template>
+         </el-table-column>
+         <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+            <template #default="scope">
+               <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+         </el-table-column>
+         <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template #default="scope">
+               <el-button link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)" v-hasPermi="['system:role: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"
+      />
+      <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" />
+   </div>
+</template>
+
+<script setup name="AuthUser">
+import selectUser from "./selectUser";
+import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role";
+
+const route = useRoute();
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const userList = ref([]);
+const loading = ref(true);
+const showSearch = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const userIds = ref([]);
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  roleId: route.params.roleId,
+  userName: undefined,
+  phonenumber: undefined,
+});
+
+/** 查询授权用户列表 */
+function getList() {
+  loading.value = true;
+  allocatedUserList(queryParams).then(response => {
+    userList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+// 返回按钮
+function handleClose() {
+  const obj = { path: "/system/role" };
+  proxy.$tab.closeOpenPage(obj);
+}
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.pageNum = 1;
+  getList();
+}
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  userIds.value = selection.map(item => item.userId);
+  multiple.value = !selection.length;
+}
+/** 打开授权用户表弹窗 */
+function openSelectUser() {
+  proxy.$refs["selectRef"].show();
+}
+/** 取消授权按钮操作 */
+function cancelAuthUser(row) {
+  proxy.$modal.confirm('确认要取消该用户"' + row.userName + '"角色吗?').then(function () {
+    return authUserCancel({ userId: row.userId, roleId: queryParams.roleId });
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("取消授权成功");
+  }).catch(() => {});
+}
+/** 批量取消授权按钮操作 */
+function cancelAuthUserAll(row) {
+  const roleId = queryParams.roleId;
+  const uIds = userIds.value.join(",");
+  proxy.$modal.confirm("是否取消选中用户授权数据项?").then(function () {
+    return authUserCancelAll({ roleId: roleId, userIds: uIds });
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("取消授权成功");
+  }).catch(() => {});
+}
+
+getList();
+</script>

+ 486 - 0
ruoyi-ui-vue3/src/views/warnRole/index.vue

@@ -0,0 +1,486 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" v-show="showSearch" :inline="true" label-width="68px">
+      <el-form-item label="角色名称" prop="roleName">
+        <el-input v-model="queryParams.roleName" placeholder="请输入角色名称" clearable style="width: 240px"
+          @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="权限字符" prop="roleKey">
+        <el-input v-model="queryParams.roleKey" placeholder="请输入权限字符" clearable style="width: 240px"
+          @keyup.enter="handleQuery" />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="角色状态" clearable style="width: 240px">
+          <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="创建时间" style="width: 308px">
+        <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" type="daterange" range-separator="-"
+          start-placeholder="开始日期" end-placeholder="结束日期"
+          :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"></el-date-picker>
+      </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="['system:role:add']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate"
+          v-hasPermi="['system:role:edit']">修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete"
+          v-hasPermi="['system:role:remove']">删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="Download" @click="handleExport"
+          v-hasPermi="['system:role:export']">导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="角色编号" prop="roleId" width="120" />
+      <el-table-column label="角色名称" prop="roleName" :show-overflow-tooltip="true" width="150" />
+      <el-table-column label="权限字符" prop="roleKey" :show-overflow-tooltip="true" width="150" />
+      <el-table-column label="显示顺序" prop="roleSort" width="100" />
+      <el-table-column label="角色有效期" width="100">
+        <template #default="scope">
+          <div v-if="scope.row.roleId != 1">
+            {{ moment(scope.row.remark).format("yy-MM-DD") }}
+          </div>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" width="100">
+        <template #default="scope">
+          <el-switch v-model="scope.row.status" active-value="0" inactive-value="1"
+            @change="handleStatusChange(scope.row)"></el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-tooltip content="告警权限" placement="top" v-if="scope.row.roleId !== 1">
+            <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)"
+              v-hasPermi="['system:role:edit']"></el-button>
+          </el-tooltip>
+        </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="roleRef" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称" />
+        </el-form-item>
+        <el-form-item prop="roleKey">
+          <template #label>
+            <span>
+              <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
+                <el-icon><question-filled /></el-icon>
+              </el-tooltip>
+              权限字符
+            </span>
+          </template>
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符" />
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="0" />
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label
+              }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="菜单权限">
+          <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.menuCheckStrictly"
+            @change="handleCheckedTreeConnect($event, 'menu')">父子联动</el-checkbox>
+          <el-tree class="tree-border" :data="menuOptions" show-checkbox ref="menuRef" node-key="id"
+            :check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候"
+            :props="{ label: 'label', children: 'children' }"></el-tree>
+        </el-form-item>
+        <!-- <el-form-item label="备注"> -->
+        <el-form-item label="角色有效期">
+          <!-- <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input> -->
+          <el-date-picker v-model="form.remark" type="date" placeholder="Pick a day" :disabled-date="disabledDate"
+            :shortcuts="shortcuts" :size="size" />
+        </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>
+
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog :title="title" v-model="openDataScope" width="50vw" append-to-body>
+      <!-- <el-form :model="form" label-width="80px"> -->
+        <el-transfer v-model="warnvalue" :data="warndata" :titles="['未分配', '已分配']"/>
+      <!-- </el-form> -->
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitDataScope">确 定</el-button>
+          <el-button @click="cancelDataScope">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Role">
+import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role";
+import { roleMenuTreeselect, treeselect as menuTreeselect } from "@/api/system/menu";
+import moment from "moment";
+import { listRule, addRule, updateRule, delRule, getRule } from "@/api/data/rule"
+
+
+const router = useRouter();
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const roleList = 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 dateRange = ref([]);
+const menuOptions = ref([]);
+const menuExpand = ref(false);
+const menuNodeAll = ref(false);
+const deptExpand = ref(true);
+const deptNodeAll = ref(false);
+const deptOptions = ref([]);
+const openDataScope = ref(false);
+const menuRef = ref(null);
+const deptRef = ref(null);
+
+
+const warndata = ref([]);
+const warnvalue = ref([])
+
+/** 数据范围选项*/
+const dataScopeOptions = ref([
+  { value: "1", label: "全部数据权限" },
+  { value: "2", label: "自定数据权限" },
+  { value: "3", label: "本部门数据权限" },
+  { value: "4", label: "本部门及以下数据权限" },
+  { value: "5", label: "仅本人数据权限" }
+]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    roleName: undefined,
+    roleKey: undefined,
+    status: undefined
+  },
+  rules: {
+    roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
+    roleKey: [{ required: true, message: "权限字符不能为空", trigger: "blur" }],
+    roleSort: [{ required: true, message: "角色顺序不能为空", trigger: "blur" }]
+  },
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+const generateData = () => {
+    listRule({pageSize:1000}).then(res => {
+      // tabledata.value = res.rows
+      const data = []
+      for (var index in res.rows) {
+        data.push({
+          key: index,
+          label: res.rows[index].name,
+        })
+      }
+      warndata.value = data
+    })
+}
+
+/** 查询角色列表 */
+function getList() {
+  loading.value = true;
+  listRole(proxy.addDateRange(queryParams.value, dateRange.value)).then(response => {
+    roleList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+/** 重置按钮操作 */
+function resetQuery() {
+  dateRange.value = [];
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const roleIds = row.roleId || ids.value;
+  proxy.$modal.confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?').then(function () {
+    return delRole(roleIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => { });
+}
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download("system/role/export", {
+    ...queryParams.value,
+  }, `role_${new Date().getTime()}.xlsx`);
+}
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.roleId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+/** 角色状态修改 */
+function handleStatusChange(row) {
+  let text = row.status === "0" ? "启用" : "停用";
+  proxy.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?').then(function () {
+    return changeRoleStatus(row.roleId, row.status);
+  }).then(() => {
+    proxy.$modal.msgSuccess(text + "成功");
+  }).catch(function () {
+    row.status = row.status === "0" ? "1" : "0";
+  });
+}
+/** 更多操作 */
+function handleCommand(command, row) {
+  switch (command) {
+    case "handleDataScope":
+      handleDataScope(row);
+      break;
+    case "handleAuthUser":
+      handleAuthUser(row);
+      break;
+    default:
+      break;
+  }
+}
+/** 分配用户 */
+function handleAuthUser(row) {
+  router.push("/system/role-auth/user/" + row.roleId);
+}
+/** 查询菜单树结构 */
+function getMenuTreeselect() {
+  menuTreeselect().then(response => {
+    menuOptions.value = response.data;
+  });
+}
+/** 所有部门节点数据 */
+function getDeptAllCheckedKeys() {
+  // 目前被选中的部门节点
+  let checkedKeys = deptRef.value.getCheckedKeys();
+  // 半选中的部门节点
+  let halfCheckedKeys = deptRef.value.getHalfCheckedKeys();
+  checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+  return checkedKeys;
+}
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  if (menuRef.value != undefined) {
+    menuRef.value.setCheckedKeys([]);
+  }
+  menuExpand.value = false;
+  menuNodeAll.value = false;
+  deptExpand.value = true;
+  deptNodeAll.value = false;
+  form.value = {
+    roleId: undefined,
+    roleName: undefined,
+    roleKey: undefined,
+    roleSort: 0,
+    status: "0",
+    menuIds: [],
+    deptIds: [],
+    menuCheckStrictly: true,
+    deptCheckStrictly: true,
+    remark: undefined
+  };
+  proxy.resetForm("roleRef");
+}
+/** 添加角色 */
+function handleAdd() {
+  reset();
+  getMenuTreeselect();
+  open.value = true;
+  title.value = "添加角色";
+}
+/** 修改角色 */
+function handleUpdate(row) {
+  reset();
+  const roleId = row.roleId || ids.value;
+  const roleMenu = getRoleMenuTreeselect(roleId);
+  getRole(roleId).then(response => {
+    form.value = response.data;
+    form.value.roleSort = Number(form.value.roleSort);
+    open.value = true;
+    nextTick(() => {
+      roleMenu.then((res) => {
+        let checkedKeys = res.data.checkedKeys;
+        checkedKeys.forEach((v) => {
+          nextTick(() => {
+            menuRef.value.setChecked(v, true, false);
+          });
+        });
+      });
+    });
+    title.value = "修改角色";
+  });
+}
+/** 根据角色ID查询菜单树结构 */
+function getRoleMenuTreeselect(roleId) {
+  return roleMenuTreeselect(roleId).then(response => {
+    menuOptions.value = response.data.menus;
+    return response;
+  });
+}
+/** 根据角色ID查询部门树结构 */
+function getDeptTree(roleId) {
+  return deptTreeSelect(roleId).then(response => {
+    deptOptions.value = response.data.depts;
+    return response;
+  });
+}
+/** 树权限(展开/折叠)*/
+function handleCheckedTreeExpand(value, type) {
+  if (type == "menu") {
+    let treeList = menuOptions.value;
+    for (let i = 0; i < treeList.length; i++) {
+      menuRef.value.store.nodesMap[treeList[i].id].expanded = value;
+    }
+  } else if (type == "dept") {
+    let treeList = deptOptions.value;
+    for (let i = 0; i < treeList.length; i++) {
+      deptRef.value.store.nodesMap[treeList[i].id].expanded = value;
+    }
+  }
+}
+/** 树权限(全选/全不选) */
+function handleCheckedTreeNodeAll(value, type) {
+  if (type == "menu") {
+    menuRef.value.setCheckedNodes(value ? menuOptions.value : []);
+  } else if (type == "dept") {
+    deptRef.value.setCheckedNodes(value ? deptOptions.value : []);
+  }
+}
+/** 树权限(父子联动) */
+function handleCheckedTreeConnect(value, type) {
+  if (type == "menu") {
+    form.value.menuCheckStrictly = value ? true : false;
+  } else if (type == "dept") {
+    form.value.deptCheckStrictly = value ? true : false;
+  }
+}
+/** 所有菜单节点数据 */
+function getMenuAllCheckedKeys() {
+  // 目前被选中的菜单节点
+  let checkedKeys = menuRef.value.getCheckedKeys();
+  // 半选中的菜单节点
+  let halfCheckedKeys = menuRef.value.getHalfCheckedKeys();
+  checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+  return checkedKeys;
+}
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["roleRef"].validate(valid => {
+    if (valid) {
+      if (form.value.roleId != undefined) {
+        form.value.menuIds = getMenuAllCheckedKeys();
+        updateRole(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        form.value.menuIds = getMenuAllCheckedKeys();
+        addRole(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+/** 取消按钮 */
+function cancel() {
+  open.value = false;
+  reset();
+}
+/** 选择角色权限范围触发 */
+function dataScopeSelectChange(value) {
+  if (value !== "2") {
+    deptRef.value.setCheckedKeys([]);
+  }
+}
+/** 分配数据权限操作 */
+function handleDataScope(row) {
+  reset();
+  const deptTreeSelect = getDeptTree(row.roleId);
+  getRole(row.roleId).then(response => {
+    form.value = response.data;
+    openDataScope.value = true;
+    nextTick(() => {
+      deptTreeSelect.then(res => {
+        nextTick(() => {
+          if (deptRef.value) {
+            deptRef.value.setCheckedKeys(res.data.checkedKeys);
+          }
+        });
+      });
+    });
+    title.value = "分配告警权限";
+  });
+}
+/** 提交按钮(数据权限) */
+function submitDataScope() {
+  if (form.value.roleId != undefined) {
+    form.value.deptIds = getDeptAllCheckedKeys();
+    dataScope(form.value).then(response => {
+      proxy.$modal.msgSuccess("修改成功");
+      openDataScope.value = false;
+      getList();
+    });
+  }
+}
+/** 取消按钮(数据权限)*/
+function cancelDataScope() {
+  openDataScope.value = false;
+  reset();
+}
+
+getList();
+generateData();
+</script>

+ 140 - 0
ruoyi-ui-vue3/src/views/warnRole/selectUser.vue

@@ -0,0 +1,140 @@
+<template>
+   <!-- 授权用户 -->
+   <el-dialog title="选择用户" v-model="visible" width="800px" top="5vh" append-to-body>
+      <el-form :model="queryParams" ref="queryRef" :inline="true">
+         <el-form-item label="用户名称" prop="userName">
+            <el-input
+               v-model="queryParams.userName"
+               placeholder="请输入用户名称"
+               clearable
+               style="width: 200px"
+               @keyup.enter="handleQuery"
+            />
+         </el-form-item>
+         <el-form-item label="手机号码" prop="phonenumber">
+            <el-input
+               v-model="queryParams.phonenumber"
+               placeholder="请输入手机号码"
+               clearable
+               style="width: 200px"
+               @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>
+         <el-table @row-click="clickRow" ref="refTable" :data="userList" @selection-change="handleSelectionChange" height="260px">
+            <el-table-column type="selection" width="55"></el-table-column>
+            <el-table-column label="用户名称" prop="userName" :show-overflow-tooltip="true" />
+            <el-table-column label="用户昵称" prop="nickName" :show-overflow-tooltip="true" />
+            <el-table-column label="邮箱" prop="email" :show-overflow-tooltip="true" />
+            <el-table-column label="手机" prop="phonenumber" :show-overflow-tooltip="true" />
+            <el-table-column label="状态" align="center" prop="status">
+               <template #default="scope">
+                  <dict-tag :options="sys_normal_disable" :value="scope.row.status" />
+               </template>
+            </el-table-column>
+            <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+               <template #default="scope">
+                  <span>{{ parseTime(scope.row.createTime) }}</span>
+               </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-row>
+      <template #footer>
+         <div class="dialog-footer">
+            <el-button type="primary" @click="handleSelectUser">确 定</el-button>
+            <el-button @click="visible = false">取 消</el-button>
+         </div>
+      </template>
+   </el-dialog>
+</template>
+
+<script setup name="SelectUser">
+import { authUserSelectAll, unallocatedUserList } from "@/api/system/role";
+
+const props = defineProps({
+  roleId: {
+    type: [Number, String]
+  }
+});
+
+const { proxy } = getCurrentInstance();
+const { sys_normal_disable } = proxy.useDict("sys_normal_disable");
+
+const userList = ref([]);
+const visible = ref(false);
+const total = ref(0);
+const userIds = ref([]);
+
+const queryParams = reactive({
+  pageNum: 1,
+  pageSize: 10,
+  roleId: undefined,
+  userName: undefined,
+  phonenumber: undefined
+});
+
+// 显示弹框
+function show() {
+  queryParams.roleId = props.roleId;
+  getList();
+  visible.value = true;
+}
+/**选择行 */
+function clickRow(row) {
+  proxy.$refs["refTable"].toggleRowSelection(row);
+}
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  userIds.value = selection.map(item => item.userId);
+}
+// 查询表数据
+function getList() {
+  unallocatedUserList(queryParams).then(res => {
+    userList.value = res.rows;
+    total.value = res.total;
+  });
+}
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.pageNum = 1;
+  getList();
+}
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+const emit = defineEmits(["ok"]);
+/** 选择授权用户操作 */
+function handleSelectUser() {
+  const roleId = queryParams.roleId;
+  const uIds = userIds.value.join(",");
+  if (uIds == "") {
+    proxy.$modal.msgError("请选择要分配的用户");
+    return;
+  }
+  authUserSelectAll({ roleId: roleId, userIds: uIds }).then(res => {
+    proxy.$modal.msgSuccess(res.msg);
+    if (res.code === 200) {
+      visible.value = false;
+      emit("ok");
+    }
+  });
+}
+
+defineExpose({
+  show,
+});
+</script>