Bläddra i källkod

Merge branch 'details-component' into dev

zhangyu 5 år sedan
förälder
incheckning
5e8b5a6c20
27 ändrade filer med 3982 tillägg och 454 borttagningar
  1. 228 200
      src/assets/style/iconfont/iconfont.css
  2. BIN
      src/assets/style/iconfont/iconfont.eot
  3. 118 97
      src/assets/style/iconfont/iconfont.svg
  4. BIN
      src/assets/style/iconfont/iconfont.ttf
  5. BIN
      src/assets/style/iconfont/iconfont.woff
  6. 110 0
      src/components/ledger/details/detail/cruxDialog.vue
  7. 141 0
      src/components/ledger/details/detail/exhibitionBaseInformation.vue
  8. 120 0
      src/components/ledger/details/detail/exhibitionCrux.vue
  9. 56 0
      src/components/ledger/details/detail/exhibitionEnergy.vue
  10. 36 0
      src/components/ledger/details/detail/exhibitionFile.vue
  11. 51 0
      src/components/ledger/details/detail/exhibitionImage.vue
  12. 26 0
      src/components/ledger/details/detail/exhibitionMaintain.vue
  13. 51 0
      src/components/ledger/details/detail/exhibitionVideo.vue
  14. 209 0
      src/components/ledger/details/detail/lookFile.vue
  15. 297 0
      src/components/ledger/details/detail/lookImage.vue
  16. 297 0
      src/components/ledger/details/detail/lookVideo.vue
  17. 46 0
      src/components/ledger/details/detail/selectRadio.vue
  18. 16 1
      src/components/ledger/handsontables/assets.vue
  19. 19 1
      src/components/ledger/handsontables/device.vue
  20. 81 54
      src/router/system.js
  21. 21 1
      src/utils/scan/tools.js
  22. 249 29
      src/views/ledger/cenotelist/cenoteDetail/index.vue
  23. 529 0
      src/views/ledger/facility/details/index.vue
  24. 3 3
      src/views/ledger/facility/index.vue
  25. 455 0
      src/views/ledger/property/details/index.vue
  26. 448 36
      src/views/ledger/spacelist/spaceDetail/index.vue
  27. 375 32
      src/views/ledger/system/systemDetail/index.vue

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 228 - 200
src/assets/style/iconfont/iconfont.css


BIN
src/assets/style/iconfont/iconfont.eot


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 118 - 97
src/assets/style/iconfont/iconfont.svg


BIN
src/assets/style/iconfont/iconfont.ttf


BIN
src/assets/style/iconfont/iconfont.woff


+ 110 - 0
src/components/ledger/details/detail/cruxDialog.vue

