فهرست منبع

Merge branch 'bfmanage' of git.sagacloud.cn:web/ibms into bfmanage

zhangyu 5 سال پیش
والد
کامیت
dc75ac1822

+ 6 - 0
src/api/scan/request.js

@@ -1188,6 +1188,12 @@ export function dynamicQueryAI(param, success) {
     http.postJson(url, param, success)
 }
 
+//动态数据关联-执行对应结果详情
+export function dynamicExecuteDetail(param, success) {
+    let url = `${baseUrl}/pointconfig/dynamic/executeDetail`;
+    http.postJson(url, param, success)
+}
+
 //建筑楼层管理-创建楼层
 export function manageCreateFloor(param, success) {
     let url = `${baseUrl}/datacenter/floor/create`;

+ 96 - 0
src/components/point/dynamicdata/applyLog.vue

@@ -0,0 +1,96 @@
+<template>
+  <el-dialog title="提示" :visible.sync="dialogVisible" width="40%" id="applyRules">
+    <p>按对应规则配置动态参数,已完成!</p>
+    <p>请检查并关注以下实例及相关动态参数,自动配置结果是否正确</p>
+    <div ref="message" style="max-height:400px;overflow-x:hidden;overflow-y:auto;">
+      <div v-for="item in ContentList" :key="item.code" v-show="item.children.length">
+        <p>【{{item.name}}】</p>
+        <div v-for="t in item.children" :key="t.ObjectID+t.Id">
+          <p v-if="t.TypeCode=='Eq'">
+            {{`${t.ObjectLocalName?t.ObjectLocalName:'--'}/${t.ObjectID?t.ObjectID:'--'}/${t.TypeName?t.TypeName:'--'}/${t.BuildLocalName?t.BuildLocalName:'--' }/${t.FloorLocalName?t.FloorLocalName:'--'}/${t.RoomLocalName?t.RoomLocalName:'--'}`}}
+          </p>
+          <p v-if="t.TypeCode=='Ec'">
+            {{`${t.ObjectLocalName?t.ObjectLocalName:'--'}/${t.ObjectID?t.ObjectID:'--'}/${t.TypeName?t.TypeName:'--'}/${t.CascadeEquipLocalName}/${t.BuildLocalName?t.BuildLocalName:'--' }/${t.FloorLocalName?t.FloorLocalName:'--'}/${t.RoomLocalName?t.RoomLocalName:'--'}`}}
+          </p>
+          <p v-if="t.TypeCode=='Sp'">
+            {{`${t.ObjectLocalName?t.ObjectLocalName:'--'}/${t.ObjectID?t.ObjectID:'--'}/${t.TypeName?t.TypeName:'--'}/${t.BuildLocalName?t.BuildLocalName:'--' }/${t.FloorLocalName?t.FloorLocalName:'--'}`}}
+          </p>
+          <p v-if="t.TypeCode=='Sy'">{{`${t.ObjectLocalName?t.ObjectLocalName:'--'}/${t.ObjectID?t.ObjectID:'--'}/${t.TypeName?t.TypeName:'--'}`}}</p>
+          <p>{{`${t.InfomationPoint}/${t.Old}/${t.New}`}}</p>
+          <hr style="margin:10px 0;width:50%;">
+        </div>
+      </div>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="copy">复制信息</el-button>
+      <el-button size="small" type="primary" @click="dialogVisible=false">关闭</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+
+import {
+  dynamicExecuteDetail // 查询执行日志
+} from "@/api/scan/request";
+export default {
+  data() {
+    return {
+      dialogVisible: false, //弹窗显示与隐藏
+      ContentList: [
+        { name: '人工维护过值的信息点', children: [], code: 'MeterDiff' },
+        { name: '多个表号功能号对应一个信息点,无法执行对应规则,请检查', children: [], code: 'Multiple' },
+      ],
+      typeList: ["MeterDiff", "Multiple"], //此分类索引需与上list保持一致
+    };
+  },
+  methods: {
+    showDialog(Id) {
+      this.dialogVisible = true
+      this.getApplyLog(Id)
+    },
+    handleClose() {
+      this.dialogVisible = false;
+    },
+    //复制信息
+    copy() {
+      let text = this.$refs.message.innerText;
+      let copyUrl = $('<input type="text" />').val(text);//创建一个input框获取需要复制的文本内容
+      copyUrl.appendTo('body');
+      copyUrl.select();
+      document.execCommand("Copy");
+      copyUrl.remove()
+      this.$message.success('复制成功')
+    },
+    //查询执行日志
+    getApplyLog(Id) {
+      let param = {
+        Filters: `Type='Multiple' or Type='MeterDiff';Id='${Id}'`,
+        PageNumber: 1,
+        PageSize: 50
+      }
+      dynamicExecuteDetail(param, res => {
+        res.Content.map(t => {
+          this.ContentList[this.typeList.indexOf(t.Type)].children.push(t)
+        })
+        this.ContentList[1].children = this.unique(this.ContentList[1].children)
+      })
+    },
+    //数组去重
+    unique(arr) {
+      let hash = [];
+      if (arr.length) {
+        for (var i = 0; i < arr.length; i++) {
+          for (var j = i + 1; j < arr.length; j++) {
+            if (arr[i].ObjectID === arr[j].ObjectID && arr[i].InfomationPointCode === arr[j].InfomationPointCode) {
+              ++i;
+              arr[i].New += '/' + arr[j].New
+            }
+          }
+          hash.push(arr[i]);
+        }
+      }
+      return hash;
+    }
+  }
+};
+</script>

+ 107 - 0
src/components/point/dynamicdata/applyRulesDialog-copy.vue

@@ -0,0 +1,107 @@
+<template>
+  <el-dialog title="提示" :visible.sync="dialogVisible" width="30%" @close="handleClose" id="applyRules">
+    <p>对应规则有冲突,请选择处理方式:</p>
+    <div>
+      <el-radio v-model="select" :label="'Old'">保留设备实例中人工维护的动态参数的值</el-radio>
+    </div>
+    <div>
+      <el-radio v-model="select" :label="'New'">按照规则自动覆盖动态参数的值</el-radio>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button size="small" @click="handleClose">取消</el-button>
+      <el-button size="small" type="primary" @click="confirmClash">确认</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+
+import {
+  dynamicPromptobjs, //提示冲突
+  dynamicClashConfirm, //冲突选择确认
+  dynamicExecute, //执行规则
+} from "@/api/scan/request";
+import Vue from 'vue'
+export default {
+  data() {
+    return {
+      dialogVisible: false, //弹窗显示与隐藏
+      tableData: [],
+      activeName: "first", //当前所在tab页
+      finished: false, //未处理所有冲突提示文字
+      force: false, //请求冲突-默认false
+      select: 'New'
+    };
+  },
+  methods: {
+    showDialog(force) {
+      this.force = force
+      if (this.tableData.length) {
+        this.dialogVisible = true;
+      } else {
+        this.rulesConfirm()
+      }
+    },
+    handleClose() {
+      this.dialogVisible = false;
+      this.$emit('cancel')
+    },
+    //查询是否有冲突
+    getPromptobjs() {
+      let param = {
+        Force: this.force
+      }
+      dynamicPromptobjs(param, res => {
+        this.tableData = res.Content;
+        this.$emit('clash', this.tableData.length);
+      })
+    },
+    //确认冲突
+    confirmClash() {
+      let selectedRows = this.tableData.map(t => {
+        t.checked = this.select
+        return t
+      });
+      let param = [];
+      selectedRows.map(t => {
+        let tempObj = {
+          Objs: [t],
+          Points: [t]
+        }
+        param.push(tempObj)
+      })
+      dynamicClashConfirm(param, res => {
+        this.rulesConfirm();
+      })
+    },
+    //执行规则
+    rulesConfirm() {
+      let param = {
+        Force: this.force
+      }
+      dynamicExecute(param, res => {
+        this.$message.success('执行成功');
+        this.dialogVisible = false;
+        let missionID = res.Content[0].Id
+        this.$emit('refresh', missionID)
+      })
+    }
+  },
+  mounted() { },
+  created() {
+    this.getPromptobjs()
+  }
+};
+</script>
+<style lang="scss" scoped>
+#applyRules {
+  /deep/ td.bgf5 {
+    background-color: #f5f7fa;
+  }
+  td p {
+    text-align: center;
+  }
+  /deep/ .el-radio__input.is-checked + .el-radio__label {
+    color: #000;
+  }
+}
+</style>