@@ -0,0 +1,110 @@
+<template>
+  <el-dialog title="关键信息点" :visible.sync="dialogFormVisible" class="crux-dialog">
+    <section v-for="(val,key,i) in checkList" :key="i">
+      <h4 class="base">{{key}}</h4>
+      <el-checkbox
+        v-for="(option,index) in val"
+        :key="option+index"
+        :label="option.InfoPointName"
+        v-model="option.KeyWord"
+      />
+    </section>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="dialogFormVisible = false">取 消</el-button>
+      <el-button type="primary" @click="save">保 存</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+  import {setDataDictionary} from "@/api/scan/request";
+
+  export default {
+    name: "cruxDialog",
+    props: ['crux', 'type'],
+    data() {
+      return {
+        dialogFormVisible: false,
+        checkList: {},
+        checkboxGroup: []
+      }
+    },
+    computed: {
+      allChecks() {
+        const tmp = [];
+        for (const key in this.checkList) {
+          if (this.checkList.hasOwnProperty(key)) {
+            const element = this.checkList[key];
+            tmp.push(...element);
+          }
+        }
+        return tmp;
+      }
+    },
+
+    watch: {
+      crux() {
+        this.changeList()
+      }
+    },
+    methods: {
+      changeList() {
+        const tmp = {};
+        for (let key in this.crux) {
+          if (this.crux.hasOwnProperty(key)) {
+            const element = this.crux[key];
+            tmp[key] = [
+              ...element.paths.map(i => ({
+                InfoPointCode: i.InfoPointCode,
+                KeyWord: i.KeyWord,
+                Type: this.type,
+                InfoPointName: i.InfoPointName
+              }))
+            ]
+          }
+        }
+        this.checkList = tmp;
+      },
+      dialogOpen() {
+        this.dialogFormVisible = true
+      },
+      save() {
+        let arrLenght = this.allChecks.filter(i => i.KeyWord)
+        if (arrLenght.length > 6) {
+          this.$message.info('不可超过6个')
+          return false
+        } else {
+          let param = this.allChecks.map(i => {
+            if (i.InfoPointName) {
+              delete i.InfoPointName
+            }
+            return {...i}
+          })
+
+          setDataDictionary(param, res => {
+            this.dialogFormVisible = false
+            this.$emit('cruxSuccess')
+            this.$message('保存成功')
+
+          });
+
+        }
+
+
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .crux-dialog {
+    .el-checkbox{
+      display: inline-block;
+      width: 20%;
+    }
+    /deep/ .el-dialog__body {
+      height: 420px;
+      overflow: auto;
+    }
+  }
+</style>

+ 141 - 0
src/components/ledger/details/detail/exhibitionBaseInformation.vue

@@ -0,0 +1,141 @@
+<template>
+<div class="exhibition-baseInformation">
+  <section v-for="(val,key,i) in exhibitionBaseInformation.information">
+    <h4 class="base">{{key || '信息'}}</h4>
+    <div v-for="(value,keys,index) in val.paths"
+         :class="{'w47':exhibitionBaseInformation.style == 2,'w30':exhibitionBaseInformation.style==3,
+'w22':exhibitionBaseInformation.style == 4}"
+         style="display: inline-block;margin-left: 20px">
+      <span> {{value.InfoPointName}}:</span>
+      <el-popover
+        v-if="value.Value && value.Value.length && value.Value.length>12 && value.Path=='EquipQRCode'"
+        placement="top"
+        width="360"
+        trigger="hover">
+        <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{value.InfoPointName}}</p>
+        <div style="overflow:hidden;">
+          <div style="float:left;width: 60%">
+            <img
+              style="width:200px;height:200px;"
+              :src="'/image-service/common/file_get/'+ value.Value +'?systemId=dataPlatform'"
+              alt="二维码"
+            >
+          </div>
+          <div style="float:right;width: 40%;margin-top: 30px">
+            <span>{{value.Value}}</span>
+          </div>
+        </div>
+        <div style="text-align: center; margin: 0">
+          <el-button type="text" size="mini" @click="handleCopy(value.Value)">复制</el-button>
+        </div>
+        <el-button slot="reference" type="text">{{value.Value ? '有' :'-'}}</el-button>
+      </el-popover>
+      <el-popover
+        v-else-if="Array.isArray(value.Value) && value.InputMode== 'F2'"
+        placement="top"
+        width="250"
+        trigger="hover">
+        <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{value.InfoPointName}}</p>
+        <div v-for="(pic,index) in value.Value">
+          <div>图纸名称:{{pic.Name}}
+              <el-button style="" type="text" size="mini" @click="downloadFile(pic.Key)">下载</el-button>
+          </div>
+        </div>
+        <el-button slot="reference" type="text">{{value.Value? '有':'-'}}</el-button>
+      </el-popover>
+      <el-popover
+        v-else-if="value.Value && value.Value.length && value.Value.length>12"
+        placement="top"
+        width="160"
+        trigger="hover">
+        <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{value.InfoPointName}}</p>
+        <p>{{value.Value}}</p>
+        <div style="text-align: center; margin: 0">
+          <el-button type="text" size="mini" @click="handleCopy(value.Value)">复制</el-button>
+        </div>
+        <el-button slot="reference" type="text">{{handleName(value.Value)}}</el-button>
+      </el-popover>
+      <el-popover
+        v-else-if="Array.isArray(value.Value) && value.InputMode=='N2'"
+        placement="top"
+        width="600"
+        trigger="hover">
+        <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{value.InfoPointName}}</p>
+        <p style="height: 300px;overflow: auto">{{value.Value}}</p>
+        <div style="text-align: center; margin: 0">
+          <el-button type="text" size="mini" @click="handleCopy(value.Value)">复制</el-button>
+        </div>
+        <el-button slot="reference" type="text">{{value.Value ? '有' :'-'}}</el-button>
+      </el-popover>
+      <span v-else>{{value.Value}}</span>
+    </div>
+  </section>
+</div>
+</template>
+
+<script>
+  export default {
+    name: "exhibition-baseInformation",
+    props: ['exhibitionBaseInformation'],
+    data() {
+      return {}
+    },
+    methods: {
+      downloadFile(key) {
+        window.open("/image-service/common/file_get/" + key + "?systemId=dataPlatform")
+
+      },
+      handleCopy(data) {
+        let oInput = document.createElement('input')
+        oInput.value = data
+        document.body.appendChild(oInput)
+        oInput.select()
+        document.execCommand('Copy')
+        this.$message.success('复制成功')
+        oInput.remove()
+      },
+      handleName(val) {
+        return val.length > 12 ? val.substring(0, 12) + '...' : val
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .exhibition-baseInformation {
+    section {
+      /*border: 1px solid #eeeeee;*/
+      /*margin: 10px;*/
+
+      .base {
+        margin: 10px;
+        font-weight: 600;
+        text-indent: 10px;
+        border-bottom: 1px dashed #eee;
+      }
+
+      /deep/ .el-button--text {
+        color: #555 !important;
+        font-size: 14px;
+      }
+    }
+
+    .ml-10 {
+      margin-left: 10px;
+      text-indent: 10px;
+    }
+
+    .w47 {
+      width: 47%;
+    }
+
+
+    .w30 {
+      width: 30%;
+    }
+
+    .w22 {
+      width: 22%;
+    }
+  }
+</style>

+ 120 - 0
src/components/ledger/details/detail/exhibitionCrux.vue

@@ -0,0 +1,120 @@
+<template>
+  <section class="exhibition-crux">
+    <p class="title">{{exhibitionCrux.title}}
+      <span class="icon-shezhi iconfont setting" @click="setting"></span></p>
+    <div>
+      <div v-if="exhibitionCrux.cruxArray.length">
+        <div class="crux-list" v-for="(item,index) in exhibitionCrux.cruxArray" :key="index">{{item.InfoPointName}}:
+
+        <el-popover
+          v-if="item.value && item.value.length && item.value.length>12 && item.Path=='EquipQRCode'"
+          placement="top"
+          width="360"
+          trigger="hover">
+          <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{item.InfoPointName}}</p>
+          <div style="overflow:hidden;">
+            <div style="float:left;width: 60%">
+              <img
+                style="width:200px;height:200px;"
+                :src="'/image-service/common/file_get/'+ item.value +'?systemId=dataPlatform'"
+                alt="二维码"
+              >
+            </div>
+            <div style="float:right;width: 40%;margin-top: 30px">
+              <span>{{item.value}}</span>
+            </div>
+          </div>
+
+          <div style="text-align: center; margin: 0">
+            <el-button type="text" size="mini" @click="handleCopy(item.value)">复制</el-button>
+          </div>
+          <el-button slot="reference" type="text">{{item.value ? '有' :'-'}}</el-button>
+        </el-popover>
+        <el-popover
+          v-else-if="item.value && item.value.length && item.value.length>12"
+          placement="top"
+          width="160"
+          trigger="hover">
+          <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{item.InfoPointName}}</p>
+          <p>{{item.value}}</p>
+          <div style="text-align: center; margin: 0">
+            <el-button type="text" size="mini" @click="handleCopy(item.value)">复制</el-button>
+          </div>
+          <el-button slot="reference" type="text">{{handleName(item.value)}}</el-button>
+        </el-popover>
+        <span v-else>{{item.value}}</span>
+        </div>
+      </div>
+      <div style="text-align: center" v-else>暂无数据</div>
+    </div>
+    <cruxDialog
+      ref="setting"
+      :crux="exhibitionCrux.allMessage"
+      :type="type"
+      @cruxSuccess="cruxSuccess"
+
+    />
+  </section>
+</template>
+
+<script>
+  import cruxDialog from "./cruxDialog";
+
+  export default {
+    name: "exhibition-crux",
+    props: ['exhibitionCrux','type'],
+    components: {cruxDialog},
+    data() {
+      return {
+        list: []
+      }
+    },
+    methods: {
+      setting() {
+        this.$refs.setting.dialogOpen()
+      },
+      cruxSuccess() {
+        this.$emit('cruxSuccess')
+      },
+      handleCopy(data) {
+        let oInput = document.createElement('input')
+        oInput.value = data
+        document.body.appendChild(oInput)
+        oInput.select()
+        document.execCommand('Copy')
+        this.$message.success('复制成功')
+        oInput.remove()
+      },
+      handleName(val) {
+        return val.length > 12 ? val.substring(0, 12) + '...' : val
+      }
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+  .exhibition-crux {
+    /deep/ .el-button--text {
+      color: #555 !important;
+      font-size: 14px;
+    }
+    .title {
+      border-left: 8px solid black;
+      margin: 10px 40px 0 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      display: block;
+      overflow: hidden;
+
+      .setting {
+        float: right;
+      }
+
+    }
+      .crux-list {
+        display: inline-block;
+        width: 25%;
+        margin-left: 28px;
+      }
+  }
+</style>

+ 56 - 0
src/components/ledger/details/detail/exhibitionEnergy.vue

@@ -0,0 +1,56 @@
+<template>
+  <div class="exhibition-energy">
+    <div class="title">
+      <section>
+        <h4 class="base">{{exhibitionEnergy.title}}</h4>
+        <div v-if="exhibitionEnergy.dynamic.length">
+          <div v-for="(item,index) in exhibitionEnergy.dynamic" :key="index" class="table-dynamic">
+            <div class="table-title">{{item.InfoPointName}}:</div>
+            <div>
+              <p>表号功能号 {{item.value}}</p>
+              <p>{{item.data ? item.data :item.error}} {{item.Unit}}</p>
+              <p>{{formatDate(item.receivetime)}}</p>
+            </div>
+          </div>
+        </div>
+        <div v-else style="text-align: center">暂无数据</div>
+      </section>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "exhibitionEnergy",
+    props: ['exhibitionEnergy'],
+    methods:{
+      formatDate(str) {
+        return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .exhibition-energy {
+    .base {
+      margin: 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      border-bottom: 1px dashed #eee;
+    }
+
+    .table-dynamic {
+      height: 85px;
+      width: 100%;
+      margin: 5px 5px 5px 20px;
+    }
+
+    .table-title {
+      float: left;
+      max-width: 200px;
+      width: 100px;
+      height: 85px;
+    }
+  }
+</style>

+ 36 - 0
src/components/ledger/details/detail/exhibitionFile.vue

@@ -0,0 +1,36 @@
+<template>
+  <div class="exhibition-file">
+    <p class="title">
+      <span class=" iconfont icon-fujian"></span>
+      {{exhibitionFile.title}}</p>
+    <div>
+      <lookFile :exhibitionFile="exhibitionFile"/>
+    </div>
+
+  </div>
+</template>
+
+<script>
+  import lookFile from "./lookFile";
+    export default {
+      name: "exhibition-file",
+      props: ['exhibitionFile'],
+      data() {return{}},
+      components:{lookFile}
+    }
+</script>
+
+<style scoped lang="less">
+  .exhibition-file {
+    border: 1px solid #eeeeee;
+    background: #FFFFFF;
+    margin-bottom: 10px;
+
+    .title {
+      border-bottom: 1px solid #eee;
+      padding: 10px 0;
+      font-weight: 600;
+      text-indent: 10px;
+    }
+  }
+</style>

+ 51 - 0
src/components/ledger/details/detail/exhibitionImage.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="exhibition-image">
+    <p class="title">
+      <span class=" icon-floorplan iconfont"></span>
+      {{exhibitionImage.title}}</p>
+    <div class="image">
+      <lookImage  :exhibitionImage="exhibitionImage"/>
+    </div>
+
+  </div>
+</template>
+
+<script>
+  import lookImage from "./lookImage";
+  export default {
+    name: "exhibition-image",
+    props: ['exhibitionImage'],
+    components:{lookImage},
+    data() {
+      return {
+
+      }
+    },
+    methods:{
+      deepcopy(obj) {
+        return JSON.parse(JSON.stringify(obj));
+      },
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+  .exhibition-image {
+    border: 1px solid #eeeeee;
+    background: #fff;
+    margin-bottom: 10px;
+    .title {
+      border-bottom: 1px solid #eee;
+      padding: 10px 0;
+      font-weight: 600;
+      text-indent: 10px;
+    }
+
+    .image {
+      margin: 10px;
+      /*text-align: center;*/
+    }
+
+  }
+
+</style>

+ 26 - 0
src/components/ledger/details/detail/exhibitionMaintain.vue

@@ -0,0 +1,26 @@
+<template>
+  <div class="exhibition-maintain">
+    <p class="title">
+      <span class=" iconfont icon-weixiubeijing"></span>
+      {{exhibitionMaintain.title}}
+      <span class="iconfont icon-right" style="float: right;margin-right: 20px"></span></p>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "exhibitionMaintain",
+    props: ['exhibitionMaintain']
+  }
+</script>
+
+<style scoped lang="less">
+  .exhibition-maintain {
+
+    .title {
+      margin-left: 10px;
+      font-weight: 600;
+      text-indent: 10px;
+    }
+  }
+</style>

+ 51 - 0
src/components/ledger/details/detail/exhibitionVideo.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="exhibition-video">
+    <p class="title">
+      <span class=" icon-shipin-tianchong iconfont"></span>
+      {{exhibitionVideo.title}}</p>
+    <div class="image">
+      <lookVideo  :exhibitionVideo="exhibitionVideo"/>
+    </div>
+
+  </div>
+</template>
+
+<script>
+  import lookVideo from "./lookVideo";
+  export default {
+    name: "exhibition-video",
+    props: ['exhibitionVideo'],
+    components:{lookVideo},
+    data() {
+      return {
+
+      }
+    },
+    methods:{
+      deepcopy(obj) {
+        return JSON.parse(JSON.stringify(obj));
+      },
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+  .exhibition-video {
+    border: 1px solid #eeeeee;
+    background: #fff;
+    margin-bottom: 10px;
+    .title {
+      border-bottom: 1px solid #eee;
+      padding: 10px 0;
+      font-weight: 600;
+      text-indent: 10px;
+    }
+
+    .image {
+      margin: 10px;
+      /*text-align: center;*/
+    }
+
+  }
+
+</style>

+ 209 - 0
src/components/ledger/details/detail/lookFile.vue

@@ -0,0 +1,209 @@
+<template>
+  <div class="exhibition-file">
+    <div v-if="Object.keys(exhibitionFile.list).length">
+      <div v-for="(val,key,i) in exhibitionFile.list" :key="i">
+        <div class="" v-for="(j,index) in val">
+          <p class="title">{{key}}</p>
+          <div v-if="j.fileList !=undefined && j.fileList.length">
+            <div v-for="(item,index) in j.fileList" class="content">
+              <!--          图标-->
+              <div class="file-box" >
+                <div class="file-box-left ">
+                  <div class="file-box-left-content ">
+                    <span class="iconfont icon-Excel excel fs20"></span>
+                  </div>
+                </div>
+                <div class="file-box-center">
+                  <p style="margin-top: 20px"> {{delFile(item.Name)}}</p>
+                  <p> {{delFile(item.CreateTime)}}</p>
+                </div>
+                <div class="file-box-right ">
+                  <span
+                    style="height: 88px;"
+                    class="iconfont icon-download1 df fs20"
+                    @click="download(item.Key)"/>
+                </div>
+              </div>
+
+            </div>
+
+          </div>
+          <div v-else style="text-align: center;margin: 10px auto">暂无数据</div>
+        </div>
+      </div>
+    </div>
+    <div v-else style="text-align: center;margin: 10px auto">暂无数据</div>
+  </div>
+</template>
+
+<script>
+
+  export default {
+    props: ['exhibitionFile'],
+    data() {
+      return {};
+    },
+    created() {
+    },
+    methods: {
+
+      //处理地址
+      delFile(name) {
+        return name.length > 20 ? name.substring(0, 20) + "..." : name
+      },
+      //点击下载
+      download(key) {
+        console.log(key)
+        window.open("/image-service/common/file_get/" + key + "?systemId=dataPlatform")
+      },
+
+      //删除图片
+      deleteFile(i, key) {
+        this.filesArr.splice(i, 1);
+        this.$emit("change", this.filesArr, this.defined);
+      },
+
+      //上传
+      uploadAndSubmit(item) {
+        // var form = document.forms["demoForm"];
+
+        // if (form["file"].files.length > 0) {
+        // 寻找表单域中的 <input type="file" ... /> 标签
+        // var file = form["file"].files[0];
+
+        let file = item.file;
+        // try sending
+        let reader = new FileReader();
+
+        let vm = this;
+
+        let fileType = file.name.split(".");
+        let type = fileType[fileType.length - 1];
+        let key = "&key=" + fileType[0] + file.uid + "." + type
+        let CreateTime = tools.formatDate(new Date(file.lastModified))
+        reader.onloadstart = function () {
+          // 这个事件在读取开始时触发
+        };
+        reader.onprogress = function (p) {
+          // 这个事件在读取进行中定时触发
+        };
+
+        reader.onload = function () {
+          // 这个事件在读取成功结束后触发
+        };
+        reader.onloadend = function () {
+          // 这个事件在读取结束后,无论成功或者失败都会触发
+          if (reader.error) {
+          } else {
+            // document.getElementById("bytesRead").textContent = file.size;
+            // 构造 XMLHttpRequest 对象,发送文件 Binary 数据
+            var xhr = new XMLHttpRequest();
+            xhr.open(
+              /* method */
+              "POST",
+              /* target url */
+              "/image-service/common/file_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&overwrite=true" + key
+              /*, async, default to true */
+            );
+            //xhr.overrideMimeType("application/octet-stream");
+            xhr.send(reader.result);
+            xhr.onreadystatechange = function () {
+              if (xhr.readyState == 4) {
+                console.log(xhr)
+                if (xhr.status == 200) {
+                  let fileObject = {
+                    Key: key.split("=")[1],
+                    Type: type,
+                    Name: file.name,
+                    CreateTime,
+                    SystemId: 'dataPlatform'
+                  }
+                  vm.filesArr.push(fileObject);
+                  vm.$emit("change", vm.filesArr, vm.defined);
+                } else {
+                  this.$message.error(res.data.ResultMsg)
+                }
+              }
+            };
+          }
+        };
+        reader.readAsArrayBuffer(file);
+      }
+    },
+
+  };
+</script>
+
+<style lang="less" scoped>
+  .exhibition-file {
+    .title {
+      border-left: 8px solid black;
+      margin: 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      display: block;
+      overflow: hidden;
+    }
+
+    .df {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+
+    .file-box {
+      border: 1px solid #eee;
+   margin: 10px;
+      height: 88px;
+
+      .file-box-left {
+        display: inline-block;
+        width: 20%;
+        height: 100%;
+        overflow: hidden;
+        text-align: center;
+
+        .file-box-left-content {
+          background: #eeeeee;
+          width: 50px;
+          height: 50px;
+          margin: 20px 14px;
+          .excel{
+            display: block;
+            padding-top: 5px;
+          }
+        }
+      }
+
+      .file-box-center {
+        display: inline-block;
+        width: 58%;
+        height: 100%;
+        overflow: hidden;
+        text-align: center;
+      }
+
+      .file-box-right {
+        display: inline-block;
+        width: 19%;
+        height: 100%;
+        overflow: hidden;
+      }
+    }
+
+
+    .df {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+    }
+
+    .fs20 {
+      font-size: 20px;
+    }
+
+    .list-name {
+      text-align: center;
+    }
+  }
+</style>

+ 297 - 0
src/components/ledger/details/detail/lookImage.vue

@@ -0,0 +1,297 @@
+<template>
+  <div id="sagaUploads">
+    <div class="saga-upload-images">
+      <div v-if="Object.keys(exhibitionImage.list).length">
+        <div v-for="(val,key,i) in exhibitionImage.list" :key="i">
+          <div class="point-view" v-for="(j,index) in val">
+            <p class="title">{{key}}</p>
+            <div v-if="j.PicList !=undefined && j.PicList.length >0">
+              <template v-for="item in j.PicList">
+                <div class="point-image">
+                  <img @click="lookImg" :src="imageGetUrl + '&key=' +item.Key" alt v-load style="margin-bottom: 5px">
+                  <p class="pic-name">{{handleName(item.Name)}}</p>
+                </div>
+              </template>
+            </div>
+            <div v-else style="text-align: center;margin: 10px auto">暂无数据</div>
+          </div>
+        </div>
+      </div>
+      <div style="text-align: center" v-else>暂无数据</div>
+    </div>
+    <details-dialog :title="'图片'" :iframeSrc="iframeSrc" :dialog="dialog" :setData="imagesArr"></details-dialog>
+  </div>
+</template>
+<script>
+  import detailsDialog from "@/components/business_space/lib/detailsDia"
+
+  export default {
+    components: {
+      detailsDialog
+    },
+    props: ['exhibitionImage'],
+    data() {
+      return {
+        baseUrl: "",
+        imageGetUrl: "/image-service/common/image_get?systemId=dataPlatform",
+        imageUploadUrl: "/image-service/common/image_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&overwrite=true",
+        imagesArr: [],
+        iframeSrc: "",
+        dialog: {
+          details: false
+        }
+      };
+    },
+    methods: {
+      handleName(val) {
+        return val && val.length > 12 ? val.substr(1, 12) + '...' : val
+      },
+      //查看图片
+      lookImg() {
+        this.dialog.details = true
+        this.iframeSrc = process.env.BASE_URL + ":8890/photo-View.html"
+      },
+
+      //上传
+      uploadAndSubmit(item, key) {
+        // var form = document.forms["demoForm"];
+
+        // if (form["file"].files.length > 0) {
+        // 寻找表单域中的 <input type="file" ... /> 标签
+        // var file = form["file"].files[0];
+
+        console.log("lalala", item)
+        let file = item.file;
+        // try sending
+        let reader = new FileReader();
+
+        let vm = this;
+
+        let fileType = file.name.split(".");
+        let type = fileType[fileType.length - 1];
+        let CreateTime = tools.formatDate(new Date(file.lastModified))
+
+        let uploadKey = file.uid
+        if (!!key) {
+          uploadKey = key
+        }
+
+        reader.onloadstart = function () {
+          // 这个事件在读取开始时触发
+        };
+        reader.onprogress = function (p) {
+          // 这个事件在读取进行中定时触发
+        };
+
+        reader.onload = function () {
+          // 这个事件在读取成功结束后触发
+        };
+        reader.onloadend = function () {
+          // 这个事件在读取结束后,无论成功或者失败都会触发
+          if (reader.error) {
+          } else {
+            // document.getElementById("bytesRead").textContent = file.size;
+            // 构造 XMLHttpRequest 对象,发送文件 Binary 数据
+            var xhr = new XMLHttpRequest();
+            xhr.open(
+              /* method */
+              "POST",
+              /* target url */
+              vm.imageUploadUrl + "&key=" + uploadKey + "." + type
+              /*, async, default to true */
+            );
+            //xhr.overrideMimeType("application/octet-stream");
+            xhr.send(reader.result);
+            xhr.onreadystatechange = function () {
+              if (xhr.readyState == 4) {
+                if (xhr.status == 200) {
+                  if (vm.type == 'image') {
+                    vm.imagesArr.push({
+                      Name: uploadKey + '',
+                      Key: uploadKey + "." + type,
+                      SystemId: "dataPlatform",
+                      Type: "image",
+                      CreateTime
+                    });
+                  }
+                  if (type == 'mp4') {
+                    vm.imagesArr.push({
+                      Name: uploadKey + '',
+                      Key: uploadKey + "." + type,
+                      SystemId: "dataPlatform",
+                      Type: "video",
+                      CreateTime
+                    });
+                    vm.creatImg(vm.imageGetUrl + "&key=" + uploadKey + "." + type, uploadKey)
+                  }
+                  if (vm.type == "video" && type == "png") {
+                    vm.videoPicArr.push({
+                      Name: uploadKey + '',
+                      Key: uploadKey + "." + type,
+                      SystemId: "dataPlatform",
+                      Type: "image_video",
+                      CreateTime
+                    })
+                  }
+                  vm.$emit("change", vm.imagesArr, vm.defined, vm.videoPicArr);
+                }
+              }
+            };
+          }
+        };
+        reader.readAsArrayBuffer(file);
+      },
+      dataURLtoBlob(dataURI, type) {
+        var binary = atob(dataURI.split(',')[1]);
+        var array = [];
+        for (var i = 0; i < binary.length; i++) {
+          array.push(binary.charCodeAt(i));
+        }
+        return new Blob([new Uint8Array(array)], { type: type });
+      },
+
+      creatImg(reader, key) {
+        var videoDom = document.getElementById('video');
+        videoDom.src = reader;
+        let vm = this
+        videoDom.onloadeddata = function () {
+          // 这里可以打印视频时长
+          // 这里取得视频封面
+          var canvas = document.createElement('canvas');
+          canvas.width = 300;
+          canvas.height = 300 * this.videoHeight / this.videoWidth;
+          canvas.getContext('2d').drawImage(this, 0, 0, canvas.width, canvas.height);
+          //将canvas的base64位图片转换成图片png的file
+          var blob = vm.dataURLtoBlob(canvas.toDataURL('image/png'), "image/png")
+          //将其转换成file对象
+          var file = new File([blob], "video_image.png", { type: "image/png", lastModified: Date.now() })//blob转file
+          vm.uploadAndSubmit({ file: file }, key)
+        }
+      },
+    },
+    watch: {
+      keysArr: function (val) {
+        this.imageFalg();
+      }
+    },
+    //自定义指令
+    directives: {
+      load: function (el) {
+        let imgDom = document.createElement("img");
+        imgDom.style.position = "absolute";
+        imgDom.style.top = "-999px";
+        imgDom.style.opacity = 0;
+        imgDom.src = el.src;
+        el.src = "";
+        imgDom.onload = () => {
+          let width = imgDom.width;
+          let height = imgDom.height;
+          if (width > height) {
+            el.style.height = "100%";
+            el.style.width = "auto";
+            el.style.position = "absolute";
+            el.style.left = "50%";
+            el.style.top = "0";
+            el.style.transform = "translateX(-50%)";
+            el.style.webkitTransform = "translateX(-50%) translateY(0)";
+            el.style.MozTransform = "translateX(-50%) translateY(0)";
+            el.style.msTransform = "translateX(-50%) translateY(0)";
+            el.style.OTransform = "translateX(-50%) translateY(0)";
+          } else if (width < height) {
+            el.src = imgDom.src;
+            el.style.width = "100%";
+            el.style.height = "auto";
+            el.style.position = "absolute";
+            el.style.top = "50%";
+            el.style.left = "0";
+            el.style.transform = "translateY(-50%) translateX(0)";
+            el.style.webkitTransform = "translateY(-50%) translateX(0)";
+            el.style.MozTransform = "translateY(-50%) translateX(0)";
+            el.style.msTransform = "translateY(-50%) translateX(0)";
+            el.style.OTransform = "translateY(-50%) translateX(0)";
+          } else {
+            el.style.width = "100%";
+            el.style.height = "100%";
+            el.style.position = "absolute";
+            el.style.top = "0";
+            el.style.left = "0";
+            el.style.transform = "translateY(0) translateX(0)";
+            el.style.webkitTransform = "translateY(0) translateX(0)";
+            el.style.MozTransform = "translateY(0) translateX(0)";
+            el.style.msTransform = "translateY(0) translateX(0)";
+            el.style.OTransform = "translateY(0) translateX(0)";
+          }
+          el.src = imgDom.src;
+        };
+      }
+    }
+  };
+</script>
+<style lang="less">
+  #sagaUploads {
+    overflow: hidden;
+
+    .title {
+      border-left: 8px solid black;
+      margin: 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      display: block;
+      overflow: hidden;
+    }
+
+    .avatar-uploader {
+      height: 180px;
+      width: 180px;
+      overflow: hidden;
+
+      .el-upload {
+        width: 180px;
+        height: 180px;
+
+        .el-upload-dragger {
+          width: 180px;
+          height: 180px;
+          .el-icon-plus {
+            display: block;
+            width: 20px;
+            height: 20px;
+            font-size: 20px;
+            margin: 80px;
+          }
+        }
+      }
+    }
+    .point-view {
+      .pic-name {
+        position: absolute;
+        right: 72px;
+        display: inline-block;
+        background: #fff;
+        color: #000;
+        padding: 3px;
+        z-index: 99;
+        border-radius: 8px;
+        bottom: 5px;
+      }
+    }
+    .point-image {
+      height: 180px;
+      margin-bottom: 10px;
+      position: relative;
+      overflow: hidden;
+      img {
+        z-index: 11;
+      }
+      i {
+        position: absolute;
+        bottom: 10px;
+        right: 10px;
+        background-color: #fff;
+        padding: 5px;
+        cursor: pointer;
+        z-index: 66;
+      }
+    }
+  }
+</style>

+ 297 - 0
src/components/ledger/details/detail/lookVideo.vue

@@ -0,0 +1,297 @@
+<template>
+  <div id="sagaUploads">
+    <div class="saga-upload-images">
+      <div v-if="Object.keys(exhibitionVideo.list).length">
+        <div v-for="(val,key,i) in exhibitionVideo.list" :key="i">
+          <div class="point-view" v-for="(j,index) in val">
+            <p class="title">{{key}}</p>
+            <div v-if="j.PicList !=undefined && j.PicList.length">
+              <template v-for="(item,index) in j.PicList">
+                <div class="point-image">
+                  <video
+                    width="100%"
+                    height="100%;"
+                    :src="imageGetUrl + '&key=' +item.Key"
+                    controls="controls"
+                  >您的浏览器不支持 video 标签。</video>
+                </div>
+              </template>
+            </div>
+            <div v-else style="text-align: center;margin: 10px auto">暂无数据</div>
+          </div>
+        </div>
+      </div>
+      <div style="text-align: center" v-else>暂无数据</div>
+    </div>
+    <details-dialog :title="'图片'" :iframeSrc="iframeSrc" :dialog="dialog" :setData="imagesArr"></details-dialog>
+  </div>
+</template>
+<script>
+  import detailsDialog from "@/components/business_space/lib/detailsDia"
+
+  export default {
+    components: {
+      detailsDialog
+    },
+    props: ['exhibitionVideo'],
+    data() {
+      return {
+        baseUrl: "",
+        imageGetUrl: "/image-service/common/image_get?systemId=dataPlatform",
+        imageUploadUrl: "/image-service/common/image_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&overwrite=true",
+        imagesArr: [],
+        iframeSrc: "",
+        dialog: {
+          details: false
+        }
+      };
+    },
+    methods: {
+      //查看图片
+      lookImg() {
+        this.dialog.details = true
+        this.iframeSrc = process.env.BASE_URL + ":8890/photo-View.html"
+      },
+
+      //上传
+      uploadAndSubmit(item, key) {
+        // var form = document.forms["demoForm"];
+
+        // if (form["file"].files.length > 0) {
+        // 寻找表单域中的 <input type="file" ... /> 标签
+        // var file = form["file"].files[0];
+
+        console.log("lalala", item)
+        let file = item.file;
+        // try sending
+        let reader = new FileReader();
+
+        let vm = this;
+
+        let fileType = file.name.split(".");
+        let type = fileType[fileType.length - 1];
+        let CreateTime = tools.formatDate(new Date(file.lastModified))
+
+        let uploadKey = file.uid
+        if (!!key) {
+          uploadKey = key
+        }
+
+        reader.onloadstart = function () {
+          // 这个事件在读取开始时触发
+        };
+        reader.onprogress = function (p) {
+          // 这个事件在读取进行中定时触发
+        };
+
+        reader.onload = function () {
+          // 这个事件在读取成功结束后触发
+        };
+        reader.onloadend = function () {
+          // 这个事件在读取结束后,无论成功或者失败都会触发
+          if (reader.error) {
+          } else {
+            // document.getElementById("bytesRead").textContent = file.size;
+            // 构造 XMLHttpRequest 对象,发送文件 Binary 数据
+            var xhr = new XMLHttpRequest();
+            xhr.open(
+              /* method */
+              "POST",
+              /* target url */
+              vm.imageUploadUrl + "&key=" + uploadKey + "." + type
+              /*, async, default to true */
+            );
+            //xhr.overrideMimeType("application/octet-stream");
+            xhr.send(reader.result);
+            xhr.onreadystatechange = function () {
+              if (xhr.readyState == 4) {
+                if (xhr.status == 200) {
+                  if (vm.type == 'image') {
+                    vm.imagesArr.push({
+                      Name: uploadKey + '',
+                      Key: uploadKey + "." + type,
+                      SystemId: "dataPlatform",
+                      Type: "image",
+                      CreateTime
+                    });
+                  }
+                  if (type == 'mp4') {
+                    vm.imagesArr.push({
+                      Name: uploadKey + '',
+                      Key: uploadKey + "." + type,
+                      SystemId: "dataPlatform",
+                      Type: "video",
+                      CreateTime
+                    });
+                    vm.creatImg(vm.imageGetUrl + "&key=" + uploadKey + "." + type, uploadKey)
+                  }
+                  if (vm.type == "video" && type == "png") {
+                    vm.videoPicArr.push({
+                      Name: uploadKey + '',
+                      Key: uploadKey + "." + type,
+                      SystemId: "dataPlatform",
+                      Type: "image_video",
+                      CreateTime
+                    })
+                  }
+                  vm.$emit("change", vm.imagesArr, vm.defined, vm.videoPicArr);
+                }
+              }
+            };
+          }
+        };
+        reader.readAsArrayBuffer(file);
+      },
+      dataURLtoBlob(dataURI, type) {
+        var binary = atob(dataURI.split(',')[1]);
+        var array = [];
+        for (var i = 0; i < binary.length; i++) {
+          array.push(binary.charCodeAt(i));
+        }
+        return new Blob([new Uint8Array(array)], { type: type });
+      },
+
+      creatImg(reader, key) {
+        var videoDom = document.getElementById('video');
+        videoDom.src = reader;
+        let vm = this
+        videoDom.onloadeddata = function () {
+          // 这里可以打印视频时长
+          // 这里取得视频封面
+          var canvas = document.createElement('canvas');
+          canvas.width = 300;
+          canvas.height = 300 * this.videoHeight / this.videoWidth;
+          canvas.getContext('2d').drawImage(this, 0, 0, canvas.width, canvas.height);
+          //将canvas的base64位图片转换成图片png的file
+          var blob = vm.dataURLtoBlob(canvas.toDataURL('image/png'), "image/png")
+          //将其转换成file对象
+          var file = new File([blob], "video_image.png", { type: "image/png", lastModified: Date.now() })//blob转file
+          vm.uploadAndSubmit({ file: file }, key)
+        }
+      },
+    },
+    watch: {
+      keysArr: function (val) {
+        this.imageFalg();
+      }
+    },
+    //自定义指令
+    directives: {
+      load: function (el) {
+        let imgDom = document.createElement("img");
+        imgDom.style.position = "absolute";
+        imgDom.style.top = "-999px";
+        imgDom.style.opacity = 0;
+        imgDom.src = el.src;
+        el.src = "";
+        imgDom.onload = () => {
+          let width = imgDom.width;
+          let height = imgDom.height;
+          if (width > height) {
+            el.style.height = "100%";
+            el.style.width = "auto";
+            el.style.position = "absolute";
+            el.style.left = "50%";
+            el.style.top = "0";
+            el.style.transform = "translateX(-50%)";
+            el.style.webkitTransform = "translateX(-50%) translateY(0)";
+            el.style.MozTransform = "translateX(-50%) translateY(0)";
+            el.style.msTransform = "translateX(-50%) translateY(0)";
+            el.style.OTransform = "translateX(-50%) translateY(0)";
+          } else if (width < height) {
+            el.src = imgDom.src;
+            el.style.width = "100%";
+            el.style.height = "auto";
+            el.style.position = "absolute";
+            el.style.top = "50%";
+            el.style.left = "0";
+            el.style.transform = "translateY(-50%) translateX(0)";
+            el.style.webkitTransform = "translateY(-50%) translateX(0)";
+            el.style.MozTransform = "translateY(-50%) translateX(0)";
+            el.style.msTransform = "translateY(-50%) translateX(0)";
+            el.style.OTransform = "translateY(-50%) translateX(0)";
+          } else {
+            el.style.width = "100%";
+            el.style.height = "100%";
+            el.style.position = "absolute";
+            el.style.top = "0";
+            el.style.left = "0";
+            el.style.transform = "translateY(0) translateX(0)";
+            el.style.webkitTransform = "translateY(0) translateX(0)";
+            el.style.MozTransform = "translateY(0) translateX(0)";
+            el.style.msTransform = "translateY(0) translateX(0)";
+            el.style.OTransform = "translateY(0) translateX(0)";
+          }
+          el.src = imgDom.src;
+        };
+      }
+    }
+  };
+</script>
+<style lang="less">
+  #sagaUploads {
+    overflow: hidden;
+
+    .title {
+      border-left: 8px solid black;
+      margin: 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      display: block;
+      overflow: hidden;
+    }
+
+    .avatar-uploader {
+      height: 180px;
+      width: 180px;
+      overflow: hidden;
+
+      .el-upload {
+        width: 180px;
+        height: 180px;
+
+        .el-upload-dragger {
+          width: 180px;
+          height: 180px;
+          .el-icon-plus {
+            display: block;
+            width: 20px;
+            height: 20px;
+            font-size: 20px;
+            margin: 80px;
+          }
+        }
+      }
+    }
+    .point-view {
+      .pic-name {
+        position: absolute;
+        right: 72px;
+        display: inline-block;
+        background: #fff;
+        color: #000;
+        padding: 3px;
+        z-index: 99;
+        border-radius: 8px;
+        bottom: 5px;
+      }
+    }
+    .point-image {
+      height: 180px;
+      position: relative;
+      overflow: hidden;
+      img {
+        z-index: 11;
+      }
+      i {
+        position: absolute;
+        bottom: 10px;
+        right: 10px;
+        background-color: #fff;
+        padding: 5px;
+        cursor: pointer;
+        z-index: 66;
+      }
+    }
+  }
+</style>

+ 46 - 0
src/components/ledger/details/detail/selectRadio.vue

@@ -0,0 +1,46 @@
+<template>
+  <div class="select-radio">
+    <p class="title">{{selectRadio.information}}</p>
+    <template>
+      <el-radio-group
+        style=" margin: 0 10px;"
+        v-model="selectRadio.initRadio"
+        @change="changeRadio"
+        v-for="(item,index) in selectRadio.radioList"
+        :key="index"
+      >
+        <el-radio :label="item.label">{{item.value}}</el-radio>
+      </el-radio-group>
+    </template>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "selectRadio",
+    props: ['selectRadio'],
+    data() {
+      return {
+        radio: '1'
+      };
+    },
+    methods: {
+      changeRadio(val) {
+        this.$emit('changeRadio', val)
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .select-radio {
+    .title {
+      border-left: 8px solid black;
+      margin: 10px 40px 10px 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      display: inline-block;
+
+    }
+  }
+</style>

+ 16 - 1
src/components/ledger/handsontables/assets.vue

@@ -751,7 +751,22 @@
           //操作
           case 'caozuo':
             // window.open(`http://adm.sagacloud.cn:8058/spread?id=${infos.EquipID}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
-            this.$message("开发中...")
+            // this.$message("开发中...")
+            this.$router.push({
+              path: "propertyDetails",
+              query: {
+                type: this.mess.deviceId,
+                equipId: infos.EquipID,
+                equipName: infos.EquipLocalName?infos.EquipLocalName:infos.EquipName?infos.EquipName:'',
+                equipCode: infos.EquipLocalID?infos.EquipLocalID:'',
+                data: this.tableData.map(item => {
+                  return {
+                    value: item.EquipID,
+                    label: item.EquipLocalName?item.EquipLocalName:item.EquipName?item.EquipName:''
+                  }
+                })
+              }
+            })
             return false
           //资产二维码图片
           case 'EquipQRCode':

+ 19 - 1
src/components/ledger/handsontables/device.vue

@@ -420,6 +420,7 @@
             if (this.tableData && this.tableData.length) {
               if (this.onlyRead) {
                 this.getBatch(this.tableData)
+
               }
               this.initTable();
             }
@@ -485,6 +486,7 @@
             criterias: []
           }
         }
+
         //一级遍历list
         this.tableHeader.map(head => {
           //如果一级标签为动态参数或者设定参数放入数据等待请求
@@ -507,6 +509,7 @@
         })
         if (param.data.criterias.length) {
           BeatchQueryParam(param, res => {
+
             if (!this.onlyRead) {
               return false
             }
@@ -940,7 +943,22 @@
                 //操作
                 case 'caozuo':
                     // window.open(`http://adm.sagacloud.cn:8058/spread?id=${infos.EquipID}&pid=${this.projectId}&secret=${this.secret}`,"_blank")
-                    this.$message("开发中...")
+                    // this.$message("开发中...")
+                    this.$router.push({
+                      path: "deviceDetails",
+                      query: {
+                        type: this.mess.deviceId,
+                        equipId: infos.EquipID,
+                        equipName: infos.EquipLocalName?infos.EquipLocalName:infos.EquipName?infos.EquipName:'',
+                        equipCode: infos.EquipLocalID?infos.EquipLocalID:'',
+                        data: this.tableData.map(item => {
+                          return {
+                            value: item.EquipID,
+                            label: item.EquipLocalName?item.EquipLocalName:item.EquipName?item.EquipName:''
+                          }
+                        })
+                      }
+                    })
                     return false
                 //设备二维码图片
                 case 'EquipQRCode':

+ 81 - 54
src/router/system.js

@@ -1,30 +1,20 @@
 import LayoutMain from '@/framework/layout/Main'
 import MsgAllDetails from "@/framework/components/messagesever/msgAllDetails"
-
-import Login from '@/framework/layout/Login'
 import Dasboard from '@/views/dasboard'
-
-import UserList from '@/views/system/user/UserList'
-import RoleList from '@/views/system/role/RoleList'
-import ChangePwd from '@/views/system/pwd/ChangePwd'
-
 /**项目管理 */
 import projectAdm from '@/views/platfrom/project'
 import userAdm from '@/views/platfrom/user'
 import roleAdm from '@/views/platfrom/role'
-
 /**前期准备 */
 import buildFloor from '@/views/ready/buildfloor'
 import collectsetting from '@/views/ready/collectsetting'
 import buildUser from '@/views/ready/appuser'
 import repetitionGraphy from '@/views/ready/buildfloor/repetitionGraphy'
-
 /**模型管理 */
 import modelFile from '@/views/model/file'
 import modelReport from '@/views/model/report'
 import deleted from '@/views/model/report/deleted'
 import supplement from '@/views/model/report/supplement'
-
 /**系统集成 */
 import pointConfig from '@/views/point/config_point'
 import editDataSouce from '@/views/point/config_point/edit_origin'
@@ -40,7 +30,6 @@ import buildRela from '@/views/point/dynamicdata/addRelation/buildRela'
 import floorRela from '@/views/point/dynamicdata/addRelation/floorRela'
 import tenantRela from '@/views/point/dynamicdata/addRelation/tenantRela'
 import projectRela from '@/views/point/dynamicdata/addRelation/projectRela'
-
 /** 扫楼作业 */
 import buildTask from '@/views/data_admin/buildTask'
 import addDeviceTask from '@/views/data_admin/buildTask/addTask/addDeviceTask'
@@ -52,12 +41,13 @@ import buildData from '@/views/data_admin/buildData'
 import buildGraphy from '@/views/data_admin/buildGraphy'
 import updatePointZone from '@/views/data_admin/buildGraphy/updatePointZone'
 import createPointZone from '@/views/data_admin/buildGraphy/createPointZone'
-
 /**  台账管理 */
 import systemLedger from '@/views/ledger/system'
 import systemadd from '@/views/ledger/system/addsystem'
 import systemDetail from '@/views/ledger/system/systemDetail'
 import facilityLedger from '@/views/ledger/facility'
+import deviceDetails from "@/views/ledger/facility/details";
+import propertyDetails from "@/views/ledger/property/details";
 import partsLedger from '@/views/ledger/facility/parts'
 import partsmanageLedger from '@/views/ledger/facility/partsmanage'
 import partsadd from '@/views/ledger/facility/partsmanage/addparts'
@@ -78,7 +68,6 @@ import auth from '@/views/system/auth'
 import noUser from '@/views/system/nouser'
 import spaceDetail from '@/views/ledger/spacelist/spaceDetail'
 import relatedSpace from '@/views/ledger/cenotelist/relatedSpace'
-
 /**  关系维护并计算 */
 import maintain from '@/views/relation/maintain'
 import overView from '@/views/relation/overview'
@@ -86,16 +75,12 @@ import relationShip from '@/views/relation/relationShip'
 import relationDetail from '@/views/relation/overview/detail'
 import data from '@/views/relation/data'
 import datatable from '@/views/relation/datatable'
-
 /**  厂家库 */
-import supplier from '@/views/manufactor/supplier'
-
 /**  辅助屏 */
 import splitScreen from '@/views/screen/splitScreen'
 import spaceLedger from '@/views/screen/splitScreen/spaceledger'
 import equipLedger from '@/views/screen/splitScreen/equipledger'
 import integrateResults from '@/views/screen/splitScreen/integrateresults'
-
 /**  业务空间数据导入工具 */
 import dataUtil from '@/views/business_space/dataUtil/index'
 import dataUtil2 from '@/views/business_space/dataUtil/index2'
@@ -345,48 +330,90 @@ export default [{
         name: 'LayoutMain',
         component: LayoutMain,
         children: [
-            { path: '', name: 'Dasboard', component: Dasboard },
-            {
-                path: 'facility',
-                name: 'facilityLedger',
-                component: facilityLedger,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '设备台账' }] }
-            },
-            {
-                path: 'parts',
-                name: 'partsLedger',
-                component: partsLedger,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '包含的部件' }] }
-            },
-            {
-                path: 'partsmanage',
-                name: 'partsmanageLedger',
-                component: partsmanageLedger,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '管理部件' }] },
-            },
-            {
-                path: 'partsadd',
-                name: 'partsadd',
-                component: partsadd,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '设备台账', path: '/ledger/facility' }, { label: '添加部件' }] },
-            },
-            {
-                path: 'deviceadd',
-                name: 'deviceadd',
-                component: deviceadd,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '设备台账', path: '/ledger/facility' }, { label: '添加设备' }] }
-            },
-            {
-                path: 'batchlinkAssets',
-                name: 'batchlinkAssets',
-                component: batchlinkAssets,
-                meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '设备台账', path: '/ledger/facility' }, { label: '批量关联资产' }] }
-            },
+          {path: '', name: 'Dasboard', component: Dasboard},
+          {
+            path: 'facility',
+            name: 'facilityLedger',
+            component: facilityLedger,
+            meta: {keepAlive: false, breadcrumbs: [{label: '台账管理', path: '/ledger/facility'}, {label: '设备台账'}]}
+          },
+          {
+            path: 'deviceDetails', 
+            name: 'deviceDetails', 
+            component: deviceDetails,
+            meta: {
+							keepAlive: false, 
+							breadcrumbs: [
+								{label: '台账管理', path: '/ledger/facility'},
+								{label: '设备台账', path: '/ledger/facility'}, 
+								{label: '台账详情'}
+							]
+            }
+          },
+          {
+            path: 'parts',
+            name: 'partsLedger',
+            component: partsLedger,
+            meta: {keepAlive: false, breadcrumbs: [{label: '台账管理', path: '/ledger/facility'}, {label: '包含的部件'}]}
+          },
+          {
+            path: 'partsmanage',
+            name: 'partsmanageLedger',
+            component: partsmanageLedger,
+            meta: {keepAlive: false, breadcrumbs: [{label: '台账管理', path: '/ledger/facility'}, {label: '管理部件'}]},
+          },
+          {
+            path: 'partsadd',
+            name: 'partsadd',
+            component: partsadd,
+            meta: {
+              keepAlive: false,
+              breadcrumbs: [{label: '台账管理', path: '/ledger/facility'}, {
+                label: '设备台账',
+                path: '/ledger/facility'
+              }, {label: '添加部件'}]
+            },
+          },
+          {
+            path: 'deviceadd',
+            name: 'deviceadd',
+            component: deviceadd,
+            meta: {keepAlive: false,
+              breadcrumbs: [{label: '台账管理', path: '/ledger/facility'}, {
+                label: '设备台账',
+                path: '/ledger/facility'
+              }, {label: '添加设备'}]
+            }
+          },
+          {
+            path: 'batchlinkAssets',
+            name: 'batchlinkAssets',
+            component: batchlinkAssets,
+            meta: {keepAlive: false,
+              breadcrumbs: [{label: '台账管理', path: '/ledger/facility'}, {
+                label: '设备台账',
+                path: '/ledger/facility'
+              }, {label: '批量关联资产'}]
+            }
+          },
             {
                 path: 'property',
                 name: 'propertyLedger',
                 component: propertyLedger,
                 meta: { keepAlive: false, breadcrumbs: [{ label: '台账管理', path: '/ledger/facility' }, { label: '资产台账' }] }
+			},
+            {
+                path: 'propertyDetails', 
+                name: 'propertyDetails', 
+                component: propertyDetails,
+                meta: {
+                    keepAlive: false, 
+                    breadcrumbs: [
+                        {label: '台账管理', path: '/ledger/facility'},
+                        {label: '资产台账', path: '/ledger/property'}, 
+                        {label: '资产详情'}
+                    ]
+                }
             },
             {
                 path: 'propertyadd',

+ 21 - 1
src/utils/scan/tools.js

@@ -553,7 +553,27 @@ tools.setDataForKey = function (data, key, value) {
     }
   }
 }