+ 17 - 3
src/views/point/dynamicdata/index.vue

@@ -35,7 +35,9 @@
     <!-- 空间 -->
     <spaceRules v-else-if="curType=='空间'" ref="space" :typeName="curType" @refresh="refreshTabs" :isPending="isPending"></spaceRules>
     <!-- 应用规则弹窗 -->
-    <apply-rules-dialog ref="apply" @refresh="getExecuteFeedback" @cancel="cancelApply"></apply-rules-dialog>
+    <apply-rules-dialog ref="apply" @refresh="getExecuteFeedback" @cancel="cancelApply" @clash="getClash"></apply-rules-dialog>
+    <!-- 冲突日志 -->
+    <applyLog ref="applyLog"></applyLog>
     <!-- 规则更新提示 -->
     <el-dialog title="提示" :visible.sync="ruleDialogShow" width="25%" @close="rulesClose">
       <span>{{tipCon}}</span>
@@ -45,7 +47,7 @@
       </span>
     </el-dialog>
     <!-- 选择增量 or 全量 执行 -->
-    <el-dialog title="提示" :visible.sync="allApplyDialog" width="50%" @close="allApplyClose">
+    <el-dialog title="提示" :visible.sync="allApplyDialog" width="30%" @close="allApplyClose">
       <div id="applySelect">
         <el-radio v-model="force" :label="false">增量执行:只设定对应规则or原始点位有变化的实例动态参数信息点</el-radio>
         <p style="color:#999;">因自动判断是否变化,可能更新不够完整,但速度比较快</p>
@@ -69,7 +71,9 @@
 <script>
 import tools from "@/utils/tools";
 import { mapGetters, mapActions } from "vuex";
-import applyRulesDialog from "@/components/point/dynamicdata/applyRulesDialog";
+// import applyRulesDialog from "@/components/point/dynamicdata/applyRulesDialog";
+import applyRulesDialog from "@/components/point/dynamicdata/applyRulesDialog-copy";
+import applyLog from "@/components/point/dynamicdata/applyLog";
 import equipRules from "@/components/point/dynamicdata/equipRules";
 import partsRules from "@/components/point/dynamicdata/partsRules";
 import systemRules from "@/components/point/dynamicdata/systemRules";
@@ -97,10 +101,12 @@ export default {
       force: false, //默认增量执行 ----- false - 增量 true - 全量执行
       isPending: false, //是否执行中:执行中禁用所有功能 true即为执行中
       missionID: '', //任务id
+      hasClash: false, //默认不含冲突
     };
   },
   components: {
     applyRulesDialog,
+    applyLog,
     equipRules,
     partsRules,
     systemRules,
@@ -234,6 +240,10 @@ export default {
             setTimeout(() => {
               this.isPending = false;
               this.getPrompt()
+              this.$refs.apply.getPromptobjs()
+              if(this.hasClash){
+                this.$refs.applyLog.showDialog(missionID)
+              }
             }, 2000)
           } else {
             this.isPending = true;
@@ -249,6 +259,10 @@ export default {
     cancelApply(x) {
       this.isPending = false;
       this.tipsType = 1;
+    },
+    //接收是否有冲突
+    getClash(length){
+      this.hasClash = !!length
     }
   },
   watch: {