+tools.flattenKeys = function (obj) {
+  let res = {}
 
+  function isObject(val) {
+    return typeof val === 'object' && !Array.isArray(val)
+  }
+
+  function digKeys(prev, obj) {
+    Object.entries(obj).forEach(([key, value]) => {
+      const currentKey = prev ? `${prev}.${key}` : key
+      if (isObject(value)) {
+        digKeys(currentKey, value)
+      } else {
+        res[currentKey] = value
+      }
+    })
+  }
+
+  digKeys('', obj)
+  return res
+}
 function dateToDate(date) {
   var sDate = new Date();
   if (typeof date == 'object' && typeof new Date().getMonth == "function") {
@@ -567,4 +587,4 @@ function dateToDate(date) {
   return sDate;
 }
 
-export default tools
+export default tools

+ 249 - 29
src/views/ledger/cenotelist/cenoteDetail/index.vue

@@ -17,6 +17,26 @@
           <el-button size="small" @click="deleteCenote">删除竖井</el-button>
         </div>
       </el-row>
+      <div v-if="activeTab=='detail'"  class="content">
+        <div class="content-left">
+          <div class="content-showType">
+            <selectRadio
+              :selectRadio="selectRadio"
+              @changeRadio="changeRadio"
+            />
+          </div>
+          <div class="content-point">
+            <div class="content-point-left">
+              <el-scrollbar style="height:100%;">
+                <div>
+                  <exhibitionBaseInformation :exhibitionBaseInformation="exhibitionBaseInformation"/>
+
+                </div>
+              </el-scrollbar>
+            </div>
+          </div>
+        </div>
+      </div>
       <!-- 竖井内的设备 -->
       <device-table v-if="activeTab=='device'" :params="params" :type="activeTab"></device-table>
       <!-- 连通的其他竖井 -->
@@ -28,42 +48,209 @@
 </template>
 
 <script>
-import { mapGetters } from "vuex"
-import { deleteCenoteTableData } from '@/api/scan/request'
-import cenoteTable from '@/components/ledger/cenote/table/cenoteTable'
-import deviceTable from '@/components/ledger/cenote/table/deviceTable'
-import systemTable from '@/components/ledger/cenote/table/systemTable'
-export default {
-  data() {
-    return {
-      params: {},
-      tabsList: [
-        { Code: 'device', Name: '竖井内的设备' },
-        { Code: 'cenote', Name: '连通的其它竖井' },
-        { Code: 'system', Name: '竖井内系统' },
-      ], //tab页
-      activeTab: 'device' //当前选中的tab
-    }
-  },
-  computed: {
-    ...mapGetters("layout", ["projectId", "userId", "secret"])
-  },
-  components: {
-    cenoteTable,
-    deviceTable,
-    systemTable
-  },
-  created() {
-    this.params = this.$route.query;
+  import {mapGetters} from "vuex"
+  import {deleteCenoteTableData, getDataDictionary, queryCenoteTableData} from '@/api/scan/request'
+  import cenoteTable from '@/components/ledger/cenote/table/cenoteTable'
+  import deviceTable from '@/components/ledger/cenote/table/deviceTable'
+  import systemTable from '@/components/ledger/cenote/table/systemTable'
+  import exhibitionBaseInformation from "@/components/ledger/details/detail/exhibitionBaseInformation";
+  import selectRadio from "@/components/ledger/details/detail/selectRadio";
+  import tools from "@/utils/scan/tools"
+
+  export default {
+    data() {
+      return {
+        params: {},
+        tabsList: [
+          {Code: 'detail', Name: '竖井详情'},
+          {Code: 'device', Name: '竖井内的设备'},
+          {Code: 'cenote', Name: '连通的其它竖井'},
+          {Code: 'system', Name: '竖井内系统'},
+        ], //tab页
+        activeTab: 'detail', //当前选中的tab
+        pointData: [], //信息点数据
+        exampleData: {}, //实例数据
+        exhibitionBaseInformation: {
+          information: {},
+          style: 4
+        },
+        selectRadio: {
+          information: '设备信息点',
+          initRadio: '1',
+          radioList: [
+            {
+              value: '显示需采集信息点',
+              label: '1'
+            },
+            {
+              value: '显示有值信息点',
+              label: '2'
+            },
+            {
+              value: '显示全部信息点',
+              label: '3'
+            }
+          ]
+        },
+      }
+    },
+    computed: {
+      ...mapGetters("layout", ["projectId", "userId", "secret"])
+    },
+    components: {
+      cenoteTable,
+      deviceTable,
+      systemTable,
+      exhibitionBaseInformation,
+      selectRadio
+    },
+    created() {
+      this.params = this.$route.query;
+    this.getData();
   },
   mounted() { },
   watch: {
     projectId() { }
   },
   methods: {
+    deepCopy(obj) {
+      return JSON.parse(JSON.stringify(obj))
+    },
     // 返回
     goBack() {
-      this.$router.push({ name: "cenotelist" })
+      this.$router.push({name: "cenotelist"});
+    },
+    getData() {
+      let params1 = {
+        data: {
+          Orders: "sort asc",
+          PageNumber: 1,
+          PageSize: 1000
+        },
+        type: 'Shaft'
+      }, params2 = {
+        Filters: `ShaftID='${this.params.ShaftID}'`
+      };
+      let promise1 = new Promise((resolve, reject) => {
+        getDataDictionary(params1, res => {
+          resolve(res)
+        })
+      })
+      let promise2 = new Promise((resolve, reject) => {
+        queryCenoteTableData(params2, res => {
+          resolve(res)
+        })
+      })
+      Promise.all([promise1, promise2]).then(values => {
+        this.pointData = values[0].Content;
+        this.exampleData = values[1].Content[0];
+        let obj = this.deepCopy(values[1].Content[0]);
+        obj = tools.flattenKeys(obj);
+        this.instance = obj;
+        this.handleRadios(1)
+      })
+    },
+    handleRadios(val) { //判断radio的值显示关键信息,基本信息,图片,文件
+      let arr = []
+      if (val == 1) { //需采集信息
+        arr = this.pointData.filter(i => i.Visible)
+      } else if (val == 2) { //有值信息点
+        let list = this.pointData
+        list.map(j => {
+          if (this.instance.hasOwnProperty(j.Path)) {
+            return {
+              ...j,
+              value: this.instance[j.Path]
+            }
+          }
+          arr = list.filter(k => k.value)
+        })
+      } else { //全部信息点
+        arr = this.pointData
+      }
+      this.displayData(arr)
+    },
+    changeRadio(val) { //1,需采集,2,有值,3,全部
+      this.handleRadios(val)
+      this.currentRadio = val
+    },
+    formatDate(str) {
+      return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+    },
+    displayData(arr) {//对数据进行处理传给组件展示
+      const result = {}
+      arr.forEach(i => {
+
+        if (this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
+          i.value = this.instance[i.Path]
+        }
+        if (i.InputMode == 'C5') {
+          if (this.instance.hasOwnProperty(i.Path)) {
+            let time = this.instance[i.Path]
+            i.value = this.formatDate(time)
+          }
+        }
+        if (i.DataSource && i.DataSource.length) {
+          let source = JSON.parse(i.DataSource)
+          //判断输入类型
+          if (i.InputMode == 'D1L') {
+            let d1l = tools.formatDataSource(i.DataSource)
+            d1l.forEach(k => {
+              if (k.Code == this.instance[i.Path]) {
+                i.value = k.Name
+              }
+            })
+          } else if (i.InputMode == 'D2' || i.InputMode == 'C6') {
+            if (this.instance.hasOwnProperty(i.Path)) {
+              if (!Array.isArray(this.instance[i.Path])) {
+                let transArray = this.instance[i.Path].split(',')
+                i.value = source.filter(item => transArray.includes(item.Code)).map(item => item.Name).join(',')
+              }
+            }
+          }
+          source.forEach(j => {
+            if (j.Code == this.instance[i.Path]) {
+              console.log(j.Name)
+              i.value = j.Name
+            }
+          })
+        }
+        switch (i.InputMode) {
+          case "L":
+          case "L1":
+          case "L2":
+          case "M":
+            break;
+          default:
+            if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+              result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                Path: i.Path,
+                InfoPointName: i.InfoPointName,
+                InfoPointCode: i.InfoPointCode,
+                Value: i.value,
+                Visible: i.Visible,
+                KeyWord: i.KeyWord,
+                InputMode:i.InputMode
+              })
+            } else {
+              result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                paths: [{
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  Value: i.value,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode:i.InputMode
+                }]
+              }
+            }
+
+        }
+
+
+      })
+      this.exhibitionBaseInformation.information = result
     },
     // 删除业务空间
     deleteCenote() {
@@ -92,8 +279,8 @@ export default {
     height: 100%;
     flex-direction: column;
     border: 1px solid #dfe6ec;
+    box-sizing: border-box;
     background: #fff;
-    margin-bottom: 10px;
     .header {
       padding-bottom: 10px;
       span {
@@ -120,6 +307,35 @@ export default {
         border-bottom: 1px solid #e4e7ed;
       }
     }
+
+    .content {
+      display: flex;
+      flex-direction: row;
+      box-sizing: border-box;
+      height: calc(100% - 99px);
+      .content-left {
+        display: flex;
+        flex-direction: column;
+        flex: 1;
+        .content-showType {
+          height: 50px;
+          border: 1px solid #ccc;
+          border-bottom: none;
+          box-sizing: border-box;
+        }
+        .content-point {
+          display: flex;
+          flex-direction: row;
+          height: calc(100% - 50px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          .content-point-left {
+            flex: 1;
+          }
+        }
+      }
+    }
+
     .main {
       margin-top: 10px;
       height: calc(100% - 96px);
@@ -127,6 +343,10 @@ export default {
     .footer {
       margin-bottom: 10px;
     }
+
+    /deep/ .el-scrollbar__wrap {
+      overflow-x: hidden;
+    }
   }
 }
 </style>

+ 529 - 0
src/views/ledger/facility/details/index.vue

@@ -0,0 +1,529 @@
+<template>
+  <div class="tableDisplay">
+    <div class="header">
+      <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
+      <span class="details-title"><b>{{name}} - {{code}}</b></span>
+    </div>
+    <div class="content">
+      <div class="content-left">
+        <div class="content-keyPoint">
+          <exhibitionCrux :exhibitionCrux="exhibitionCrux" :type="type" @cruxSuccess="cruxSuccess"/>
+        </div>
+        <div class="content-showType">
+          <selectRadio
+            :selectRadio="selectRadio"
+            @changeRadio="changeRadio"
+          />
+        </div>
+        <div class="content-point">
+          <div class="content-point-left">
+            <el-scrollbar style="height:100%;">
+              <div>
+                <exhibitionBaseInformation :exhibitionBaseInformation="exhibitionBaseInformation"/>
+              </div>
+            </el-scrollbar>
+          </div>
+          <div class="content-point-right">
+            <el-scrollbar style="height:100%;">
+              <div>
+                <exhibitionEnergy :exhibitionEnergy="exhibitionEnergy"/>
+              </div>
+            </el-scrollbar>
+          </div>
+        </div>
+      </div>
+      <div class="content-right">
+        <div class="content-repair">
+          <exhibitionMaintain :exhibitionMaintain="exhibitionMaintain"/>
+        </div>
+        <div class="content-media">
+          <el-scrollbar style="height:100%;">
+            <div>
+              <exhibitionImage :exhibitionImage="exhibitionImage"/>
+              <exhibitionVideo :exhibitionVideo="exhibitionVideo"/>
+              <exhibitionFile :exhibitionFile="exhibitionFile"/>
+            </div>
+          </el-scrollbar>
+        </div>
+      </div>
+    </div>
+    <div class="footer">
+      <el-select size="mini" style="float:right;margin:7px 30px 0 0" v-model="id" @change="handleChangeExample" placeholder="请选择">
+        <el-option
+          v-for="item in list"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value">
+        </el-option>
+      </el-select>
+    </div>
+  </div>
+</template>
+
+<script>
+  import exhibitionBaseInformation from "@/components/ledger/details/detail/exhibitionBaseInformation";
+  import exhibitionFile from "@/components/ledger/details/detail/exhibitionFile";
+  import exhibitionImage from "@/components/ledger/details/detail/exhibitionImage";
+  import exhibitionVideo from "@/components/ledger/details/detail/exhibitionVideo";
+  import exhibitionCrux from "@/components/ledger/details/detail/exhibitionCrux";
+  import exhibitionEnergy from "@/components/ledger/details/detail/exhibitionEnergy";
+  import exhibitionMaintain from "@/components/ledger/details/detail/exhibitionMaintain";
+  import selectRadio from "@/components/ledger/details/detail/selectRadio";
+  import tools from "@/utils/scan/tools"
+  import {BeatchQueryParam, getDataDictionary, queryEquip} from "@/api/scan/request";
+  import {mapGetters} from "vuex";
+
+  export default {
+    name: "deviceDetails",
+    components: {
+      exhibitionBaseInformation,
+      exhibitionFile,
+      exhibitionVideo,
+      exhibitionImage,
+      exhibitionMaintain,
+      selectRadio,
+      exhibitionCrux,
+      exhibitionEnergy
+    },
+    created() {
+      this.id = this.$route.query.equipId;
+      this.name = this.$route.query.equipName;
+      this.code = this.$route.query.equipCode;
+      this.type = this.$route.query.type;
+      this.list = this.$route.query.data;
+      this.getData();
+      console.log(this.$route.query)
+    },
+    computed: {
+      ...mapGetters("layout", ["projectId", "secret", "userId"])
+    },
+    data() {
+      return {
+        id: '', //当前设备id
+        name: '', //当前设备本地名称
+        code: '', //当前设备的本地编码
+        type: '', //设备类型
+        list: [], //设备列表
+        pointData: [], //信息点数据
+        exampleData: {}, //实例数据
+        currentRadio: '',//当前选中的select
+        criterias: [], //动态参数
+        selectRadio: {
+          information: '设备信息点',
+          initRadio: '1',
+          radioList: [
+            {
+              value: '显示需采集信息点',
+              label: '1'
+            },
+            {
+              value: '显示有值信息点',
+              label: '2'
+            },
+            {
+              value: '显示全部信息点',
+              label: '3'
+            }
+          ]
+        },
+        exhibitionBaseInformation: {
+          information: {},
+          style:2
+        },
+        exhibitionEnergy: {
+          title: '能耗信息',
+          dynamic: [],
+        },
+        exhibitionMaintain: {
+          title: '维修/维保记录'
+        },
+        exhibitionFile: {
+          title: '文件',
+          list: {}
+        },
+        exhibitionCrux: {
+          title: '关键信息点:',
+          cruxArray: [],
+          allMessage: [],//全部信息点
+        },
+        exhibitionImage: {
+          title: '图片',
+          list: {}
+        },
+        exhibitionVideo: {
+          title: '视频',
+          list: {}
+        },
+        instance: {},//实例信息处理
+      }
+    },
+    methods: {
+      deepCopy(obj) {
+        return JSON.parse(JSON.stringify(obj))
+      },
+      cruxSuccess(){
+        this.getData()
+      },
+      // 获取表头和实例数据(动态数据在组件中获取,在此格式化请求参数)
+      getData() {
+        let params1 = {
+          data: {
+            Orders: "sort asc",
+            PageNumber: 1,
+            PageSize: 1000
+          },
+          type: this.type
+        }, params2 = {
+          Filters: `EquipID='${this.id}'`,
+        };
+        let promise1 = new Promise((resolve, reject) => {
+          getDataDictionary(params1, res => {
+            resolve(res)
+          })
+        })
+        let promise2 = new Promise((resolve, reject) => {
+          queryEquip(params2, res => {
+            resolve(res)
+          })
+        })
+        Promise.all([promise1, promise2]).then(values => {
+          this.pointData = values[0].Content;
+          this.exampleData = values[1].Content[0];
+          this.name = this.exampleData.EquipLocalName?this.exampleData.EquipLocalName:this.exampleData.EquipName?this.exampleData.EquipName:'';
+          this.code = this.exampleData.EquipLocalID?this.exampleData.EquipLocalID:'';
+          let obj = this.deepCopy(values[1].Content[0]);
+          obj = tools.flattenKeys(obj);
+          this.instance = obj;
+          this.handleRadios(1)
+          this.pointData.forEach(item => {
+            if (item.InputMode == "L" || item.InputMode == "L1" || item.InputMode == "L2" || item.InputMode == "M") {
+              let cur = tools.dataForKey(this.exampleData, item.Path);
+              if (cur) {
+                this.criterias.push({
+                  id: this.exampleData.EquipID,
+                  code: item.InfoPointCode
+                })
+
+              }
+            }
+          })
+
+          let params = { //获取动态参数
+            secret: this.secret,
+            ProjId: this.projectId,
+            data: {
+              criterias: this.criterias
+            }
+          }
+          if (this.criterias.length) {
+            BeatchQueryParam(params, res => {
+              res.Content.map(child => {
+                this.pointData.forEach(head => {
+                  if (head.InfoPointCode == child.code) {
+                    this.exhibitionEnergy.dynamic.push({
+                      InfoPointCode: head.InfoPointCode,
+                      InfoPointName: head.InfoPointName,
+                      Path: head.Path,
+                      value: child.value,
+                      data: child.data || '--',
+                      receivetime: child.receivetime || '',
+                      error: child.error || '',
+                      Unit: head.Unit || ''
+                    })
+                  }
+                })
+              });
+            })
+          }
+
+        })
+      },
+      handleRadios(val) { //判断radio的值显示关键信息,基本信息,图片,文件
+        let arr = []
+        //关键信息点
+        this.exhibitionCrux.cruxArray = this.pointData.filter(i => i.KeyWord)
+        this.exhibitionCrux.cruxArray.map(i => {
+          if (this.instance.hasOwnProperty(i.Path)) {
+            return {
+              ...i,
+              value: this.instance[i.Path]
+            }
+          }
+        })
+        if (val == 1) { //需采集信息
+          arr = this.pointData.filter(i => i.Visible)
+
+          //  图片和的处理
+          this.handlePicList(arr)
+          //  文件处理
+          this.handleFileList(arr)
+
+        } else if (val == 2) { //有值信息点
+          let list = this.pointData
+          list.map(j => {
+            if (this.instance.hasOwnProperty(j.Path)) {
+              return {
+                ...j,
+                value: this.instance[j.Path]
+              }
+            }
+            arr = list.filter(k => k.value)
+            this.handlePicList(arr)
+            this.handleFileList(arr)
+          })
+        } else { //全部信息点
+          arr = this.pointData
+          this.handlePicList(arr)
+          this.handleFileList(arr)
+        }
+        this.displayData(arr)
+      },
+      handlePicList(arr) {
+        let picObject = {}
+        //处理数据格式
+        arr.map(i => {
+            if(i.InputMode == 'F2') {
+              switch (i.Path) {
+                case 'LedgerParam.PhotoDoc.Drawing':
+                case 'LedgerParam.Siteinstall.InstallPic':
+                case 'LedgerParam.Siteinstall.InstallDrawing':
+                case 'LedgerParam.PhotoDoc.Nameplate':
+                  if (this.instance.hasOwnProperty(i.Path)) {
+                    i.PicList = this.instance[i.Path]
+                  }
+                  if (picObject[i.InfoPointName]) {
+
+                  } else {
+                    picObject[i.InfoPointName] = []
+                  }
+                  picObject[i.InfoPointName].push({
+                    ...i,
+                  })
+                  break;
+
+              }
+            }
+
+        })
+        //展示图片
+        this.exhibitionImage.list = picObject
+      },
+      handleFileList(arr) {
+        let picObject = {}
+        //处理数据格式
+        arr.map(i => {
+          if (i.InputMode == 'F2') {
+            switch (i.Path) {
+              case 'LedgerParam.InsuranceDoc.InsuranceFile':
+              case 'LedgerParam.PhotoDoc.Archive':
+              case 'LedgerParam.Siteinstall.CheckReport':
+                if (this.instance.hasOwnProperty(i.Path)) {
+                  i.fileList = this.instance[i.Path]
+                }
+                if (picObject[i.InfoPointName]) {
+
+                } else {
+                  picObject[i.InfoPointName] = []
+                }
+                picObject[i.InfoPointName].push({
+                  ...i,
+                })
+                break
+            }
+          }
+        })
+        //展示文件
+        this.exhibitionFile.list = picObject
+      },
+      changeRadio(val) { //1,需采集,2,有值,3,全部
+        this.handleRadios(val)
+        this.currentRadio = val
+      },
+      formatDate(str) {
+        return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+      },
+      displayData(arr) {//对数据进行处理传给组件展示
+        const result = {}
+        arr.forEach(i => {
+          if (this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
+            i.value = this.instance[i.Path]
+          }
+          if (i.InputMode == 'C5') {
+            if (this.instance.hasOwnProperty(i.Path)) {
+              let time = this.instance[i.Path]
+              i.value = this.formatDate(time)
+            }
+          }
+          if (i.DataSource && i.DataSource.length) {
+            let source = JSON.parse(i.DataSource)
+            //判断输入类型
+            if (i.InputMode == 'D1L') {
+              let d1l = tools.formatDataSource(i.DataSource)
+              d1l.forEach(k => {
+                if (k.Code == this.instance[i.Path]) {
+                  i.value = k.Name
+                }
+              })
+            } else if (i.InputMode == 'D2' || i.InputMode == 'C6') {
+              if (this.instance.hasOwnProperty(i.Path)) {
+                if (!Array.isArray(this.instance[i.Path])) {
+                  let transArray = this.instance[i.Path].split(',')
+                  i.value = source.filter(item => transArray.includes(item.Code)).map(item => item.Name).join(',')
+                }
+              }
+            }
+            source.forEach(j => {
+              if (j.Code == this.instance[i.Path]) {
+                console.log(j.Name)
+                i.value = j.Name
+              }
+            })
+          }
+          switch (i.InputMode) {
+            case "L":
+            case "L1":
+            case "L2":
+            case "M":
+              break;
+            default:
+              if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+                result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  Value: i.value,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode:i.InputMode
+                })
+              } else {
+                result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                  paths: [{
+                    Path: i.Path,
+                    InfoPointName: i.InfoPointName,
+                    InfoPointCode: i.InfoPointCode,
+                    Value: i.value,
+                    Visible: i.Visible,
+                    KeyWord: i.KeyWord,
+                    InputMode:i.InputMode
+                  }]
+                }
+              }
+
+          }
+
+
+        })
+        this.exhibitionBaseInformation.information = result
+        this.exhibitionCrux.allMessage = result
+      },
+      goBack() {
+        this.$router.push({
+          name: "facilityLedger",
+          params: {
+            deviceId: this.type
+          }
+        })
+      },
+      // 切换实例
+      handleChangeExample() {
+        this.selectRadio.initRadio = '1'
+        this.getData();
+      },
+    },
+    watch: {
+      projectId() {
+        this.$router.push({path: "/ledger/facility"})
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  @bgc:#fff;
+  .tableDisplay {
+    .header {
+      padding-bottom: 10px;
+      .details-title {
+        color: #333;
+        font-size: 16px;
+        margin-left: 20px;
+        line-height: 32px;
+      }
+    }
+
+    .content {
+      display: flex;
+      flex-direction: row;
+      box-sizing: border-box;
+      height: calc(100% - 95px);
+      .content-left {
+        display: flex;
+        flex-direction: column;
+        flex: 1;
+        .content-keyPoint {
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          height: 100px;
+          margin-bottom: 10px;
+          overflow: hidden;
+          background: @bgc;
+        }
+        .content-showType {
+          height: 50px;
+          border: 1px solid #ccc;
+          border-bottom: none;
+          box-sizing: border-box;
+          background: @bgc;
+        }
+        .content-point {
+          display: flex;
+          flex-direction: row;
+          height: calc(100% - 160px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          background: @bgc;
+
+          .content-point-left {
+            flex: 1;
+          }
+
+          .content-point-right {
+            width: 400px;
+            border-left: 1px solid #ccc;
+          }
+        }
+      }
+      .content-right {
+        width: 400px;
+        margin-left: 10px;
+        .content-repair {
+          height: 50px;
+          line-height: 50px;
+          margin-bottom: 10px;
+          border: 1px solid #ccc;
+          background: @bgc;
+          box-sizing: border-box;
+        }
+        .content-media {
+          height: calc(100% - 60px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+        }
+      }
+    }
+
+    .footer {
+      margin-top: 5px;
+      height: 45px;
+      background-color: #fff;
+      box-sizing: border-box;
+      border: 1px solid #ccc;
+    }
+  }
+
+  /deep/ .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+
+</style>

+ 3 - 3
src/views/ledger/facility/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <div id="deviceList">
+  <div id="deviceList" >
     <router-link to="/ledger/facility/addfacility"></router-link>
     <router-view></router-view>
     <saga-title :mess="mess"></saga-title>
@@ -96,7 +96,7 @@ export default {
   methods: {
     getProjName() {
       this.projects.forEach((item) => {
-        if(item.id == this.projectId) 
+        if(item.id == this.projectId)
         this.mess.perjectName = item.name
       })
       // this.getEqCode()
@@ -209,4 +209,4 @@ export default {
     }
   }
 }
-</style>
+</style>

+ 455 - 0
src/views/ledger/property/details/index.vue

@@ -0,0 +1,455 @@
+<template>
+  <div class="tableDisplay">
+    <div class="header">
+      <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
+      <span class="details-title"><b>{{name}} - {{code}}</b></span>
+    </div>
+    <div class="content">
+      <div class="content-left">
+        <div class="content-keyPoint">
+          <exhibitionCrux :exhibitionCrux="exhibitionCrux" :type="type" @cruxSuccess="cruxSuccess"/>
+
+        </div>
+        <div class="content-showType">
+          <selectRadio
+            :selectRadio="selectRadio"
+            @changeRadio="changeRadio"
+          />
+        </div>
+        <div class="content-point">
+          <div class="content-point-left">
+            <el-scrollbar style="height:100%;">
+              <div>
+                <exhibitionBaseInformation :exhibitionBaseInformation="exhibitionBaseInformation"/>
+              </div>
+            </el-scrollbar>
+          </div>
+        </div>
+      </div>
+      <div class="content-right">
+        <div class="content-media">
+          <el-scrollbar style="height:100%;">
+            <div>
+              <exhibitionImage :exhibitionImage="exhibitionImage"/>
+              <exhibitionVideo :exhibitionVideo="exhibitionVideo"/>
+              <exhibitionFile :exhibitionFile="exhibitionFile"/>
+            </div>
+          </el-scrollbar>
+        </div>
+      </div>
+    </div>
+    <div class="footer">
+      <el-select size="mini" style="float:right;margin:7px 30px 0 0" v-model="id" @change="handleChangeExample" placeholder="请选择">
+        <el-option
+          v-for="item in list"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value">
+        </el-option>
+      </el-select>
+    </div>
+  </div>
+</template>
+
+<script>
+  import exhibitionBaseInformation from "@/components/ledger/details/detail/exhibitionBaseInformation";
+  import exhibitionFile from "@/components/ledger/details/detail/exhibitionFile";
+  import exhibitionImage from "@/components/ledger/details/detail/exhibitionImage";
+  import exhibitionVideo from "@/components/ledger/details/detail/exhibitionVideo";
+  import exhibitionCrux from "@/components/ledger/details/detail/exhibitionCrux";
+  import selectRadio from "@/components/ledger/details/detail/selectRadio";
+
+  import {getDataDictionary, queryProperty} from "@/api/scan/request";
+  import {mapGetters} from "vuex";
+  import tools from "@/utils/scan/tools"
+
+
+  export default {
+    name: "propertyDetails",
+    components: {
+      exhibitionBaseInformation,
+      exhibitionFile,
+      exhibitionImage,
+      selectRadio,
+      exhibitionCrux,
+      exhibitionVideo
+    },
+    created() {
+      this.id = this.$route.query.equipId;
+      this.name = this.$route.query.equipName;
+      this.code = this.$route.query.equipCode;
+      this.type = this.$route.query.type;
+      this.list = this.$route.query.data;
+      this.getData();
+      console.log(this.$route.query)
+    },
+    computed: {
+      ...mapGetters("layout", ["projectId", "secret", "userId"])
+    },
+    data() {
+      return {
+        id: '', //当前资产id
+        name: '', //当前资产本地名称
+        code: '', //当前资产的本地编码
+        type: '', //资产类型
+        list: [], //资产列表
+        pointData: [], //信息点数据
+        currentRadio: '',//当前选中的select
+        selectRadio: {
+          information: '设备信息点',
+          initRadio: '1',
+          radioList: [
+            {
+              value: '显示需采集信息点',
+              label: '1'
+            },
+            {
+              value: '显示有值信息点',
+              label: '2'
+            },
+            {
+              value: '显示全部信息点',
+              label: '3'
+            }
+          ]
+        },
+        exhibitionBaseInformation: {
+          information: {},
+          style:3
+        },
+        exhibitionFile: {
+          title: '文件',
+          list: {}
+        },
+        exhibitionCrux: {
+          title: '关键信息点:',
+          cruxArray: [],
+          allMessage: [],//全部信息点
+        },
+        exhibitionImage: {
+          title: '图片',
+          list: {}
+        },
+        exhibitionVideo: {
+          title: '视频',
+          list: {}
+        },
+        instance: {},//实例信息处理
+      }
+    },
+    methods: {
+      deepCopy(obj) {
+        return JSON.parse(JSON.stringify(obj))
+      },
+      cruxSuccess(){
+        this.getData()
+      },
+      // 获取表头和实例数据
+      getData () {
+        let params1 = {
+          data: {
+            Orders: "sort asc",
+            PageNumber: 1,
+            PageSize: 1000
+          },
+          type: this.type
+        }, params2 = {
+          Filters: `EquipID='${this.id}'`,
+        };
+        let promise1 = new Promise((resolve, reject) => {
+          getDataDictionary(params1, res => {
+            resolve(res)
+          })
+        })
+        let promise2 = new Promise((resolve, reject) => {
+          queryProperty(params2, res => {
+            resolve(res)
+          })
+        })
+        Promise.all([promise1, promise2]).then(values => {
+          this.pointData = values[0].Content;
+          this.exampleData = values[1].Content[0];
+          this.name = this.exampleData.EquipLocalName?this.exampleData.EquipLocalName:this.exampleData.EquipName?this.exampleData.EquipName:'';
+          this.code = this.exampleData.EquipLocalID?this.exampleData.EquipLocalID:'';
+          let obj = this.deepCopy(values[1].Content[0]);
+          obj = tools.flattenKeys(obj);
+          this.instance = obj;
+          this.handleRadios(1)
+        })
+      },
+      handleRadios(val) { //判断radio的值显示关键信息,基本信息,图片,文件
+        let arr = []
+        //关键信息点
+        this.exhibitionCrux.cruxArray = this.pointData.filter(i => i.KeyWord)
+        this.exhibitionCrux.cruxArray.map(i => {
+          if (this.instance.hasOwnProperty(i.Path)) {
+            return {
+              ...i,
+              value: this.instance[i.Path]
+            }
+          }
+        })
+        if (val == 1) { //需采集信息
+          arr = this.pointData.filter(i => i.Visible)
+
+          //  图片和的处理
+          this.handlePicList(arr)
+          //  文件处理
+          this.handleFileList(arr)
+
+        } else if (val == 2) { //有值信息点
+          let list = this.pointData
+          list.map(j => {
+            if (this.instance.hasOwnProperty(j.Path)) {
+              return {
+                ...j,
+                value: this.instance[j.Path]
+              }
+            }
+            arr = list.filter(k => k.value)
+            this.handlePicList(arr)
+            this.handleFileList(arr)
+          })
+        } else { //全部信息点
+          arr = this.pointData
+          this.handlePicList(arr)
+          this.handleFileList(arr)
+        }
+        this.displayData(arr)
+      },
+      handlePicList(arr) {
+        let picObject = {}
+        //处理数据格式
+        arr.map(i => {
+          if(i.InputMode == 'F2') {
+            switch (i.Path) {
+              case 'LedgerParam.PhotoDoc.Drawing':
+              case 'LedgerParam.Siteinstall.InstallPic':
+              case 'LedgerParam.Siteinstall.InstallDrawing':
+              case 'LedgerParam.PhotoDoc.Nameplate':
+                if (this.instance.hasOwnProperty(i.Path)) {
+                  i.PicList = this.instance[i.Path]
+                }
+                if (picObject[i.InfoPointName]) {
+
+                } else {
+                  picObject[i.InfoPointName] = []
+                }
+                picObject[i.InfoPointName].push({
+                  ...i,
+                })
+                break;
+
+            }
+          }
+
+        })
+        //展示图片
+        this.exhibitionImage.list = picObject
+      },
+      handleFileList(arr) {
+        let picObject = {}
+        //处理数据格式
+        arr.map(i => {
+          if (i.InputMode == 'F2') {
+            switch (i.Path) {
+              case 'LedgerParam.InsuranceDoc.InsuranceFile':
+              case 'LedgerParam.PhotoDoc.Archive':
+              case 'LedgerParam.Siteinstall.CheckReport':
+                if (this.instance.hasOwnProperty(i.Path)) {
+                  i.fileList = this.instance[i.Path]
+                }
+                if (picObject[i.InfoPointName]) {
+
+                } else {
+                  picObject[i.InfoPointName] = []
+                }
+
+                picObject[i.InfoPointName].push({
+                  ...i,
+                })
+                break
+            }
+          }
+
+        })
+        //展示文件
+        this.exhibitionFile.list = picObject
+      },
+      changeRadio(val) { //1,需采集,2,有值,3,全部
+        this.handleRadios(val)
+        this.currentRadio = val
+      },
+      formatDate(str) {
+        return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+      },
+      displayData(arr) {//对数据进行处理传给组件展示
+        const result = {}
+        arr.forEach(i => {
+          if (this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
+            i.value = this.instance[i.Path]
+          }
+          if (i.InputMode == 'C5') {
+            if (this.instance.hasOwnProperty(i.Path)) {
+             let time = this.instance[i.Path]
+              i.value = this.formatDate(time)
+            }
+          }
+          if (i.DataSource && i.DataSource.length) {
+            let source = JSON.parse(i.DataSource)
+            //判断输入类型
+            if (i.InputMode == 'D1L') {
+              let d1l = tools.formatDataSource(i.DataSource)
+              d1l.forEach(k => {
+                if (k.Code == this.instance[i.Path]) {
+                  i.value = k.Name
+                }
+              })
+            } else if (i.InputMode == 'D2' || i.InputMode == 'C6') {
+              if (this.instance.hasOwnProperty(i.Path)) {
+                if (!Array.isArray(this.instance[i.Path])) {
+                  let transArray = this.instance[i.Path].split(',')
+                  i.value = source.filter(item => transArray.includes(item.Code)).map(item => item.Name).join(',')
+                }
+              }
+            }
+            source.forEach(j => {
+              if (j.Code == this.instance[i.Path]) {
+                console.log(j.Name)
+                i.value = j.Name
+              }
+            })
+          }
+          switch (i.InputMode) {
+            case "L":
+            case "L1":
+            case "L2":
+            case "M":
+              break;
+            default:
+              if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+                result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  Value: i.value,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode:i.InputMode
+                })
+              } else {
+                result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                  paths: [{
+                    Path: i.Path,
+                    InfoPointName: i.InfoPointName,
+                    InfoPointCode: i.InfoPointCode,
+                    Value: i.value,
+                    Visible: i.Visible,
+                    KeyWord: i.KeyWord,
+                    InputMode:i.InputMode
+                  }]
+                }
+              }
+
+          }
+
+
+        })
+        this.exhibitionBaseInformation.information = result
+        this.exhibitionCrux.allMessage = result
+      },
+      goBack () {
+        this.$router.push({
+          name: 'propertyLedger',
+          params: {
+            Family: this.type
+          }
+        })
+      },
+      // 切换实例
+      handleChangeExample() {
+        this.selectRadio.initRadio = '1'
+        this.getData();
+      },
+    },
+    watch: {
+      projectId() {
+        this.$router.push({path: "/ledger/property"})
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .tableDisplay {
+    .header {
+      padding-bottom: 10px;
+      .details-title {
+        color: #333;
+        font-size: 16px;
+        margin-left: 20px;
+        line-height: 32px;
+      }
+    }
+
+    .content {
+      display: flex;
+      flex-direction: row;
+      box-sizing: border-box;
+      height: calc(100% - 95px);
+      .content-left {
+        display: flex;
+        flex-direction: column;
+        flex: 1;
+        .content-keyPoint {
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          height: 100px;
+          margin-bottom: 10px;
+          overflow: hidden;
+          background: #FFFFFF;
+        }
+        .content-showType {
+          height: 50px;
+          border: 1px solid #ccc;
+          border-bottom: none;
+          box-sizing: border-box;
+          background: #FFFFFF;
+        }
+        .content-point {
+          display: flex;
+          flex-direction: row;
+          height: calc(100% - 160px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          background: #FFFFFF;
+          .content-point-left {
+            flex: 1;
+          }
+        }
+      }
+      .content-right {
+        width: 400px;
+        margin-left: 10px;
+        .content-media {
+          height: 100%;
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+        }
+      }
+    }
+
+    .footer {
+      margin-top: 5px;
+      height: 45px;
+      background-color: #fff;
+      box-sizing: border-box;
+      border: 1px solid #ccc;
+    }
+  }
+
+  /deep/ .el-scrollbar__wrap {
+    overflow-x: hidden;
+  }
+
+</style>

+ 448 - 36
src/views/ledger/spacelist/spaceDetail/index.vue

@@ -3,7 +3,7 @@
     <div class="condition">
       <div class="header">
         <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
-        <span>{{spaceDetails.RoomLocalName||spaceDetails.RoomName||''}}</span>
+        <span>{{exampleData.RoomLocalName||exampleData.RoomName||''}}</span>
       </div>
       <el-row class="spaceTypes">
         <div class="types">
@@ -17,8 +17,47 @@
           <el-button size="small" @click="deleteSpace">删除业务空间</el-button>
         </div>
       </el-row>
-      <div v-if="activeTab=='detail'" style="height:calc(100% - 110px)">
-        <iframe height="100%" width="100%" :src="iframeSrc"></iframe>
+      <div v-if="activeTab=='detail'"  class="content">
+        <iframe v-if="params.isMyTab == 1" height="100%" width="100%" :src="iframeSrc"></iframe>
+        <div v-else class="content-left">
+          <div class="content-showType">
+            <selectRadio
+              :selectRadio="selectRadio"
+              @changeRadio="changeRadio"
+            />
+          </div>
+          <div class="content-point">
+            <div class="content-point-left">
+              <el-scrollbar style="height:100%;">
+                <div >
+                  <exhibitionBaseInformation :exhibitionBaseInformation="exhibitionBaseInformation"/>
+                </div>
+              </el-scrollbar>
+            </div>
+            <div class="content-point-right">
+              <el-scrollbar style="height:100%;">
+                <div>
+                  <exhibitionEnergy :exhibitionEnergy="exhibitionEnergy" />
+                </div>
+              </el-scrollbar>
+            </div>
+          </div>
+        </div>
+        <div class="content-right">
+          <div class="content-repair">
+            <exhibitionMaintain :exhibitionMaintain="exhibitionMaintain"/>
+
+          </div>
+          <div class="content-media">
+            <el-scrollbar style="height:100%;">
+              <div >
+                <exhibitionImage :exhibitionImage="exhibitionImage"/>
+                <exhibitionVideo :exhibitionVideo="exhibitionVideo"/>
+                <exhibitionFile :exhibitionFile="exhibitionFile"/>
+              </div>
+            </el-scrollbar>
+          </div>
+        </div>
       </div>
       <!-- 空间内设备列表--服务于空间的设备 -->
       <eqToSpaceTable v-else-if="activeTab=='Equipment' || activeTab=='EquipmentFor'" :params="params" :type="activeTab"></eqToSpaceTable>
@@ -30,42 +69,114 @@
 </template>
 
 <script>
-import { mapGetters } from "vuex"
-import { zoneQuery, zoneCreate } from '@/api/scan/request'
-import eqToSpaceTable from '@/components/business_space/newTables/eqToSpaceTable'
-import syInSpaceTable from '@/components/business_space/newTables/syInSpaceTable'
-export default {
-  data() {
-    return {
-      params: {}, //参数-包含空间id 分区类型 进入方式(1-平面图 2-列表)
-      tabsList: [
-        { Code: 'detail', Name: '空间详情' },
-        { Code: 'Equipment', Name: '空间内设备' },
-        { Code: 'EquipmentFor', Name: '服务于空间的设备' },
-        { Code: 'generalSystem', Name: '空间内系统' },
-      ], //tab页
-      activeTab: 'detail', //当前选中的tab
-      spaceDetails: {}, //空间信息
-      iframeSrc: '', //空间详情iframe
-    }
+  import {mapGetters} from "vuex";
+  import tools from "@/utils/scan/tools";
+  import {deleteZone, getDataDictionary, zoneQuery} from '@/api/scan/request';
+
+  import eqToSpaceTable from '@/components/business_space/newTables/eqToSpaceTable';
+  import syInSpaceTable from '@/components/business_space/newTables/syInSpaceTable';
+  import exhibitionBaseInformation from "@/components/ledger/details/detail/exhibitionBaseInformation";
+  import exhibitionFile from "@/components/ledger/details/detail/exhibitionFile";
+  import exhibitionImage from "@/components/ledger/details/detail/exhibitionImage";
+  import exhibitionVideo from "@/components/ledger/details/detail/exhibitionVideo";
+  import exhibitionCrux from "@/components/ledger/details/detail/exhibitionCrux";
+  import exhibitionEnergy from "@/components/ledger/details/detail/exhibitionEnergy";
+  import exhibitionMaintain from "@/components/ledger/details/detail/exhibitionMaintain";
+  import selectRadio from "@/components/ledger/details/detail/selectRadio";
+
+
+  export default {
+    data() {
+      return {
+        params: {}, //参数-包含空间id 分区类型 进入方式(1-平面图 2-列表)
+        tabsList: [
+          {Code: 'detail', Name: '空间详情'},
+          {Code: 'Equipment', Name: '空间内设备'},
+          {Code: 'EquipmentFor', Name: '服务于空间的设备'},
+          {Code: 'generalSystem', Name: '空间内系统'},
+        ], //tab页
+        activeTab: 'detail', //当前选中的tab
+        pointData: [], //信息点数据
+        exampleData: {}, //实例数据
+        criterias: [], //动态参数
+        instance: {},
+        iframeSrc: '', //空间详情iframe
+        selectRadio: {
+          information: '设备信息点',
+          initRadio: '1',
+          radioList: [
+            {
+              value: '显示需采集信息点',
+              label: '1'
+            },
+            {
+              value: '显示有值信息点',
+              label: '2'
+            },
+            {
+              value: '显示全部信息点',
+              label: '3'
+            }
+          ]
+        },
+        exhibitionBaseInformation: {
+          information: {},
+          style:2
+        },
+        exhibitionEnergy: {
+          title: '能耗信息',
+          dynamic: [],
+        },
+        exhibitionMaintain: {
+          title: '维修/维保记录'
+        },
+        exhibitionFile: {
+          title: '文件',
+          list: {}
+        },
+        exhibitionCrux: {
+          title: '关键信息点:',
+          cruxArray: [],
+          allMessage: [],//全部信息点
+        },
+        exhibitionImage: {
+          title: '图片',
+          list: {}
+        },
+        exhibitionVideo: {
+          title: '视频',
+          list: {}
+        }
+      }
   },
   computed: {
     ...mapGetters("layout", ["projectId", "userId", "secret"])
   },
   components: {
     eqToSpaceTable,
-    syInSpaceTable
+    syInSpaceTable,
+    exhibitionBaseInformation,
+    exhibitionFile,
+    exhibitionVideo,
+    exhibitionImage,
+    exhibitionMaintain,
+    selectRadio,
+    exhibitionCrux,
+    exhibitionEnergy
   },
   created() {
     this.params = this.$route.query;
-    this.getSpaceDetails();
-    this.setFrame()
+    this.getData();
+    this.setFrame();
   },
   mounted() { },
   watch: {
     projectId() { }
   },
   methods: {
+    deepCopy(obj) {
+      return JSON.parse(JSON.stringify(obj))
+    },
     // 返回
     goBack() {
       this.$router.push({
@@ -74,20 +185,262 @@ export default {
       })
     },
     // 查询空间详情
-    getSpaceDetails() {
-      let pa = {
-        Filters: `RoomID="${this.params.RoomID}"`,
+    getData() {
+      let params1 = {
+        data: {
+          Orders: "sort asc",
+          PageNumber: 1,
+          PageSize: 1000
+        },
+        type: this.params.zone
+      }, params2 = {
+        Filters: `RoomID='${this.params.RoomID}'`,
         ZoneType: this.params.zone
+      };
+      let promise1 = new Promise((resolve, reject) => {
+        getDataDictionary(params1, res => {
+          resolve(res)
+        })
+      })
+      let promise2 = new Promise((resolve, reject) => {
+        zoneQuery(params2, res => {
+          resolve(res)
+        })
+      })
+      Promise.all([promise1, promise2]).then(values => {
+        this.pointData = values[0].Content;
+        this.exampleData = values[1].Content[0];
+
+        let obj = this.deepCopy(values[1].Content[0]);
+        obj = tools.flattenKeys(obj);
+        this.instance = obj;
+        this.handleRadios(1)
+        this.pointData.forEach(item => {
+          if (item.InputMode == "L" || item.InputMode == "L1" || item.InputMode == "L2" || item.InputMode == "M") {
+            let cur = tools.dataForKey(this.exampleData, item.Path);
+            if (cur) {
+              this.criterias.push({
+                id: exampleData.EquipID,
+                code: item.InfoPointCode
+              })
+            }
+          }
+        })
+        let params = { //获取动态参数
+          secret: this.secret,
+          ProjId: this.projectId,
+          data: {
+            criterias: this.criterias
+          }
+        }
+        if (this.criterias.length) {
+          BeatchQueryParam(params, res => {
+            res.Content.map(child => {
+              this.pointData.forEach(head => {
+                if (head.InfoPointCode == child.code) {
+                  this.exhibitionEnergy.dynamic.push({
+                    InfoPointCode: head.InfoPointCode,
+                    InfoPointName: head.InfoPointName,
+                    Path: head.Path,
+                    value: child.value,
+                    data: child.data || '--',
+                    receivetime: child.receivetime || '',
+                    error: child.error || '',
+                    Unit: head.Unit || ''
+                  })
+                }
+              })
+            });
+          })
+        }
+      })
+    },
+    handleRadios(val) { //判断radio的值显示关键信息,基本信息,图片,文件
+      let arr = []
+      //关键信息点
+      this.exhibitionCrux.cruxArray = this.pointData.filter(i => i.KeyWord)
+      this.exhibitionCrux.cruxArray.map(i => {
+        if (this.instance.hasOwnProperty(i.Path)) {
+          return {
+            ...i,
+            value: this.instance[i.Path]
+          }
+        }
+      })
+      if (val == 1) { //需采集信息
+        arr = this.pointData.filter(i => i.Visible)
+        //  图片和的处理
+        this.handlePicList(arr)
+        //  文件处理
+        this.handleFileList(arr)
+
+      } else if (val == 2) { //有值信息点
+        let list = this.pointData
+        list.map(j => {
+          if (this.instance.hasOwnProperty(j.Path)) {
+            return {
+              ...j,
+              value: this.instance[j.Path]
+            }
+          }
+          arr = list.filter(k => k.value)
+          this.handlePicList(arr)
+          this.handleFileList(arr)
+        })
+      } else { //全部信息点
+        arr = this.pointData
+        this.handlePicList(arr)
+        this.handleFileList(arr)
       }
-      zoneQuery(pa, res => {
-        this.spaceDetails = res.Content[0];
+      this.displayData(arr)
+    },
+    handlePicList(arr) {
+      let picObject = {}
+      //处理数据格式
+      arr.map(i => {
+        if (i.InputMode == 'F2') {
+          switch (i.Path) {
+            case 'LedgerParam.PhotoDoc.Drawing':
+            case 'LedgerParam.Siteinstall.InstallPic':
+            case 'LedgerParam.Siteinstall.InstallDrawing':
+            case 'LedgerParam.PhotoDoc.Nameplate':
+              if (this.instance.hasOwnProperty(i.Path)) {
+                i.PicList = this.instance[i.Path]
+              }
+              if (picObject[i.InfoPointName]) {
+
+              } else {
+                picObject[i.InfoPointName] = []
+              }
+              picObject[i.InfoPointName].push({
+                ...i,
+              })
+              break;
+
+          }
+        }
+
       })
+      //展示图片
+      this.exhibitionImage.list = picObject
+    },
+    handleFileList(arr) {
+      let picObject = {}
+      //处理数据格式
+      arr.map(i => {
+        if (i.InputMode == 'F2') {
+          switch (i.Path) {
+            case 'LedgerParam.InsuranceDoc.InsuranceFile':
+            case 'LedgerParam.PhotoDoc.Archive':
+            case 'LedgerParam.Siteinstall.CheckReport':
+              if (this.instance.hasOwnProperty(i.Path)) {
+                i.fileList = this.instance[i.Path]
+              }
+              if (picObject[i.InfoPointName]) {
+
+              } else {
+                picObject[i.InfoPointName] = []
+              }
+
+              picObject[i.InfoPointName].push({
+                ...i,
+              })
+              break
+          }
+        }
+
+      })
+      //展示文件
+      this.exhibitionFile.list = picObject
+    },
+    changeRadio(val) { //1,需采集,2,有值,3,全部
+      this.handleRadios(val)
+      this.currentRadio = val
+    },
+    formatDate(str) {
+      return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+    },
+    displayData(arr) {//对数据进行处理传给组件展示
+      const result = {}
+      arr.forEach(i => {
+        if (this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
+          i.value = this.instance[i.Path]
+        }
+        if (i.InputMode == 'C5') {
+          if (this.instance.hasOwnProperty(i.Path)) {
+            let time = this.instance[i.Path]
+            i.value = this.formatDate(time)
+          }
+        }
+        if (i.DataSource && i.DataSource.length) {
+          let source = JSON.parse(i.DataSource)
+          //判断输入类型
+          if (i.InputMode == 'D1L') {
+            let d1l = tools.formatDataSource(i.DataSource)
+            d1l.forEach(k => {
+              if (k.Code == this.instance[i.Path]) {
+                i.value = k.Name
+              }
+            })
+          } else if (i.InputMode == 'D2' || i.InputMode == 'C6') {
+            if (this.instance.hasOwnProperty(i.Path)) {
+              if (!Array.isArray(this.instance[i.Path])) {
+                let transArray = this.instance[i.Path].split(',')
+                i.value = source.filter(item => transArray.includes(item.Code)).map(item => item.Name).join(',')
+              }
+            }
+          }
+          source.forEach(j => {
+            if (j.Code == this.instance[i.Path]) {
+              console.log(j.Name, '===name===')
+              i.value = j.Name
+            }
+          })
+        }
+        switch (i.InputMode) {
+          case "L":
+          case "L1":
+          case "L2":
+          case "M":
+            break;
+          default:
+            if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+              result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                Path: i.Path,
+                InfoPointName: i.InfoPointName,
+                InfoPointCode: i.InfoPointCode,
+                Value: i.value,
+                Visible: i.Visible,
+                KeyWord: i.KeyWord,
+                InputMode:i.InputMode
+              })
+            } else {
+              result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                paths: [{
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  Value: i.value,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode:i.InputMode
+                }]
+              }
+            }
+
+        }
+
+
+      })
+      this.exhibitionBaseInformation.information = result
+      this.exhibitionCrux.allMessage = result
     },
     // 设置iframe
     setFrame() {
-      this.iframeSrc = this.params.isMyTab == 2 ?
-        `${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.params.RoomID}&type=0&code=${this.params.zone}`
-        : `${process.env.BASE_URL}:8889/#/changeMess?perjectId=${this.projectId}&secret=${this.secret}&id=${this.params.RoomID}&type=${this.params.zone}`;
+      this.iframeSrc = `${process.env.BASE_URL}:8889/#/changeMess?perjectId=${this.projectId}&secret=${this.secret}&id=${this.params.RoomID}&type=${this.params.zone}`;
+      // this.iframeSrc = this.params.isMyTab == 2 ?
+      //   `${process.env.BASE_URL}:8889/#/details?perjectId=${this.projectId}&secret=${this.secret}&FmId=${this.params.RoomID}&type=0&code=${this.params.zone}`
+      //   : `${process.env.BASE_URL}:8889/#/changeMess?perjectId=${this.projectId}&secret=${this.secret}&id=${this.params.RoomID}&type=${this.params.zone}`;
     },
     // 删除业务空间
     deleteSpace() {
@@ -96,8 +449,13 @@ export default {
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        let pa = [{RoomID: this.spaceDetails.RoomID}]
-        zoneCreate(pa, res => {
+        let pa = {
+          data: [{
+            RoomID: this.exampleData.RoomID
+          }],
+          zone: this.params.zone
+        }
+        deleteZone(pa, res => {
           this.$message.success('删除成功')
           this.goBack()
         })
@@ -105,7 +463,8 @@ export default {
         this.getData()
         this.$message("取消删除")
       })
-    }
+    },
+
   }
 };
 </script>
@@ -118,8 +477,8 @@ export default {
     height: 100%;
     flex-direction: column;
     border: 1px solid #dfe6ec;
+    box-sizing: border-box;
     background: #fff;
-    margin-bottom: 10px;
     .header {
       padding-bottom: 10px;
       span {
@@ -146,6 +505,55 @@ export default {
         border-bottom: 1px solid #e4e7ed;
       }
     }
+
+    .content {
+      display: flex;
+      flex-direction: row;
+      box-sizing: border-box;
+      height: calc(100% - 99px);
+      .content-left {
+        display: flex;
+        flex-direction: column;
+        flex: 1;
+        .content-showType {
+          height: 50px;
+          border: 1px solid #ccc;
+          border-bottom: none;
+          box-sizing: border-box;
+        }
+        .content-point {
+          display: flex;
+          flex-direction: row;
+          height: calc(100% - 50px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          .content-point-left {
+            flex: 1;
+          }
+          .content-point-right {
+            width: 400px;
+            border-left: 1px solid #ccc;
+          }
+        }
+      }
+      .content-right {
+        width: 400px;
+        margin-left: 10px;
+        .content-repair {
+          height: 50px;
+          line-height: 50px;
+          margin-bottom: 10px;
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+        }
+        .content-media {
+          height: calc(100% - 60px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+        }
+      }
+    }
+
     .main {
       margin-top: 10px;
       height: calc(100% - 96px);
@@ -153,6 +561,10 @@ export default {
     .footer {
       margin-bottom: 10px;
     }
+
+    /deep/ .el-scrollbar__wrap {
+      overflow-x: hidden;
+    }
   }
 }
 </style>

+ 375 - 32
src/views/ledger/system/systemDetail/index.vue

@@ -17,8 +17,38 @@
           <el-button size="small" @click="deleteSystem">删除系统</el-button>
         </div>
       </el-row>
-      <div v-if="activeTab=='detail'" style="height:calc(100% - 110px)">
-        <div>开发中...</div>
+      <div v-if="activeTab=='detail'" class="content">
+        <div class="content-left">
+          <div class="content-showType">
+            <selectRadio
+              :selectRadio="selectRadio"
+              @changeRadio="changeRadio"
+            />
+          </div>
+          <div class="content-point">
+            <div class="content-point-left">
+              <el-scrollbar style="height:100%;">
+                <div>
+                  <exhibitionBaseInformation :exhibitionBaseInformation="exhibitionBaseInformation"/>
+                </div>
+              </el-scrollbar>
+            </div>
+          </div>
+        </div>
+        <div class="content-right">
+          <div class="content-repair">
+            <exhibitionMaintain :exhibitionMaintain="exhibitionMaintain"/>
+          </div>
+          <div class="content-media">
+            <el-scrollbar style="height:100%;">
+              <div>
+                <exhibitionImage :exhibitionImage="exhibitionImage"/>
+                <exhibitionVideo :exhibitionVideo="exhibitionVideo"/>
+                <exhibitionFile :exhibitionFile="exhibitionFile"/>
+              </div>
+            </el-scrollbar>
+          </div>
+        </div>
       </div>
       <!-- 系统内设备 -->
       <deviceTable v-if="activeTab=='Equipment'" :params="params" :type="activeTab"></deviceTable>
@@ -31,26 +61,91 @@
 </template>
 
 <script>
-import { mapGetters } from "vuex"
-import { queryLinkSys, deleteGeneralSys, queryDictionaryHead, buildingQuery } from '@/api/scan/request'
-import cenoteTable from '@/components/ledger/system/table/cenoteTable'
-import deviceTable from '@/components/ledger/system/table/deviceTable'
-import spaceTable from '@/components/ledger/system/table/spaceTable'
-export default {
-  data() {
-    return {
-      params: {}, //参数-包含系统id 分区类型
-      tabsList: [
-        { Code: 'detail', Name: '系统详情' },
-        { Code: 'Equipment', Name: '系统内设备' },
-        { Code: 'cenote', Name: '系统所在竖井' },
-        { Code: 'space', Name: '系统所在业务空间' },
-      ], //tab页
-      activeTab: 'detail', //当前选中的tab
-      systemDetails: {}, //系统信息,
-      spaceType: {},//空间种类
-      floorType: {}
-    }
+  import {mapGetters} from "vuex";
+  import {
+    buildingQuery,
+    deleteGeneralSys,
+    getDataDictionary,
+    queryDictionaryHead,
+    queryLinkSys
+  } from '@/api/scan/request';
+
+  import cenoteTable from '@/components/ledger/system/table/cenoteTable';
+  import deviceTable from '@/components/ledger/system/table/deviceTable';
+  import spaceTable from '@/components/ledger/system/table/spaceTable';
+  import exhibitionBaseInformation from "@/components/ledger/details/detail/exhibitionBaseInformation";
+  import exhibitionFile from "@/components/ledger/details/detail/exhibitionFile";
+  import exhibitionImage from "@/components/ledger/details/detail/exhibitionImage";
+  import selectRadio from "@/components/ledger/details/detail/selectRadio";
+  import exhibitionMaintain from "@/components/ledger/details/detail/exhibitionMaintain";
+  import exhibitionVideo from "@/components/ledger/details/detail/exhibitionVideo";
+  import tools from "@/utils/scan/tools"
+
+
+  export default {
+    data() {
+      return {
+        params: {}, //参数-包含系统id 分区类型
+        tabsList: [
+          {Code: 'detail', Name: '系统详情'},
+          {Code: 'Equipment', Name: '系统内设备'},
+          {Code: 'cenote', Name: '系统所在竖井'},
+          {Code: 'space', Name: '系统所在业务空间'},
+        ], //tab页
+        activeTab: 'detail', //当前选中的tab
+        pointData: [], //信息点数据
+        exampleData: {}, //实例数据
+        spaceType: {},//空间种类
+        floorType: {},
+        currentRadio: '',//当前选中的select
+        selectRadio: {
+          information: '设备信息点',
+          initRadio: '1',
+          radioList: [
+            {
+              value: '显示需采集信息点',
+              label: '1'
+            },
+            {
+              value: '显示有值信息点',
+              label: '2'
+            },
+            {
+              value: '显示全部信息点',
+              label: '3'
+            }
+          ]
+        },
+        exhibitionBaseInformation: {
+          information: {},
+          style: 3
+        },
+        exhibitionEnergy: {
+          title: '能耗信息',
+          dynamic: [],
+        },
+        exhibitionMaintain: {
+          title: '维修/维保记录'
+        },
+        exhibitionFile: {
+          title: '文件',
+          list: {}
+        },
+        exhibitionCrux: {
+          title: '关键信息点:',
+          cruxArray: [],
+          allMessage: [],//全部信息点
+        },
+        exhibitionImage: {
+          title: '图片',
+          list: {}
+        },
+        exhibitionVideo: {
+          title: '视频',
+          list: {}
+        },
+        instance: {},//实例信息处理
+      }
   },
   computed: {
     ...mapGetters("layout", ["projectId", "userId", "secret"])
@@ -58,11 +153,17 @@ export default {
   components: {
     cenoteTable,
     deviceTable,
-    spaceTable
+    spaceTable,
+    exhibitionBaseInformation,
+    exhibitionFile,
+    exhibitionImage,
+    selectRadio,
+    exhibitionMaintain,
+    exhibitionVideo
   },
   created() {
     this.params = this.$route.query;
-    this.getSystemDetails();
+    this.getData();
 
     let pa = {
       Filters: `parentId='Space'`
@@ -94,6 +195,7 @@ export default {
         }
       });
     });
+
   },
   mounted() { },
   watch: {
@@ -107,14 +209,209 @@ export default {
         params: this.params
       })
     },
-    // 查询系统详情
-    getSystemDetails() {
-      let pa = {
-        Filters: `SysID="${this.params.SysID}"`
+    // 获取表头和实例数据
+    getData () {
+      let params1 = {
+        data: {
+          Orders: "sort asc",
+          PageNumber: 1,
+          PageSize: 1000
+        },
+        type: this.params.SysType
+      }, params2 = {
+        Filters: `SysID='${this.params.SysID}'`,
+      };
+      let promise1 = new Promise((resolve, reject) => {
+        getDataDictionary(params1, res => {
+          resolve(res)
+        })
+      })
+      let promise2 = new Promise((resolve, reject) => {
+        queryLinkSys(params2, res => {
+          resolve(res)
+        })
+      })
+      Promise.all([promise1, promise2]).then(values => {
+        this.pointData = values[0].Content;
+        this.exampleData = values[1].Content[0];
+        let obj = this.deepCopy(values[1].Content[0]);
+        obj = tools.flattenKeys(obj);
+        this.instance = obj;
+        this.handleRadios(1)
+      })
+    },
+    deepCopy(obj) {
+      return JSON.parse(JSON.stringify(obj))
+    },
+    handleRadios(val) { //判断radio的值显示关键信息,基本信息,图片,文件
+      let arr = []
+      if (val == 1) { //需采集信息
+        arr = this.pointData.filter(i => i.Visible)
+        //  图片和的处理
+        this.handlePicList(arr)
+        //  文件处理
+        this.handleFileList(arr)
+
+      } else if (val == 2) { //有值信息点
+        let list = this.pointData
+        list.map(j => {
+          if (this.instance.hasOwnProperty(j.Path)) {
+            return {
+              ...j,
+              value: this.instance[j.Path]
+            }
+          }
+          arr = list.filter(k => k.value)
+          this.handlePicList(arr)
+          this.handleFileList(arr)
+        })
+      } else { //全部信息点
+        arr = this.pointData
+        this.handlePicList(arr)
+        this.handleFileList(arr)
       }
-      queryLinkSys(pa, res => {
-        this.systemDetails = res.Content[0];
+      this.displayData(arr)
+    },
+    handlePicList(arr) {
+      let picObject = {}
+      //处理数据格式
+      arr.map(i => {
+        if(i.InputMode == 'F2') {
+          switch (i.Path) {
+            case 'LedgerParam.PhotoDoc.Drawing':
+            case 'LedgerParam.Siteinstall.InstallPic':
+            case 'LedgerParam.Siteinstall.InstallDrawing':
+            case 'LedgerParam.PhotoDoc.Nameplate':
+              if (this.instance.hasOwnProperty(i.Path)) {
+                i.PicList = this.instance[i.Path]
+              }
+              if (picObject[i.InfoPointName]) {
+
+              } else {
+                picObject[i.InfoPointName] = []
+              }
+              picObject[i.InfoPointName].push({
+                ...i,
+              })
+              break;
+
+          }
+        }
+
+      })
+      //展示图片
+      this.exhibitionImage.list = picObject
+    },
+    handleFileList(arr) {
+      let picObject = {}
+      //处理数据格式
+      arr.map(i => {
+        if (i.InputMode == 'F2') {
+          switch (i.Path) {
+            case 'LedgerParam.InsuranceDoc.InsuranceFile':
+            case 'LedgerParam.PhotoDoc.Archive':
+            case 'LedgerParam.Siteinstall.CheckReport':
+              if (this.instance.hasOwnProperty(i.Path)) {
+                i.fileList = this.instance[i.Path]
+              }
+              if (picObject[i.InfoPointName]) {
+
+              } else {
+                picObject[i.InfoPointName] = []
+              }
+
+              picObject[i.InfoPointName].push({
+                ...i,
+              })
+              break
+          }
+        }
+
       })
+      //展示文件
+      this.exhibitionFile.list = picObject
+    },
+    changeRadio(val) { //1,需采集,2,有值,3,全部
+      this.handleRadios(val)
+      this.currentRadio = val
+    },
+    formatDate(str) {
+      return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+    },
+    displayData(arr) {//对数据进行处理传给组件展示
+      const result = {}
+      arr.forEach(i => {
+        if (this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
+          i.value = this.instance[i.Path]
+        }
+        if (i.InputMode == 'C5') {
+          if (this.instance.hasOwnProperty(i.Path)) {
+            let time = this.instance[i.Path]
+            i.value = this.formatDate(time)
+          }
+        }
+        if (i.DataSource && i.DataSource.length) {
+          let source = JSON.parse(i.DataSource)
+          //判断输入类型
+          if (i.InputMode == 'D1L') {
+            let d1l = tools.formatDataSource(i.DataSource)
+            d1l.forEach(k => {
+              if (k.Code == this.instance[i.Path]) {
+                i.value = k.Name
+              }
+            })
+          } else if (i.InputMode == 'D2' || i.InputMode == 'C6') {
+            if (this.instance.hasOwnProperty(i.Path)) {
+              if (!Array.isArray(this.instance[i.Path])) {
+                let transArray = this.instance[i.Path].split(',')
+                i.value = source.filter(item => transArray.includes(item.Code)).map(item => item.Name).join(',')
+              }
+            }
+          }
+          source.forEach(j => {
+            if (j.Code == this.instance[i.Path]) {
+              console.log(j.Name)
+              i.value = j.Name
+            }
+          })
+        }
+        switch (i.InputMode) {
+          case "L":
+          case "L1":
+          case "L2":
+          case "M":
+            break;
+          default:
+            if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+              result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                Path: i.Path,
+                InfoPointName: i.InfoPointName,
+                InfoPointCode: i.InfoPointCode,
+                Value: i.value,
+                Visible: i.Visible,
+                KeyWord: i.KeyWord,
+                InputMode:i.InputMode
+              })
+            } else {
+              result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                paths: [{
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  Value: i.value,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode:i.InputMode
+                }]
+              }
+            }
+
+        }
+
+
+      })
+      this.exhibitionBaseInformation.information = result
+      this.exhibitionCrux.allMessage = result
     },
     // 删除系统
     deleteSystem() {
@@ -124,7 +421,7 @@ export default {
         type: 'warning'
       }).then(() => {
         let pa = [{
-          SysID: this.systemDetails.SysID
+          SysID: this.exampleData.SysID
         }]
         this.removeSys(pa)
       }).catch(() => {
@@ -150,7 +447,7 @@ export default {
     flex-direction: column;
     border: 1px solid #dfe6ec;
     background: #fff;
-    margin-bottom: 10px;
+    box-sizing: border-box;
     .header {
       padding-bottom: 10px;
       span {
@@ -177,6 +474,49 @@ export default {
         border-bottom: 1px solid #e4e7ed;
       }
     }
+    .content {
+      display: flex;
+      flex-direction: row;
+      box-sizing: border-box;
+      height: calc(100% - 99px);
+      .content-left {
+        display: flex;
+        flex-direction: column;
+        flex: 1;
+        .content-showType {
+          height: 50px;
+          border: 1px solid #ccc;
+          border-bottom: none;
+          box-sizing: border-box;
+        }
+        .content-point {
+          display: flex;
+          flex-direction: row;
+          height: calc(100% - 50px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+          .content-point-left {
+            flex: 1;
+          }
+        }
+      }
+      .content-right {
+        width: 400px;
+        margin-left: 10px;
+        .content-repair {
+          height: 50px;
+          line-height: 50px;
+          margin-bottom: 10px;
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+        }
+        .content-media {
+          height: calc(100% - 60px);
+          border: 1px solid #ccc;
+          box-sizing: border-box;
+        }
+      }
+    }
     .main {
       margin-top: 10px;
       height: calc(100% - 96px);
@@ -184,6 +524,9 @@ export default {
     .footer {
       margin-bottom: 10px;
     }
+    /deep/ .el-scrollbar__wrap {
+      overflow-x: hidden;
+    }
   }
 }
 </style>