浏览代码

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

zhangyu 4 年之前
父节点
当前提交
9989cdcc24
共有 65 个文件被更改,包括 2246 次插入594 次删除
  1. 1 1
      package.json
  2. 13 0
      src/api/model/file.js
  3. 14 0
      src/api/topo/index.js
  4. 二进制
      src/assets/image/model/arrowBlue.png
  5. 二进制
      src/assets/image/model/arrowGray.png
  6. 二进制
      src/assets/image/model/arrowGreen.png
  7. 二进制
      src/assets/image/model/columnBlue.png
  8. 二进制
      src/assets/image/model/columnGray.png
  9. 二进制
      src/assets/image/model/columnGreen.png
  10. 二进制
      src/assets/image/model/delModelBlue.png
  11. 二进制
      src/assets/image/model/delModelGray.png
  12. 二进制
      src/assets/image/model/downJsonBlue.png
  13. 二进制
      src/assets/image/model/downJsonGray.png
  14. 二进制
      src/assets/image/model/downJsonGreen.png
  15. 二进制
      src/assets/image/model/downModelBlue.png
  16. 二进制
      src/assets/image/model/downModelGray.png
  17. 二进制
      src/assets/image/model/downModelGreen.png
  18. 二进制
      src/assets/image/model/rightDownBlue.png
  19. 二进制
      src/assets/image/model/rightDownGray.png
  20. 二进制
      src/assets/image/model/rightDownGreen.png
  21. 二进制
      src/assets/image/model/upJsonBlue.png
  22. 二进制
      src/assets/image/model/upJsonGray.png
  23. 二进制
      src/assets/image/model/upJsonGreen.png
  24. 二进制
      src/assets/image/model/upModelBlue.png
  25. 二进制
      src/assets/image/model/upModelGray.png
  26. 二进制
      src/assets/image/model/upModelGreen.png
  27. 二进制
      src/assets/image/model/waitingAnlBlue.png
  28. 二进制
      src/assets/image/model/waitingAnlGray.png
  29. 二进制
      src/assets/image/model/waitingAnlGreen.png
  30. 二进制
      src/assets/image/model/waitingManageBlue.png
  31. 二进制
      src/assets/image/model/waitingManageGray.png
  32. 二进制
      src/assets/image/model/waitingManageGreen.png
  33. 二进制
      src/assets/style/iconfont/iconfont.eot
  34. 二进制
      src/assets/style/iconfont/iconfont.ttf
  35. 二进制
      src/assets/style/iconfont/iconfont.woff
  36. 69 64
      src/components/business_space/lib/uploadFiles.vue
  37. 4 0
      src/components/config_point/location_flag.vue
  38. 20 2
      src/components/config_point/step3_edit/index.vue
  39. 46 171
      src/components/dialogs/list/batchDialog.vue
  40. 78 36
      src/components/dialogs/list/filesDialog.vue
  41. 4 2
      src/components/dialogs/list/picDialog.vue
  42. 28 22
      src/components/dialogs/list/uploadImgDialog.vue
  43. 2 2
      src/components/ledger/details/detail/exhibitionBaseInformation.vue
  44. 32 13
      src/components/ledger/details/detail/exhibitionEnergy.vue
  45. 12 7
      src/components/ledger/details/detail/exhibitionEnergyT.vue
  46. 275 8
      src/components/ledger/handsontables/assets.vue
  47. 160 97
      src/components/ledger/handsontables/device.vue
  48. 69 56
      src/components/ledger/lib/uploadFiles.vue
  49. 22 12
      src/components/model/file/floorTable.vue
  50. 135 0
      src/components/model/file/nodeDialog.vue
  51. 86 0
      src/components/model/file/pathCard.vue
  52. 6 6
      src/components/point/report/objectInstance.vue
  53. 7 0
      src/router/system.js
  54. 0 1
      src/utils/scan/tools.js
  55. 二进制
      src/views/business_space/dataUtil/1.jpg
  56. 二进制
      src/views/business_space/dataUtil/2.jpg
  57. 二进制
      src/views/business_space/dataUtil/3.jpg
  58. 219 23
      src/views/business_space/dataUtil/topology.vue
  59. 12 36
      src/views/ledger/facility/details/index.vue
  60. 54 26
      src/views/ledger/spacelist/spaceDetail/index.vue
  61. 873 0
      src/views/model/file/pathcontrol/index.vue
  62. 1 1
      src/views/point/config_point/steps/step1.vue
  63. 1 5
      src/views/ready/buildfloor/addFloor/index.vue
  64. 1 3
      src/views/ready/buildfloor/index.vue
  65. 2 0
      src/views/relation/data/index.vue

+ 1 - 1
package.json

@@ -23,7 +23,7 @@
     "@saga-web/cad-engine": "2.0.560",
     "@saga-web/draw": "2.1.75",
     "@saga-web/graphy": "2.1.47",
-    "@saga-web/topology": "1.0.70",
+    "@saga-web/topology": "1.0.77",
     "axios": "^0.18.0",
     "echarts": "^4.1.0",
     "el-cascader-multi": "^1.1.8",

+ 13 - 0
src/api/model/file.js

@@ -2,6 +2,7 @@ import httputils from '@/api/scan/httpUtil'
 import { Message } from 'element-ui';
 import axios from 'axios'
 const baseUrl = '/modelapi';
+const revitUrl = '/schedulerapi';
 
 let api = {
     // 新建模型文件夹
@@ -329,4 +330,16 @@ export function querySyncLogCount(param, success) {
 export function queryFileByModelId(param, success) {
     let url = `${baseUrl}/model-file/query`;
     httputils.postJson(url, param, success)
+}
+
+// 模型流程监控
+export function modelPathControl(param, success) {
+    let url = `${baseUrl}/model-monitor/query`;
+    httputils.postJson(url, param, success)
+}
+
+// 模型流程监控-获取待分配模型数量
+export function unassignQuery(param, success) {
+    let url = `${revitUrl}/task/query`;
+    httputils.postJson(url, param, success)
 }

+ 14 - 0
src/api/topo/index.js

@@ -0,0 +1,14 @@
+import httputils from '@/api/scan/httpUtil'
+const baseUrl = '/api';
+
+// 创建拓扑图
+export function topoCreate(param, success) {
+  let url = `${baseUrl}/datacenter/topo/create`;
+  httputils.postJson(url, param, success)
+}
+
+// 查询拓扑图
+export function topoQuery(param, success) {
+  let url = `${baseUrl}/datacenter/topo/query`;
+  httputils.postJson(url, param, success)
+}

二进制
src/assets/image/model/arrowBlue.png


二进制
src/assets/image/model/arrowGray.png


二进制
src/assets/image/model/arrowGreen.png


二进制
src/assets/image/model/columnBlue.png


二进制
src/assets/image/model/columnGray.png


二进制
src/assets/image/model/columnGreen.png


二进制
src/assets/image/model/delModelBlue.png


二进制
src/assets/image/model/delModelGray.png


二进制
src/assets/image/model/downJsonBlue.png


二进制
src/assets/image/model/downJsonGray.png


二进制
src/assets/image/model/downJsonGreen.png


二进制
src/assets/image/model/downModelBlue.png


二进制
src/assets/image/model/downModelGray.png


二进制
src/assets/image/model/downModelGreen.png


二进制
src/assets/image/model/rightDownBlue.png


二进制
src/assets/image/model/rightDownGray.png


二进制
src/assets/image/model/rightDownGreen.png


二进制
src/assets/image/model/upJsonBlue.png


二进制
src/assets/image/model/upJsonGray.png


二进制
src/assets/image/model/upJsonGreen.png


二进制
src/assets/image/model/upModelBlue.png


二进制
src/assets/image/model/upModelGray.png


二进制
src/assets/image/model/upModelGreen.png


二进制
src/assets/image/model/waitingAnlBlue.png


二进制
src/assets/image/model/waitingAnlGray.png


二进制
src/assets/image/model/waitingAnlGreen.png


二进制
src/assets/image/model/waitingManageBlue.png


二进制
src/assets/image/model/waitingManageGray.png


二进制
src/assets/image/model/waitingManageGreen.png


二进制
src/assets/style/iconfont/iconfont.eot


二进制
src/assets/style/iconfont/iconfont.ttf


二进制
src/assets/style/iconfont/iconfont.woff


+ 69 - 64
src/components/business_space/lib/uploadFiles.vue

@@ -27,7 +27,7 @@
             slot="tip"
             class="el-upload__tip"
             v-if="!readOnly"
-          >请上传文件</div>
+          >请上传文件,且不大于50M</div>
         </span>
 
       </el-upload>
@@ -132,73 +132,78 @@
 
         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.onUploadProgress = function (progressEvent) {
-          let percent = (progressEvent.loaded / progressEvent.total * 100) | 0
-          //调用onProgress方法来显示进度条,需要传递个对象 percent为进度值
-          uploader.onProgress({percent: percent})
+        let size = item.file.size;
+        if( size > 50*1024*1024 ) { //文件大于50M
+          this.$message.error('文件不可大于50M,请重新上传')
+          return false
         }
-        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);
-
-                  if(vm.isShow === 1) {
-                    let oFile = {}
-                    oFile[vm.contextKey] = vm.filesArr
-                    vm.$emit("change", oFile, vm.defined);
+        else {
+          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.onUploadProgress = function (progressEvent) {
+            let percent = (progressEvent.loaded / progressEvent.total * 100) | 0
+            //调用onProgress方法来显示进度条,需要传递个对象 percent为进度值
+            uploader.onProgress({percent: percent})
+          }
+          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);
+
+                    if(vm.isShow === 1) {
+                      let oFile = {}
+                      oFile[vm.contextKey] = vm.filesArr
+                      vm.$emit("change", oFile, vm.defined);
+                    } else {
+                      vm.$emit("change", vm.filesArr, vm.defined);
+                    }
                   } else {
-                    vm.$emit("change", vm.filesArr, vm.defined);
+                    this.$message.error(res.data.ResultMsg)
                   }
-                } else {
-                  this.$message.error(res.data.ResultMsg)
                 }
-              }
-            };
-          }
-        };
-        reader.readAsArrayBuffer(file);
+              };
+            }
+          };
+          reader.readAsArrayBuffer(file);
+        }
       }
     },
     watch: {

+ 4 - 0
src/components/config_point/location_flag.vue

@@ -97,6 +97,10 @@
                     this.$message("请确定输入字符不为空")
                     return false
                 }
+                let flag = this.queryLocaltionArr.map(item => item.Name).indexOf(param.Name) > -1;
+                if (flag) {
+                    return this.$message.warning('已添加过此标签');
+                }
                 addLocaltionFlag(param,res => {
                     this.queryData()
                     this.$message.success("添加成功")

+ 20 - 2
src/components/config_point/step3_edit/index.vue

@@ -131,7 +131,8 @@ export default {
       formulaHandleShow: {},
       splitHandleShow: {},
       dictionaryData: [],
-      typeList: []
+      typeList: [],
+      pointToRelationID: {}, //保存信息点->relationid map
     }
   },
   props: {
@@ -253,6 +254,10 @@ export default {
           //设备-部件-空间
           eachData.EquipmentTypeCode = temp[1]
           eachData.EquipmentType = tempNames[1]
+          let key = `${eachData.TypeCode}-${eachData.EquipmentTypeCode}-${eachData.InfomationPointCode}`
+          if (this.pointToRelationID[key]) {
+            eachData.Id = this.pointToRelationID[key]
+          }
         } else if (temp.length == 4) {
           eachData.SpecialtyCode = temp[1]
           eachData.Specialty = tempNames[1]
@@ -260,6 +265,15 @@ export default {
           eachData.System = tempNames[2]
           eachData.EquipmentTypeCode = eachData.SystemCode  //为了配置从动参取值存储
           eachData.EquipmentType = eachData.System
+          let key = `${eachData.TypeCode}-${eachData.SpecialtyCode}-${eachData.SystemCode}-${eachData.InfomationPointCode}`
+          if (this.pointToRelationID[key]) {
+            eachData.Id = this.pointToRelationID[key]
+          }
+        } else if (temp.length == 2) {
+          let key = `${eachData.TypeCode}-${eachData.InfomationPointCode}`
+          if (this.pointToRelationID[key]) {
+            eachData.Id = this.pointToRelationID[key]
+          }
         }
         let type = t.DataRuleType;
         updateParams.data.Content[0].EquipmentMark = eachData.EquipmentMark
@@ -491,15 +505,19 @@ export default {
       if (length) {
         var data = val.RelationList[0]
         let dict = [data.SpecialtyCode, data.SystemCode, data.EquipmentTypeCode]
-        //回显字典
+        //回显字典--并保存信息点->relationid map
+        this.pointToRelationID = {}
         let tempArr = val.RelationList.map(t => {
           let eachData = [];
           if (t.TypeCode == 'Eq' || t.TypeCode == 'Ec' || t.TypeCode == 'Sp') {
             eachData = [t.TypeCode, t.EquipmentTypeCode, t.InfomationPointCode]
+            this.pointToRelationID[`${t.TypeCode}-${t.EquipmentTypeCode}-${t.InfomationPointCode}`] = t.Id
           } else if (t.TypeCode == 'Sy') {
             eachData = [t.TypeCode, t.SpecialtyCode, t.SystemCode, t.InfomationPointCode]
+            this.pointToRelationID[`${t.TypeCode}-${t.SpecialtyCode}-${t.SystemCode}-${t.InfomationPointCode}`] = t.Id
           } else {
             eachData = [t.TypeCode, t.InfomationPointCode]
+            this.pointToRelationID[`${t.TypeCode}-${t.InfomationPointCode}`] = t.Id
           }
           return eachData;
         })

+ 46 - 171
src/components/dialogs/list/batchDialog.vue

@@ -44,7 +44,7 @@
               :key="index"
           >
             <span @click="fourVendors(city.code)"> {{city.name}}:</span>
-            <span>{{city.rname}}</span>
+            <span :title="city.rname">{{city.rname | filterImgNames}}</span>
           </el-checkbox>
         </el-checkbox-group>
       </section>
@@ -61,125 +61,20 @@
         </el-radio-group>
         <div style="margin: 15px "></div>
         <div class="checkbox">
-          <p>
+          <p v-for="(item,index) in newEnclosure">
             <el-checkbox
-                v-model="videoModel.archive"
-                @change="multiple('archive')"
-            > <!--设备文档-->
-              {{information.archive.name}}
+              v-model="form[item.Path]"
+            >
+            <span  @click="multiple(item.Path)">{{item.InfoPointName}}</span>
             </el-checkbox>
             <span
-                class="text-color"
-                v-for="item in information.archive.Archive"
-            >{{item.Name | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.checkReport"
-                @change="multiple('checkReport')"
-            ><!--安装质检报告-->
-              {{information.checkReport.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.checkReport.CheckReport"
-            >{{item.Name | filterImgName}}</span>
-
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.drawing"
-                @change="multiple('drawing')"
-            ><!--设备图纸-->
-              {{information.drawing.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.drawing.Drawing"
-            >{{item.Key | filterImgName}}</span>
+              class="text-color"
+              v-for="i in item.value"
+            >{{i.Name | filterImgName}}</span>
 
           </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.installDrawing"
-                @change="multiple('installDrawing')"
-            ><!--安装图纸-->
-              {{information.installDrawing.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.installDrawing.InstallDrawing"
-            >{{item.Key | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.installPic"
-                @change="multiple('installPic')"
-            ><!--安装照片-->
-              {{information.installPic.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.installPic.InstallPic"
-            >{{item.Key | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.insuranceFile"
-                @change="multiple('insuranceFile')"
-            ><!--保险文件-->
-              {{information.insuranceFile.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.insuranceFile.InsuranceFile"
-            >{{item.Name | filterImgName}}</span>
-
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.pic"
-                @change="multiple('pic')"
-            ><!--设备照片-->
-              {{information.pic.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.pic.Pic"
-            >{{item.Key | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.nameplate"
-                @change="multiple('nameplate')"><!--设备铭牌照片-->
-              {{information.nameplate.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.nameplate.Nameplate"
-            >{{item.Key | filterImgName}}</span>
-          </p>
         </div>
-<!--        test-->
-<!--        <br><br>-->
-<!--        <div class="checkbox">-->
-<!--          <p v-for="(item,index) in newEnclosure">-->
-<!--            <el-checkbox-->
-<!--              v-model="item.Path"-->
-<!--              @change="multiple(item.InfoPointCode)"-->
-<!--            > &lt;!&ndash;设备文档&ndash;&gt;-->
-<!--              {{item.InfoPointName}}-->
-<!--            </el-checkbox>-->
-<!--&lt;!&ndash;            <span&ndash;&gt;-->
-<!--&lt;!&ndash;              class="text-color"&ndash;&gt;-->
-<!--&lt;!&ndash;              v-for="item in information.archive.Archive"&ndash;&gt;-->
-<!--&lt;!&ndash;            >{{item.Name | filterImgName}}</span>  &ndash;&gt;-->
-<!--            <span-->
-<!--              class="text-color"-->
-<!--            ></span>-->
-<!--          </p>-->
-<!--        </div>-->
-<!--        /test-->
+
       </section>
       <el-button
           class="next-step"
@@ -242,13 +137,14 @@
 
 <script>
   import myPagination from "@/components/ledger/lib/myPagination"
-
+  import tools from "@/utils/buildfloor/tools";
   export default {
     name: "batchDialog",
     props: ['firmName', 'allObject', 'page', 'information','newEnclosure'],
     components: {myPagination},
     data() {
       return {
+        form:{},
         batchDialog: false,//dialog
         active: 0,//进度条
         checkAll: false,//全选
@@ -295,7 +191,15 @@
       information() {
         return this.information
       },
-
+      newEnclosure:{
+        immediate:true,
+        handler(val){
+          this.newEnclosure = val
+        }
+      }
+    },
+    created() {
+      this.$forceUpdate()
     },
     computed: {
       newFirm() {
@@ -328,11 +232,18 @@
     },
     filters: {
       filterImgName(value) {
-        if (value.length > 16) {
+        if (value && value.length > 16) {
           return value.substring(0, 12) + '...'
         } else {
           return value
         }
+      } ,
+      filterImgNames(value) {
+        if (value && value.length > 16) {
+          return value.substring(0, 16) + '...'
+        } else {
+          return value
+        }
       }
     },
     methods: {
@@ -470,58 +381,32 @@
         }
 
         // this.information 多选信息
-        let {archive, checkReport, drawing, installDrawing, installPic, insuranceFile, nameplate, pic} = this.information
-        let multiple = {
-          InsuranceDoc: insuranceFile.InsuranceFile.length || this.videoModel.insuranceFile ? {
-            InsuranceFile: (insuranceFile.InsuranceFile.length && this.videoModel.insuranceFile) ? insuranceFile.InsuranceFile : undefined
-          } : undefined,
-          PhotoDoc: archive.Archive.length || drawing.Drawing.length || nameplate.Nameplate.length || pic.Pic.length ? {
-            Archive: (archive.Archive.length && this.videoModel.archive) ? archive.Archive : undefined,
-            Drawing: (drawing.Drawing.length && this.videoModel.drawing) ? drawing.Drawing : undefined,
-            Nameplate: (nameplate.Nameplate.length && this.videoModel.nameplate) ? nameplate.Nameplate : undefined,
-            Pic: (pic.Pic.length && this.videoModel.pic) ? pic.Pic : undefined
-          } : undefined,
-          Siteinstall: installPic.InstallPic.length || installDrawing.InstallDrawing.length || checkReport.CheckReport.length ? {
-            InstallPic: (installPic.InstallPic.length && this.videoModel.installPic) ? installPic.InstallPic : undefined,
-            InstallDrawing: (installDrawing.InstallDrawing.length && this.videoModel.installDrawing) ? installDrawing.InstallDrawing : undefined,
-            CheckReport: (checkReport.CheckReport.length && this.videoModel.checkReport) ? checkReport.CheckReport : undefined
-          } : undefined
-        }
-        let LedgerParam = {}
+        let valuable = [], newValuable  = []
+        valuable = this.newEnclosure.filter(i=>this.form[i.Path] && i.value ).forEach(({ InfoPointCode, value }) => newValuable[InfoPointCode] = value);
+        // console.log( newValuable,'多选信息')
         if (this.radio === 1) { //组装数据,根据是覆盖该是增量,1是增量
           //    1:单选数据
           let arr1 = this.deepCopy(arr).map(item => ({
             ...Id,
             ...item,
             LedgerParam: {...single}
-
           }))
-          //    2:多选数据
-          let {InsuranceDoc, PhotoDoc, Siteinstall} = multiple
           let arr2 = this.deepCopy(arr).map(item => ({
             ...item,
-            ...InsuranceDoc,
-            ...PhotoDoc,
-            ...Siteinstall
-            // LedgerParam: {...multiple}
+            ...newValuable
           }))
           this.$emit('upDataDevice', 1, arr1, arr2)
-
         }
         if (this.radio === 2) {
-          let {InsuranceDoc, PhotoDoc, Siteinstall} = multiple
-          LedgerParam = {
-            ...single,
-            ...PhotoDoc,
-            ...Siteinstall
-          };
+          let param = {}
+          this.newEnclosure.forEach(({Path,value})=>param[Path] = value)
+          param =  tools.formatData(param)
           let arr3 = this.deepCopy(arr).map(item => ({
             ...Id,
             ...item,
-            LedgerParam: {...LedgerParam}
+            ...param
           }))
           this.$emit('upDataDevice', 2, arr3)
-
         }
         this.closeDialog()
       },
@@ -541,26 +426,13 @@
         this.onlySelect = []
         // this.deviceList = []
         this.radio = 1 //返回到默认增量
-        // this.multipleSelection = [] //清空实例内容
-        this.videoModel = {
-          archive: false,
-          checkReport: false,
-          drawing: false,
-          installDrawing: false,
-          insuranceFile: false,
-          installPic: false,
-          nameplate: false,
-          pic: false
+        //清空附件信息
+        for(let i in this.form)  {
+          this.form[i] = false
         }
-        let {archive, checkReport, drawing, installDrawing, installPic, insuranceFile, nameplate, pic} = this.information
-        archive.Archive = []
-        checkReport.CheckReport = []
-        drawing.Drawing = []
-        installDrawing.InstallDrawing = []
-        installPic.InstallPic = []
-        insuranceFile.InsuranceFile = []
-        nameplate.Nameplate = []
-        pic.Pic = []
+          this.newEnclosure.map(i=>{
+          this.$set(i,'value',[])
+        })
       },
       handleSelectionChange(val) {
         this.multipleSelection = val
@@ -569,7 +441,7 @@
         this.$emit('getAllData')
       },
       multiple(val) {
-        this.$emit('multiple', val)
+        this.$emit('multiples',val)
       },
 
       deepCopy(obj) {
@@ -581,6 +453,9 @@
 
 <style scoped lang="less">
   .batchContainer {
+    /deep/ .el-table-column--selection .cell {
+      padding: 0;
+    }
     /deep/ .el-step__description {
       margin: 2% 0;
     }

+ 78 - 36
src/components/dialogs/list/filesDialog.vue

@@ -19,29 +19,29 @@
     </el-dialog>
 </template>
 <script>
-    import uploadFiles from "@/components/ledger/lib/uploadFiles";
+  import uploadFiles from "@/components/ledger/lib/uploadFiles";
 
-    export default {
-        components: {
-            uploadFiles
-        },
-        props: {
-            dialog: {
-                type: Object,
-                default: function () {
-                    return {
-                        uploadFiles: false
-                    };
-                }
-            },
-            keysArr: {
-                type: Array,
-                default: function () {
-                    return []
-                }
-            },
-            read: {
-                type: Boolean,
+  export default {
+    components: {
+      uploadFiles
+    },
+    props: {
+      dialog: {
+        type: Object,
+        default: function () {
+          return {
+            uploadFiles: false
+          };
+        }
+      },
+      keysArr: {
+        type: Array,
+        default: function () {
+          return []
+        }
+      },
+      read: {
+        type: Boolean,
                 default: false
             },
             firmDataType: {
@@ -68,20 +68,62 @@
             changeItem(file) {
                 if (this.firmDataType === 'dialog') {
                     let info = this.infoType;
-                    switch (info) {
-                        case 'archive':
-                            this.information.archive.Archive = file
-                            this.$emit("changeFile", this.information, this.firmDataType)
-                            break
-                        case 'checkReport':
-                            this.information.checkReport.CheckReport = file
-                            this.$emit("changeFile", this.information, this.firmDataType)
-                            break
-                        case 'insuranceFile':
-                            this.information.insuranceFile.InsuranceFile = file
-                            this.$emit("changeFile", this.information, this.firmDataType)
-                            break
-                    }
+                  switch (info) {
+                    case 'archive':
+                      this.information.archive.Archive = file
+                      this.$emit("changeFile", this.information, this.firmDataType)
+                      break
+                    case 'checkReport':
+                      this.information.checkReport.CheckReport = file
+                      this.$emit("changeFile", this.information, this.firmDataType)
+                      break
+                    case 'insuranceFile':
+                      this.information.insuranceFile.InsuranceFile = file
+                      this.$emit("changeFile", this.information, this.firmDataType)
+                      break;
+                    case 'LedgerParam.InsuranceDoc.InsuranceFile': //保险文件
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.Archive': //设备文档
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.Siteinstall.CheckReport': //安装质检报告
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.OperationMainte.MaintainManual': //维修保养手册
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.SupplyPurchase.ApproachingAcceptance': //进场验收单
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.SupplyPurchase.AcceptanceReport': //验收报告
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.OperationManual': //操作说明书
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.EquipManufactor.OriginalCertificate': //原厂证明
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.EquipManufactor.TestReport': //检测报告
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.ProductCertification': //产品合格证
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.Siteinstall.InstallInstruction': //安装说明书
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.Drawing': //设备图纸
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.Siteinstall.InstallDrawing': //安装图纸
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.SupplyPurchase.SupplierContract': //供应合同
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                  }
                 } else {
                     this.$emit("changeFile", file, this.firmDataType)
 

+ 4 - 2
src/components/dialogs/list/picDialog.vue

@@ -107,8 +107,10 @@
         let panoramas = this.panoramaArr
         this.changeKeys = picsArr.concat(videos).concat(videoPics).concat(panoramas)
         if (this.firmDataType === 'dialog') {
-          this.information.pic.Pic = this.changeKeys
-          this.$emit("change", this.information, this.firmDataType)
+          // this.information.pic.Pic = this.changeKeys
+          // this.$emit("change", this.information, this.firmDataType)
+          // this.$emit("change", this.information, this.firmDataType, this.changeKeys)
+          this.$emit("change", this.infoType, this.firmDataType, this.changeKeys)
         } else {
           this.$emit("change", this.changeKeys)
 

+ 28 - 22
src/components/dialogs/list/uploadImgDialog.vue

@@ -10,19 +10,19 @@
   </el-dialog>
 </template>
 <script>
-    import uploadImgs from "@/components/ledger/lib/uploadImgs";
+  import uploadImgs from "@/components/ledger/lib/uploadImgs";
 
-    export default {
-        components: {
-            uploadImgs
-        },
-        props: {
-            dialog: {
-                type: Object,
-                default: function () {
-                    return {
-                        uploadImgs: true
-                    };
+  export default {
+    components: {
+      uploadImgs
+    },
+    props: {
+      dialog: {
+        type: Object,
+        default: function () {
+          return {
+            uploadImgs: true
+          };
                 }
             },
             keysArr: {
@@ -66,16 +66,22 @@
                     break
                 case 'installDrawing':
                     this.information.installDrawing.InstallDrawing = file
-                    this.$emit('changeFile', this.information, this.firmDataType)
-                    break
-                case 'nameplate':
-                    this.information.nameplate.Nameplate = file
-                    this.$emit('changeFile', this.information, this.firmDataType)
-                    break
-                case 'drawing':
-                    this.information.drawing.Drawing = file
-                    this.$emit('changeFile', this.information, this.firmDataType)
-                    break
+                  this.$emit('changeFile', this.information, this.firmDataType)
+                  break
+              case 'nameplate':
+                this.information.nameplate.Nameplate = file
+                this.$emit('changeFile', this.information, this.firmDataType)
+                break
+              case 'drawing':
+                this.information.drawing.Drawing = file
+                this.$emit('changeFile', this.information, this.firmDataType)
+                break
+              case 'LedgerParam.Siteinstall.InstallPic':
+                this.$emit("changeFile", info, this.firmDataType, file)
+                break
+              case 'LedgerParam.PhotoDoc.Nameplate':
+                this.$emit("changeFile", info, this.firmDataType, file)
+                break
             }
         } else {
             this.$emit("changeFile", file)

+ 2 - 2
src/components/ledger/details/detail/exhibitionBaseInformation.vue

@@ -49,7 +49,7 @@
             >下载</a>
           </div>
         </div>
-        <el-button slot="reference" type="text">{{value.Value? '有':'-'}}</el-button>
+        <el-button slot="reference" type="text">{{value.Value.length >0 ? '有':'-'}}</el-button>
       </el-popover>
       <el-popover
         v-else-if="Array.isArray(value.Value) && value.InputMode=='N2'"
@@ -61,7 +61,7 @@
         <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-button slot="reference" type="text">{{value.Value.length >0  ? '有' :'-'}}</el-button>
       </el-popover>
       <el-popover
         v-else-if="value.Value && value.Value.length  && `${value.InfoPointName}:${value.Value}`.length>21 "

+ 32 - 13
src/components/ledger/details/detail/exhibitionEnergy.vue

@@ -1,19 +1,29 @@
 <template>
   <div class="exhibition-energy">
     <div class="title">
-      <section>
-        <h4 class="base" v-show="exhibitionEnergy.firstName">{{exhibitionEnergy.firstName}}</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>
+      <section v-for="(val,key,i) in exhibitionEnergy.list">
+        <h4 class="base">{{key}}</h4>
+        <div class="table-dynamic" v-for="(value,keys,index) in val.paths">
+            <div class="table-title"> {{value.InfoPointName}}:</div>
+          <p :style="{'color':value.value? '' :'#F56C6C'}">{{value.value? `表号功能号:${value.value} `:'未维护'}}</p>
+          <p v-if="value.data">{{value.data}}{{value.Unit}}</p>
+<!--          <p v-else-if="value.error">{{value.error}}</p>-->
+          <el-popover
+            v-else-if="value.error"
+            placement="right"
+            width="160"
+            trigger="hover">
+            <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">错误原因</p>
+            <p>{{value.error}}</p>
+            <div style="text-align: center; margin: 0">
+              <el-button type="text" size="mini" @click="handleCopy(value.error)">复制</el-button>
             </div>
-          </div>
+            <el-button slot="reference" type="text" style="color:#F56C6C">error</el-button>
+          </el-popover>
+          <p v-else>--</p>
+
+          <p>{{value.receivetime ? formatDate(value.receivetime):'--'}}</p>
         </div>
-         <div v-else style="text-align: center;margin-top: 200px">暂无数据</div>
       </section>
     </div>
   </div>
@@ -26,7 +36,16 @@
     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) :'--'
-      }
+      },
+      handleCopy(data) {
+        let oInput = document.createElement('input')
+        oInput.value = data
+        document.body.appendChild(oInput)
+        oInput.select()
+        document.execCommand('Copy')
+        this.$message.success('复制成功')
+        oInput.remove()
+      },
     }
   }
 </script>
@@ -41,7 +60,7 @@
     }
 
     .table-dynamic {
-      height: 85px;
+      /*height: 85px;*/
       width: 100%;
       margin: 5px 0;
       padding-left: 20px;

+ 12 - 7
src/components/ledger/details/detail/exhibitionEnergyT.vue

@@ -1,14 +1,19 @@
 <template>
   <div class="exhibition-energy">
     <div class="title">
-      <section v-for="(val,key,i) in exhibitionEnergy.list">
-        <h4 class="base">{{key}}</h4>
-        <div class="table-dynamic" v-for="(value,keys,index) in val.paths">
-            <div class="table-title"> {{value.InfoPointName}}:</div>
-          <p :style="{'color':value.value? '' :'#F56C6C'}">{{value.value? `表号功能号:${value.value} `:'未维护'}}</p>
-          <p>{{value.data ? value.data :value.error}} {{value.Unit}}</p>
-          <p>{{value.receivetime ? formatDate(value.receivetime):'--'}}</p>
+      <section>
+        <h4 class="base" v-show="exhibitionEnergy.firstName">{{exhibitionEnergy.firstName}}</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;margin-top: 200px">暂无数据</div>
       </section>
     </div>
   </div>

+ 275 - 8
src/components/ledger/handsontables/assets.vue

@@ -15,14 +15,16 @@
         <el-option v-for="item in showTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
       </el-select>
       <el-button size="small" style="width: 80px;" @click="addDevice" icon="iconfont icon-tianjia">添加资产</el-button>
+<!--      <el-button size="small" @click="Batch" v-show="!onlyRead" :disabled="!(tableData && tableData.length)">批量维护信息点-->
+<!--      </el-button>-->
       <el-button size="small" style="width: 80px;" @click="reset" icon="iconfont icon-shuaxin">刷新</el-button>
       <el-button v-show="!onlyRead" size="small" style="width: 80px;" @click="undo" icon="iconfont icon-undo">撤销
       </el-button>
     </div>
     <qrcode :qrcodeUrl="qrcodeUrl" :dialog="myDialog" :addBody="true" ref="qrcode"/>
-    <firm ref="firm" :mess="mess" @changeFirm="firmChange" :dialog="myDialog"/>
+    <firm   :firmDataType="firmDataType" ref="firm" :mess="mess" @changeFirm="firmChange" :dialog="myDialog"/>
     <supply-dialog @change="supplyChange" ref="supply" :id="id" :dialog="myDialog"/>
-    <supplier-dialog ref="supplier" @changeSupplier="supplierChange" :dialog="myDialog"/>
+    <supplier-dialog   :firmDataType="firmDataType" ref="supplier" @changeSupplier="supplierChange" :dialog="myDialog"/>
     <guarantee-dialog @change="guaranteeChange" :id="id" ref="guarantee" :dialog="myDialog"/>
     <upload-files-dialog
         :read="onlyRead ? true : false"
@@ -30,24 +32,34 @@
         @changeFile="fileChange"
         :keysArr="filesArr"
         :dialog="myDialog"
+        :firmDataType="firmDataType"
     />
     <upload-img-dialog
         :read="onlyRead ? true : false"
         @changeFile="imgChange"
         :keysArr="imgsArr"
         :dialog="myDialog"
+        :firmDataType="firmDataType"
     />
     <maintainer-dialog
         @changeMaintainer="changeMaintainer"
         ref="maintainer"
         :dialog="myDialog"
+        :firmDataType="firmDataType"
     />
     <insurer-dialog
         @changeInsurer="changeInsurer"
         ref="insurer"
         :dialog="myDialog"
+        :firmDataType="firmDataType"
+    />
+    <pic-dialog
+      :read="onlyRead ? true : false"
+      :dialog="myDialog"
+      :keysArr="picsArr"
+      @change="changePics"
+      :firmDataType="firmDataType"
     />
-    <pic-dialog :read="onlyRead ? true : false" :dialog="myDialog" :keysArr="picsArr" @change="changePics"/>
     <div class="center middle_sty" style="height: 91%" v-show="!mess.deviceId && (!tableData || !tableData.length)">
       <p>
         <i class="icon-wushuju iconfont"></i>
@@ -105,6 +117,18 @@
         <el-button v-show="showAddByDie" type="primary" :disabled="dieNum == 0" @click="createByDie">批量创建</el-button>
       </span>
     </el-dialog>
+    <!--      维护信息弹窗-->
+    <batchDialog
+      ref="batchDialogs"
+      @code="fourVendors"
+      :firmName="firmName"
+      :allObject="allObject"
+      :page="batchPage"
+      :newEnclosure="newEnclosure"
+      @getAllData="getAllData"
+      @multiples="multiples"
+      @upDataDevice="upDataDevice"
+    />
   </div>
 </template>
 <script>
@@ -115,7 +139,10 @@
     deleteProperty,
     getDataDictionary,
     propertyLinkEq,
-    updateProperty
+    updateProperty,
+    queryEquip, //替换掉
+    queryUpdate,//替换掉
+    updateEquip//替换掉
   } from "@/api/scan/request";
 
   import tools from "@/utils/scan/tools"
@@ -143,6 +170,7 @@
   import lookPic from "@/components/ledger/lib/lookImages"
   import Handsontable from "handsontable-pro"
   import 'handsontable-pro/dist/handsontable.full.css'
+  import batchDialog from "../../dialogs/list/batchDialog";
   //下拉插件
   // import "@/assets/js/chosen.jquery.min";
   // import "@/assets/js/handsontable-chosen-editor";
@@ -165,7 +193,8 @@
       floorCascader,
       dieCascader,
       // detailsDialog,
-      lookPic
+      lookPic,
+      batchDialog
     },
     created() {
       buildFloor.getData(this.buildFloorData)
@@ -180,6 +209,16 @@
     },
     data() {
       return {
+        batchPage: {
+          size: 50,
+          sizes: [10, 30, 50, 100, 150, 200],
+          total: 0,
+          currentPage: 1
+        },
+        newEnclosure:[],
+        firmName: '',//维护信息显示厂家名称
+        firmDataType: 'row',
+        allObject: [],
         options: [{
           value: true,
           label: '只读模式'
@@ -278,6 +317,9 @@
               }
             })
             this.getTableData()
+            this.getTableData()
+            //  信息维护
+            this.newEnclosure = res.Content.filter(i=>i.InputMode =='F2')
           });
         }
       },
@@ -316,14 +358,64 @@
             this.copyMain = tools.deepCopy(this.tableData)
             this.page.total = res.Total
             if (this.tableData && this.tableData.length) {
-              // if (this.onlyRead) {
-              //   this.getBatch(this.tableData)
-              // }
+              if (this.onlyRead) {
+                this.getBatch(this.tableData)
+              }
               this.initTable()
             }
           })
         }
       },
+      //获取所以主体数据---用于维护信息
+      getAllData() {
+        if (!!this.mess.deviceId) {
+          //   查询step2
+          let params = {
+            "Cascade": [
+              {
+                "Name": "property",
+                "Projection": [
+                  "Family", "EquipLocalName", "EquipLocalID", "EquipID", "CodeType"
+                ]
+              },
+              {
+                "Name": "building",
+                "Projection": [
+                  "BuildLocalName", "BuildName", "BuildID"
+                ]
+              },
+              {
+                "Name": "floor",
+                "Projection": [
+                  "FloorLocalName", "FloorName", "FloorID"
+                ]
+              }
+            ],
+            Filters: `category='${this.mess.deviceId}'`,
+            PageSize: this.batchPage.size,
+            Orders: "createTime desc, EquipID desc",
+            PageNumber: this.batchPage.currentPage,
+            "Projection": [
+              "BuildingId", "FloorId", "Category", "EquipLocalName", "EquipLocalID", "EquipID", "BIMID"
+            ]
+          };
+          if (this.mess.buildId == "noKnow") {
+            params.Filters += `;buildingId isNull`
+          } else if (this.mess.buildId && this.mess.buildId != "all") {
+            params.Filters += `;buildingId='${this.mess.buildId}'`
+          }
+
+          if (this.mess.floorId == "noKnow") {
+            params.Filters += `;floorId isNull`
+          } else if (this.mess.floorId && this.mess.floorId != "all") {
+            params.Filters += `;floorId='${this.mess.floorId}'`
+          }
+          queryEquip(params, res => {
+            this.allObject = res.Content
+            this.batchPage.total = res.Total
+          })
+        }
+      },
       //获取动态参数
       getBatch(data) {
         let param = {
@@ -1074,6 +1166,181 @@
         this.graphyId = graphyId
         this.assetGroupList = assetGroupList
       },
+      //    批量信息维护
+      Batch() {
+        this.firmDataType = 'dialog'
+        this.$refs.batchDialogs.batchDialog = true
+      },
+      //  接受维护信息传来的code,显示弹窗
+      fourVendors(code) {
+        this.firmDataType = 'dialog'
+        switch (code) {
+          //品牌型号弹窗
+          case 'DPManufacturerID':
+            // this.dataFirmType = 'dia'
+            this.myDialog.firm = true;
+            break;
+          //供应商信息弹窗
+          case 'DPSupplierID':
+            this.myDialog.supplier = true;
+            break;
+          //维修商信息弹窗
+          case 'DPMaintainerID':
+            this.myDialog.maintainer = true;
+            break;
+          //保险公司信息
+          case 'DPInsurerID':
+            this.myDialog.insurer = true;
+            break;
+        }
+      },
+      forValue(arr, val) {
+        let enclosure = []
+        arr && arr.length && arr.map(i => {
+          if (i.Path == val) {
+            enclosure = i.value
+          }
+        })
+        return enclosure
+      },
+      multiples(val) {
+        this.firmDataType = 'dialog'
+        switch (val) {
+          case 'LedgerParam.InsuranceDoc.InsuranceFile': //保险文件
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.Archive': //设备文档
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.CheckReport': //安装质检报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.OperationMainte.MaintainManual': //维修保养手册
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.SupplyPurchase.ApproachingAcceptance': //进场验收单
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.SupplyPurchase.AcceptanceReport': //验收报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.OperationManual': //操作说明书
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.EquipManufactor.OriginalCertificate': //原厂证明
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.EquipManufactor.TestReport': //检测报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.ProductCertification': //产品合格证
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallInstruction': //安装说明书
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.Drawing': //设备图纸
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallDrawing': //安装图纸
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.SupplyPurchase.SupplierContract': //供应合同
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallPic':
+            this.imgsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
+            this.myDialog.uploadImgs = true;
+            break;
+          case 'LedgerParam.PhotoDoc.Nameplate':
+            this.imgsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
+            this.myDialog.uploadImgs = true;
+            break;
+          //设备照片
+          case 'LedgerParam.PhotoDoc.Pic':
+            this.picsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
+            this.myDialog.pic = true;
+            break;
+        }
+      },
+      upDataDevice(type, data1, data2) {
+        let param = {Content: data1}
+        let param1 = {Content: data2}
+        if (type === 1) { //增量
+          //LedgerParam
+          let filterParam = this.filterCheck(param, 'sole')
+          let filterParam1 = this.filterCheck(param1, 'multiple')
+          if (filterParam) {
+            updateEquip(param, res => {
+            });
+          }
+          if (filterParam1) {
+            setTimeout(() => {
+              queryUpdate(param1, res => {
+              })
+            })
+
+          }
+        }
+        if (type === 2) {//覆盖
+          let filterParams = this.filterCheck(param, 'sole')
+          if (filterParams) {
+            updateEquip(param, res => {
+            });
+          }
+        }
+        setTimeout(() => {
+          this.getTableData()
+          this.getAllData()
+        }, 10)
+      },
+      filterCheck(arr, type) {
+        if (type === 'sole') {
+          for (let i of arr.Content) {
+            return Object.keys(i.LedgerParam).length
+          }
+        } else if (type === 'multiple') {
+          let  nArr = [];
+          arr.Content.forEach(i => {
+            let {EquipID, ...value} = i
+            nArr.push({LedgerParam: value})
+          })
+          for (let j of nArr) {
+            return Object.keys(j.LedgerParam).length
+          }
+        }
+      }
     },
     watch: {
       projectId() {

+ 160 - 97
src/components/ledger/handsontables/device.vue

@@ -124,16 +124,16 @@
     </el-dialog>
     <!--      维护信息弹窗-->
     <batchDialog
-        ref="batchDialogs"
-        @code="fourVendors"
-        :firmName="firmName"
-        :allObject="allObject"
-        :page="batchPage"
-        :information="information"
-        :newEnclosure="newEnclosure"
-        @getAllData="getAllData"
-        @multiple="multiple"
-        @upDataDevice="upDataDevice"
+      ref="batchDialogs"
+      @code="fourVendors"
+      :firmName="firmName"
+      :allObject="allObject"
+      :page="batchPage"
+      :information="information"
+      :newEnclosure="newEnclosure"
+      @getAllData="getAllData"
+      @multiples="multiples"
+      @upDataDevice="upDataDevice"
     />
   </div>
 </template>
@@ -922,63 +922,106 @@
             break;
         }
       },
-      multiple(val) {
+      forValue(arr, val) {
+        let enclosure = []
+        arr && arr.length && arr.map(i => {
+          if (i.Path == val) {
+            enclosure = i.value
+          }
+        })
+        return enclosure
+      },
+      multiples(val) {
         this.firmDataType = 'dialog'
         switch (val) {
-          //设备文档--安装质检报告--保险文件
-          case 'archive':
-            let adata = this.information.archive.Archive;
-            this.filesArr = adata ? adata : [];
-            this.infoType = 'archive';
+          case 'LedgerParam.InsuranceDoc.InsuranceFile': //保险文件
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
             this.myDialog.uploadFiles = true;
             break;
-          case 'checkReport':
-            let cdata = this.information.checkReport.CheckReport;
-            this.filesArr = cdata ? cdata : [];
-            this.infoType = 'checkReport'
+          case 'LedgerParam.PhotoDoc.Archive': //设备文档
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
             this.myDialog.uploadFiles = true;
             break;
-          case 'insuranceFile':
-            let idata = this.information.insuranceFile.InsuranceFile;
-            this.filesArr = idata ? idata : [];
-            this.infoType = 'insuranceFile';
+          case 'LedgerParam.Siteinstall.CheckReport': //安装质检报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
             this.myDialog.uploadFiles = true;
             break;
-          //安装照片--安装图纸--设备铭牌照片--设备图纸
-          case 'installPic':
-            let insData = this.information.installPic.InstallPic;
-            this.imgsArr = insData ? insData : [];
-            this.infoType = 'installPic';
-            this.myDialog.uploadImgs = true;
+          case 'LedgerParam.OperationMainte.MaintainManual': //维修保养手册
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
             break;
-          case 'installDrawing':
-            let drawData = this.information.installDrawing.InstallDrawing;
-            this.imgsArr = drawData ? drawData : [];
-            this.infoType = 'installDrawing';
-            this.myDialog.uploadImgs = true;
+          case 'LedgerParam.SupplyPurchase.ApproachingAcceptance': //进场验收单
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
             break;
-          case 'nameplate':
-            let nDate = this.information.nameplate.Nameplate;
-            this.imgsArr = nDate ? nDate : [];
-            this.infoType = 'nameplate';
+          case 'LedgerParam.SupplyPurchase.AcceptanceReport': //验收报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.OperationManual': //操作说明书
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.EquipManufactor.OriginalCertificate': //原厂证明
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.EquipManufactor.TestReport': //检测报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.ProductCertification': //产品合格证
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallInstruction': //安装说明书
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.Drawing': //设备图纸
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallDrawing': //安装图纸
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+            case 'LedgerParam.SupplyPurchase.SupplierContract': //供应合同
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallPic':
+            this.imgsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
             this.myDialog.uploadImgs = true;
             break;
-          case 'drawing':
-            let dDate = this.information.drawing.Drawing;
-            this.imgsArr = dDate ? dDate : [];
-            this.infoType = 'drawing';
+          case 'LedgerParam.PhotoDoc.Nameplate':
+            this.imgsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
             this.myDialog.uploadImgs = true;
             break;
           //设备照片
-          case 'pic':
-            let picData = this.information.pic.Pic;
-            this.picsArr = picData ? picData : [];
-            this.infoType = 'pic';
+          case 'LedgerParam.PhotoDoc.Pic':
+            this.picsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
             this.myDialog.pic = true;
             break;
         }
       },
-      //获取到了正确的信息
       getInfors(infos, row, el) {
           let val = this.hot.colToProp(row.col);
           let inputData = this.inputMap[val];
@@ -1295,58 +1338,78 @@
       }
 
     },
-    //修改关联的资产
-    changeProperty(val) {
-      this.setDataToMain(val.PropertyId, 'PropertyId', this.row);
-      this.setDataToMain(val.LinkEquipLocalName, 'LinkEquipLocalName', this.row);
-    },
-    //上传文件弹窗触发事件
-    fileChange(keys, type) {
-      if (type === 'dialog') {
-        this.information = keys
-      } else {
-        this.setDataToMain(keys, this.messKey, this.row);
-      }
-    },
-    //上传图片弹窗触发事件
-    imgChange(keys, type) {
-      if (type === 'dialog') {
-        this.information = keys
-      } else {
-        this.setDataToMain(keys, this.messKey, this.row);
+      //修改关联的资产
+      changeProperty(val) {
+        this.setDataToMain(val.PropertyId, 'PropertyId', this.row);
+        this.setDataToMain(val.LinkEquipLocalName, 'LinkEquipLocalName', this.row);
+      },
+      //上传文件弹窗触发事件
+      fileChange(keys, type, file) {
+        if (type === 'dialog') {
+          // this.information = keys
+          this.newEnclosure.forEach(i => {
+            if (i.Path == keys) {
+              this.$set(i, 'value', file)
+            }
+            return i
+          })
 
-      }
-    },
-    //关联系统更改
-    changeSystemType(data) {
-      tools.setDataForKey(this.tableData[this.row], "LinkSystem", data)
-    },
-    //设备图片弹窗改变事件
-    changePics(keys, type) {
-      if (type === 'dialog') {
-        this.information = keys
-      } else {
-        this.setDataToMain(keys, this.messKey, this.row);
-      }
-    },
-    utilToKey(key, name, data, messName) {
-      if (key == name) {
-        this.setDataToMain(data[key], messName, this.row)
-      }
-    },
-    //判断是否有值,有值赋值
-    setDataToMain(data, key, row) {
-      if (!!data && data != '--') {
-        if (!!this.tableData[row]) {
-          tools.setDataForKey(this.tableData[row], key, data);
-          this.handleUpdataTable([[row, key, null, data]], "edit");
         } else {
-          this.tableData[row] = {};
-          tools.setDataForKey(this.tableData[row], key, data);
+          this.setDataToMain(keys, this.messKey, this.row);
+        }
+        this.$forceUpdate()
+      },
+      //上传图片弹窗触发事件
+      imgChange(keys, type, file) {
+        if (type === 'dialog') {
+          // this.information = keys
+          this.newEnclosure.forEach(i => {
+            if (i.Path == keys) {
+              this.$set(i, 'value', file)
+            }
+            return i
+          })
+        } else {
+          this.setDataToMain(keys, this.messKey, this.row);
+
+        }
+      },
+      //关联系统更改
+      changeSystemType(data) {
+        tools.setDataForKey(this.tableData[this.row], "LinkSystem", data)
+      },
+      //设备图片弹窗改变事件
+      changePics(keys, type,file) {
+        if (type === 'dialog') {
+          // this.information = keys
+          this.newEnclosure.forEach(i => {
+            if (i.Path == keys) {
+              this.$set(i, 'value', file)
+            }
+            return i
+          })
+        } else {
+          this.setDataToMain(keys, this.messKey, this.row);
+        }
+      },
+      utilToKey(key, name, data, messName) {
+        if (key == name) {
+          this.setDataToMain(data[key], messName, this.row)
+        }
+      },
+      //判断是否有值,有值赋值
+      setDataToMain(data, key, row) {
+        if (!!data && data != '--') {
+          if (!!this.tableData[row]) {
+            tools.setDataForKey(this.tableData[row], key, data);
+            this.handleUpdataTable([[row, key, null, data]], "edit");
+          } else {
+            this.tableData[row] = {};
+            tools.setDataForKey(this.tableData[row], key, data);
+          }
+        } else {
+          tools.setDataForKey(this.tableData[row], key, "");
         }
-      } else {
-        tools.setDataForKey(this.tableData[row], key, "");
-      }
     },
     //    批量信息维护
     Batch() {

+ 69 - 56
src/components/ledger/lib/uploadFiles.vue

@@ -8,7 +8,7 @@
   isShow: 图片的显示
  -->
 <template>
-  <div id="saga-upload">
+  <div id="saga-upload" v-loading="loading">
     <div id="uploadFile">
       <el-upload
           class="upload-file"
@@ -27,7 +27,7 @@
             slot="tip"
             class="el-upload__tip"
             v-if="!readOnly"
-        >请上传文件
+        >请上传文件,且不大于50M
         </div>
       </el-upload>
 
@@ -85,7 +85,8 @@
     data() {
       return {
         filesArr: [],
-        isShow: Boolean
+        isShow: Boolean,
+        loading:false
       };
     },
     created() {
@@ -148,61 +149,73 @@
 
         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'
+        let size = item.file.size;
+        if( size > 50*1024*1024 ) { //文件大于50M
+          this.$message.error('文件不可大于50M,请重新上传')
+          return false
+        }
+        else {
+          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) {
+            // 这个事件在读取进行中定时触发
+            let value = (p.loaded / size) * 100;
+            console.log(p.loaded,size,value,'loaded')
+          };
+
+          reader.onload = function () {
+
+            // 这个事件在读取成功结束后触发
+          };
+          reader.onloadend = function () {
+
+            this.loading = false
+            // 这个事件在读取结束后,无论成功或者失败都会触发
+            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);
+                    this.loading =false
+                    vm.$emit("change", vm.filesArr, vm.defined);
+                  } else {
+                    this.$message.error(res.data.ResultMsg)
                   }
-                  vm.filesArr.push(fileObject);
-                  vm.$emit("change", vm.filesArr, vm.defined);
-                } else {
-                  this.$message.error(res.data.ResultMsg)
                 }
-              }
-            };
-          }
-        };
-        reader.readAsArrayBuffer(file);
+              };
+            }
+          };
+          reader.readAsArrayBuffer(file);
+        }
+
       }
     },
     watch: {

+ 22 - 12
src/components/model/file/floorTable.vue

@@ -3,10 +3,14 @@
     <el-table ref="filterTable" :data="tableData" style="width: 100%" height="100%" :header-cell-style="{background:'#d9d9d9',color:'#2b2b2b'}">
       <el-table-column prop="FloorName" label="模型文件" width="180">
         <template slot-scope="scope">
-          <i v-if="scope.row.Status == 4" class="iconfont icon-yun--tianchong" style="color:#67C23A;cursor:pointer;fontSize:18px;" title="模型校验完成..."></i>
-          <i v-else-if="scope.row.Status == 31" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;" title="同步到数据中心出问题..."></i>
-          <i v-else-if="scope.row.Status == 21" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;" title="模型数据导出出问题..."></i>
-          <i v-else class="iconfont icon-yun--tianchong2" style="color:#E6A23C;cursor:pointer;fontSize:18px;" title="模型校验进行中..."></i>
+          <i v-if="scope.row.Status == 4" class="iconfont icon-yun--tianchong" style="color:#67C23A;cursor:pointer;fontSize:18px;" title="模型校验完成..."
+            @click="toPathControl(scope.row)"></i>
+          <i v-else-if="scope.row.Status == 31" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;"
+            title="同步到数据中心出问题..." @click="toPathControl(scope.row)"></i>
+          <i v-else-if="scope.row.Status == 21" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;"
+            title="模型数据导出出问题..." @click="toPathControl(scope.row)"></i>
+          <i v-else class="iconfont icon-yun--tianchong2" style="color:#E6A23C;cursor:pointer;fontSize:18px;" title="模型校验进行中..."
+            @click="toPathControl(scope.row)"></i>
           <span style="margin-left: 10px">{{ scope.row.FloorName }}</span>
         </template>
       </el-table-column>
@@ -26,14 +30,9 @@
             <el-button title="替换模型" type="primary" size="mini" class="iconfont icon-replace" @click="repliaceModel(scope.row)"></el-button>
             <el-button title="查看版本日志" type="primary" size="mini" class="iconfont icon-Log" @click="queryModelLog(scope.row)"></el-button>
           </div>
-          <div
-            :class="['upLoad-loading']"
-            v-show="scope.row.Status != 4">
+          <div :class="['upLoad-loading']" v-show="scope.row.Status != 4">
             <div class="progress">
-              <el-progress
-                :text-inside="false"
-                :stroke-width="20" :percentage="100"
-                :color="scope.row.Status?'#909399':'#67C23A'"></el-progress>
+              <el-progress :text-inside="false" :stroke-width="20" :percentage="100" :color="scope.row.Status?'#909399':'#67C23A'"></el-progress>
             </div>
             <div class="progress-right">
               <span v-if="!scope.row.Status">上传中...</span>
@@ -121,7 +120,7 @@ export default {
     },
     // 下载模型文件
     downloadModel(item) {
-      let url = item.Url.match(/(\/image-service\S*)$/g)?item.Url.match(/(\/image-service\S*)$/g)[0]:''
+      let url = item.Url.match(/(\/image-service\S*)$/g) ? item.Url.match(/(\/image-service\S*)$/g)[0] : ''
       if (url) {
         let a = document.createElement("a");
         a.href = url;
@@ -144,6 +143,17 @@ export default {
           type: "error"
         });
       }
+    },
+    // 跳转至模型流程处理监控
+    toPathControl(row) {
+      this.$router.push({
+        path: '/model/path',
+        query: {
+          Id: row.CurrentModelId,
+          Size: row.Size,
+          OriginalName: row.OriginalName
+        }
+      })
     }
   },
   watch: {

+ 135 - 0
src/components/model/file/nodeDialog.vue

@@ -0,0 +1,135 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="500px" id="nodeDialog">
+    <div class="node-des">
+      <p>节点检查说明</p>
+      <div class="gray-border">
+        <div v-if='checkType=="firstCheck"||checkType=="secondCheck"'>
+          <p>强制检查项</p>
+          <p v-for="(t,i) in check[checkType].checkList" :key='i'>
+            <i class="el-icon-check" v-if="!t.check"></i>
+            <i class="el-icon-close" v-else></i>
+            {{t.name}}
+          </p>
+          <p>非强制检查项</p>
+          <p v-for="(t,i) in check[checkType].notCheckList" :key='-i-1'>
+            <i class="el-icon-check" v-if="!t.check"></i>
+            <i class="el-icon-close" v-else></i>
+            {{t.name}}
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="result-des" v-if="0">
+      <p>处理结果</p>
+      <div class="gray-border"></div>
+    </div>
+    <div class="err-des">
+      <p>错误说明</p>
+      <div>{{errMsg}}</div>
+    </div>
+  </el-dialog>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      title: '节点名称',
+      check: {
+        firstCheck: {
+          checkList: [
+            { name: '楼层平面图命名规范检查', check: false },
+            { name: '项目长度单位检查', check: false },
+          ],
+          notCheckList: [
+            { name: '楼层缺失检查', check: false },
+            { name: '构件范围检查', check: false },
+            { name: '设备族编码检查', check: false },
+            { name: '部件所在位置检查', check: false },
+            { name: '柱边界检查', check: false },
+            { name: '连接件检查', check: false },
+            { name: '系统类型名称检查', check: false },
+            { name: '未在空间中的设备', check: false },
+            { name: '管段检查', check: false },
+            { name: '管网及相关设备检查', check: false },
+            { name: 'Revit族参数完整性检查', check: false },
+            { name: 'xyz坐标重叠检查', check: false }
+          ],
+        },
+        secondCheck: {
+          checkList: [
+            { name: '楼层标高与楼层顺序号检查', check: false, value: 'LevelCheck' },
+            { name: '轴网检查', check: false, value: 'GridCheck' }
+          ],
+          notCheckList: [],
+        }
+      },
+      errMsg: '',
+      checkType: ''
+    };
+  },
+  methods: {
+    showDialog(msg, type) {
+      this.errMsg = msg.ErrorMsg || '';
+      this.checkType = type || '';
+      if (type) {
+        this.check[type].checkList.forEach(t => {
+          if (t.value && t.value == 'GridCheck') {
+            t.check = msg.GridCheck || false
+          }
+          if (t.value && t.value == 'LevelCheck') {
+            t.check = msg.LevelCheck || false
+          }
+        })
+      }
+      this.dialogVisible = true;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#nodeDialog {
+  .node-des,
+  .result-des {
+    color: #89969f;
+    & > div {
+      min-height: 50px;
+      padding: 5px;
+      p {
+        font-size: 12px;
+        i {
+          margin: 0 5px 0 0;
+        }
+      }
+    }
+    & > p {
+      margin: 5px 0;
+    }
+  }
+  .err-des {
+    color: #ff6660;
+    & > div {
+      border: 1px solid #ff6660;
+      min-height: 50px;
+    }
+  }
+  .gray-border {
+    border: 1px solid #dedee0;
+  }
+  .red-border {
+    border: 1px solid #ff6660;
+  }
+  .el-icon-check {
+    font-size: 14px;
+    color: #4cba38;
+  }
+  .el-icon-close {
+    font-size: 14px;
+    color: #ff6660;
+  }
+  /deep/ .el-dialog__body {
+    max-height: 400px;
+    overflow-y: auto;
+  }
+}
+</style>

+ 86 - 0
src/components/model/file/pathCard.vue

@@ -0,0 +1,86 @@
+<template>
+  <div
+    :class="{'pathCard':true,'borderB':data.BeginTime&&!data.EndTime,'borderY':!data.EndTime&&!data.HasError&&data.HasRetry,'borderR':!data.EndTime&&data.HasError}"
+    @click="cardClick">
+    <div class="path-title">
+      <i v-if="!data.BeginTime" class="iconfont icon-iconfontgengduo" style="color:#333333"></i>
+      <i v-else-if="data.BeginTime&&!data.EndTime" class="iconfont icon-conduct" style="color:#409eff"></i>
+      <i v-else class="el-icon-success" style="color:#67C23A"></i>
+      {{title}}
+      <i v-if="data.HasError" class="iconfont icon-Error pos" style="color:#ff7c77"></i>
+      <i v-else-if="data.HasRetry" class="iconfont icon-trouble pos" style="color:#fcc636"></i>
+    </div>
+    <div class="path-content">
+      <slot></slot>
+      <p v-if="!isCustomize">耗时: {{data.TakeTime||'--'}}</p>
+      <p v-if="!isCustomize">开始时间: {{data.BeginTime||'--'}}</p>
+      <p v-if="!isCustomize">结束时间: {{data.EndTime||'--'}}</p>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      default: '提示'
+    },
+    data: {
+      type: Object,
+      default: {}
+    },
+    isCustomize: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+    }
+  },
+  methods: {
+    cardClick() {
+      this.$emit('click', this.data, this.title);
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.pathCard {
+  width: 296px;
+  height: 144px;
+  border: 1px solid transparent;
+  box-shadow: 0 2px 11px 0 rgba(0, 0, 0, 0.1);
+  border-radius: 4px;
+  &.borderY {
+    border-color: #fcc636;
+  }
+  &.borderR {
+    border-color: #ff7c77;
+  }
+  &.borderB {
+    border-color: #409eff;
+  }
+  .path-title {
+    position: relative;
+    background-color: #f3f5f6;
+    font-size: 14px;
+    padding: 5px 10px;
+    i {
+      margin-right: 5px;
+      &.pos {
+        position: absolute;
+        top: -1px;
+        right: 18px;
+        font-size: 24px;
+        line-height: 1;
+      }
+    }
+  }
+  .path-content {
+    font-size: 12px;
+    padding: 4px 10px 0;
+    color: #acb5bb;
+  }
+}
+</style>

+ 6 - 6
src/components/point/report/objectInstance.vue

@@ -94,8 +94,8 @@ export default {
                     /** Y坐标 */
                     Y: -equipMsg.Content[0].LocationJson.Y
                   }
-                  that.forms[key].ObjectLocalName = res.Content[0].EquipLocalName
-                  that.forms[key].ObjectLocalCode = res.Content[0].EquipLocalID
+                  that.forms[key].ObjectLocalName = equipMsg.Content[0].EquipLocalName
+                  that.forms[key].ObjectLocalCode = equipMsg.Content[0].EquipLocalID
                   this.loadDataToInstanceByFloorID(equipMsg.Content[0].FloorId, key, item.TypeCode, canvasOption);
                 }
               })
@@ -111,8 +111,8 @@ export default {
                     RoomID: zoneMsg.Content[0].RoomID,
                     Color: '#F9C3C3'
                   }
-                  that.forms[key].ObjectLocalName = res.Content[0].RoomLocalName
-                  that.forms[key].ObjectLocalCode = res.Content[0].RoomLocalID
+                  that.forms[key].ObjectLocalName = zoneMsg.Content[0].RoomLocalName
+                  that.forms[key].ObjectLocalCode = zoneMsg.Content[0].RoomLocalID
                   this.loadDataToInstanceByFloorID(zoneMsg.Content[0].FloorId, key, item.TypeCode, canvasOption);
                 }
               });
@@ -131,8 +131,8 @@ export default {
                     /** Y坐标 */
                     Y: -equipMsg.Content[0].LocationJson.Y
                   }
-                  that.forms[key].ObjectLocalName = res.Content[0].EquipLocalName
-                  that.forms[key].ObjectLocalCode = res.Content[0].EquipLocalID
+                  that.forms[key].ObjectLocalName = equipMsg.Content[0].EquipLocalName
+                  that.forms[key].ObjectLocalCode = equipMsg.Content[0].EquipLocalID
                   this.loadDataToInstanceByFloorID(equipMsg.Content[0].FloorId, key, item.TypeCode, canvasOption);
                 }
               })

+ 7 - 0
src/router/system.js

@@ -12,6 +12,7 @@ import buildUser from '@/views/ready/appuser'
 import repetitionGraphy from '@/views/ready/buildfloor/repetitionGraphy'
 /**模型管理 */
 import modelFile from '@/views/model/file'
+import pathControl from '@/views/model/file/pathcontrol'
 import modelReport from '@/views/model/report'
 import deleted from '@/views/model/report/deleted'
 import supplement from '@/views/model/report/supplement'
@@ -166,6 +167,12 @@ export default [{
                 meta: { keepAlive: false, breadcrumbs: [{ label: '模型管理', path: '/model/file' }, { label: '模型文件管理' }] }
             },
             {
+                path: 'path',
+                name: 'pathControl',
+                component: pathControl,
+                meta: { keepAlive: false, breadcrumbs: [{ label: '模型管理', path: '/model/file' }, { label: '模型文件管理', path: '/model/file' }, { label: '模型后台处理监控' }] }
+            },
+            {
                 path: 'report',
                 name: 'modelReport',
                 component: modelReport,

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

@@ -557,7 +557,6 @@ tools.setDataForKey = function (data, key, value) {
 tools.flattenKeys = function (obj) {
   if(obj == undefined) return
   let res = {}
-
   function isObject(val) {
     return typeof val === 'object' && !Array.isArray(val)
   }

二进制
src/views/business_space/dataUtil/1.jpg


二进制
src/views/business_space/dataUtil/2.jpg


二进制
src/views/business_space/dataUtil/3.jpg


文件差异内容过多而无法显示
+ 219 - 23
src/views/business_space/dataUtil/topology.vue


+ 12 - 36
src/views/ledger/facility/details/index.vue

@@ -231,48 +231,28 @@
               criterias: this.criterias
             }
           }
-          let arr = []
           if (this.criterias.length) {
             BeatchQueryParam(params, res => {
               this.criteriasArray = res.Content;
-              arr = res.Content
-              arr && arr.length && arr.forEach(child => {
+              res.Content.length && res.Content.map(child => {
                 this.pointData.map(head => {
                   if (head.InfoPointCode == child.code) {
-                    head.svalue = child.value;
-                    head.data = child.data || '--';
-                    head.receivetime = child.receivetime || '';
-                    head.error = child.error || ''
+                    this.$set(head, 'svalue', child.value)
+                    this.$set(head, 'data', child.data)
+                    this.$set(head, 'receivetime', child.receivetime)
+                    this.$set(head, 'error', child.error)
                   }
                   return head
                 })
               })
-              /****************************delete****************************/
-              arr && arr.length && arr.map(child => {
-                this.pointData.forEach(head => {
-                  if (head.InfoPointCode == child.code) {
-                    // console.log(head.FirstName,child,'==')
-                    this.exhibitionEnergy.firstName = head.FirstName;
-                    this.exhibitionEnergy.dynamic.push({
-                      FirstName: head.FirstName,
-                      InfoPointCode: head.InfoPointCode,
-                      InfoPointName: head.InfoPointName,
-                      Path: head.Path,
-                      value: child.value,
-                      data: child.data || '--',
-                      receivetime: child.receivetime || '',
-                      error: child.error || '',
-                      Unit: head.Unit || ''
-                    })
-                  }
-                })
-              })
-            /****************************delete****************************/
+              this.handleRadios(this.currentRadio);
+              this.handleEnclosure() //处理图片视频文件信息
             })
-
+          } else {
+            this.handleRadios(this.currentRadio);
+            this.handleEnclosure() //处理图片视频文件信息
           }
-          this.handleRadios(this.currentRadio);
-          this.handleEnclosure() //处理图片视频文件信息
+
         })
       },
       handleEnclosure() {
@@ -341,11 +321,11 @@
               case 'LedgerParam.Siteinstall.InstallDrawing':
               case 'LedgerParam.PhotoDoc.Nameplate':
               case 'LedgerParam.PhotoDoc.Pic':
+              case 'Pic' :
                 if (this.instance.hasOwnProperty(i.Path)) {
                   i.PicList = this.instance[i.Path]
                 }
                 if (picObject[i.InfoPointName]) {
-
                 } else {
                   picObject[i.InfoPointName] = []
                 }
@@ -353,7 +333,6 @@
                   ...i,
                 })
                 break;
-
             }
           }
 
@@ -372,9 +351,7 @@
           }
         }
         this.exhibitionImage.arr = isArray
-
         let video = isArray.filter(i => i.Type != 'image' &&i.type != 'image' )
-        console.log(video,'video')
         this.exhibitionVideo.list = video
           //判断是否显示图片组件
           this.isShowImage = isArray.length ? true : false
@@ -387,7 +364,6 @@
         //处理数据格式
         arr.map(i => {
           if (i.InputMode == 'F2') {
-
             switch (i.Path) {
               case 'LedgerParam.InsuranceDoc.InsuranceFile':
               case 'LedgerParam.PhotoDoc.Archive':

+ 54 - 26
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>{{exampleData.RoomLocalName||exampleData.RoomName||''}}</span>
+        <span>{{exampleData ? exampleData.RoomLocalName||exampleData.RoomName :''}}</span>
       </div>
       <el-row class="spaceTypes">
         <div class="types">
@@ -62,7 +62,7 @@
 <script>
   import {mapGetters} from "vuex";
   import tools from "@/utils/scan/tools";
-  import {getDataDictionary, zoneDelete, zoneQuery} from '@/api/scan/request';
+  import {getDataDictionary, zoneDelete, zoneQuery,BeatchQueryParam} from '@/api/scan/request';
 
   import eqToSpaceTable from '@/components/business_space/newTables/eqToSpaceTable';
   import syInSpaceTable from '@/components/business_space/newTables/syInSpaceTable';
@@ -118,6 +118,7 @@
           title: '能耗信息',
           firstName:'',
           dynamic: [],
+          list: {}
         },
         exhibitionMaintain: {
           title: '维修/维保记录'
@@ -214,14 +215,12 @@
 
         obj = tools.flattenKeys(obj);
         this.instance = obj;
-        this.handleRadios(this.currentRadio)
-        this.handleEnclosure() //处理图片视频文件信息
         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,
+                id: this.exampleData.EquipID,
                 code: item.InfoPointCode
               })
             }
@@ -236,24 +235,24 @@
         }
         if (this.criterias.length) {
           BeatchQueryParam(params, res => {
-            res.Content.map(child => {
-              this.pointData.forEach(head => {
+            // this.criteriasArray = res.Content;
+            res.Content.length && res.Content.map(child => {
+              this.pointData.map(head => {
                 if (head.InfoPointCode == child.code) {
-                  this.exhibitionEnergy.firstName = head.FirstName;
-                  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 || ''
-                  })
+                  this.$set(head, 'svalue', child.value)
+                  this.$set(head, 'data', child.data)
+                  this.$set(head, 'receivetime', child.receivetime)
+                  this.$set(head, 'error', child.error)
                 }
+                return head
               })
-            });
+            })
+            this.handleRadios(this.currentRadio);
+            this.handleEnclosure() //处理图片视频文件信息
           })
+        } else {
+          this.handleRadios(this.currentRadio);
+          this.handleEnclosure() //处理图片视频文件信息
         }
       })
     },
@@ -315,20 +314,17 @@
       //处理数据格式
       arr.map(i => {
         if (i.InputMode == 'F2') {
-          console.log(i.Path)
           switch (i.Path) {
             case 'LedgerParam.PhotoDoc.Drawing':
             case 'LedgerParam.Siteinstall.InstallPic':
             case 'LedgerParam.Siteinstall.InstallDrawing':
             case 'LedgerParam.PhotoDoc.Nameplate':
+            case 'LedgerParam.PhotoDoc.Pic':
             case 'Pic' :
-
               if (this.instance &&this.instance.hasOwnProperty(i.Path)) {
                 i.PicList = this.instance[i.Path]
-
               }
               if (picObject[i.InfoPointName]) {
-
               } else {
                 picObject[i.InfoPointName] = []
               }
@@ -336,7 +332,6 @@
                 ...i,
               })
               break;
-
           }
         }
 
@@ -423,6 +418,7 @@
     },
     displayData(arr) {//对数据进行处理传给组件展示
       const result = {}
+      const resultEnergy = {};
       arr.forEach(i => {
         if (this.instance && this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
           i.value = this.instance[i.Path]
@@ -462,6 +458,39 @@
           case "L1":
           case "L2":
           case "M":
+            if (resultEnergy[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+              resultEnergy[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                Path: i.Path,
+                InfoPointName: i.InfoPointName,
+                InfoPointCode: i.InfoPointCode,
+                value: i.svalue,
+                Visible: i.Visible,
+                KeyWord: i.KeyWord,
+                InputMode: i.InputMode,
+                data: i.data,
+                receivetime: i.receivetime,
+                error: i.error,
+                Unit: i.Unit,
+                FirstName: i.FirstName,
+              })
+            } else {
+              resultEnergy[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                paths: [{
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  value: i.svalue,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode: i.InputMode,
+                  data: i.data,
+                  receivetime: i.receivetime,
+                  error: i.error,
+                  Unit: i.Unit,
+                  FirstName: i.FirstName,
+                }]
+              }
+            }
             break;
           default:
             if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
@@ -489,11 +518,10 @@
             }
 
         }
-
-
       })
       this.exhibitionBaseInformation.information = result
       this.exhibitionCrux.allMessage = result
+      this.exhibitionEnergy.list = resultEnergy;
     },
     // 设置iframe
     setFrame() {

+ 873 - 0
src/views/model/file/pathcontrol/index.vue

@@ -0,0 +1,873 @@
+<template>
+  <div id="path-control" v-loading="loading">
+    <el-row class="title-time">
+      <div style="width:220px">
+        <span>模型总耗时:</span>
+        <span>{{allTakeTime}}</span>
+      </div>
+      <div style="width:250px">
+        <span>模型开始上传时间:</span>
+        <span>{{UploadState.BeginTime}}</span>
+      </div>
+      <div style="width:250px">
+        <span>模型处理完成时间:</span>
+        <span>{{SaveLog.EndTime}}</span>
+      </div>
+    </el-row>
+    <el-row class="path-pic">
+      <div id="path-container">
+        <div class="first-column column">
+          <el-row id="baseServer">
+            <div class="updown shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <div style="text-align:center;margin-top: 15px">
+                <i class="el-icon-monitor" style="color:#b8c5d0;font-size:60px"></i>
+                <p style="margin-top:10px;color:#b8c5d0">上传下载功能</p>
+              </div>
+              <img v-if="!UploadState.BeginTime" class="status row-status" src="@/assets/image/model/arrowGray.png" />
+              <img v-else-if="UploadState.BeginTime&&!UploadState.EndTime" class="status row-status" src="@/assets/image/model/arrowBlue.png" />
+              <img v-else class="status row-status" src="@/assets/image/model/arrowGreen.png" />
+            </div>
+            <div class="shadow-box mid-transfer">
+              <div class="first-title">
+                <i class="el-icon-success" style="color:#67C23A"></i>模型中转站
+              </div>
+              <div class="first-content">
+                <p>模型文件存储于OSS服务器</p>
+              </div>
+              <img v-if="!SchedulerCheck.BeginTime" class="status row-waiting-manage" src="@/assets/image/model/waitingManageGray.png" />
+              <img v-else-if="SchedulerCheck.BeginTime&&!SchedulerCheck.EndTime" class="status row-waiting-manage"
+                src="@/assets/image/model/waitingManageBlue.png" />
+              <img v-else class="status row-waiting-manage" src="@/assets/image/model/waitingManageGreen.png" />
+
+              <img v-if="!UploadState.BeginTime" class="status up-model" src="@/assets/image/model/upModelGray.png" />
+              <img v-else-if="UploadState.BeginTime&&!UploadState.EndTime" class="status up-model" src="@/assets/image/model/upModelBlue.png" />
+              <img v-else class="status up-model" src="@/assets/image/model/upModelGreen.png" />
+
+              <!-- 调度器1 -->
+              <div class="path-tips shadow-box" style="top:67px;left:291px;" @click="getNodeDes"
+                v-if='SchedulerCheck.BeginTime&&!SchedulerCheck.EndTime'>
+                <i class="el-icon-error" v-if="SchedulerCheck.HasError"></i>
+                <i class="el-icon-warning" v-else-if="SchedulerCheck.HasRetry"></i>
+                <p>耗时: {{SchedulerCheck.TakeTime||'--'}}</p>
+                <!-- <p>平均上传速度: 1M/s</p> -->
+                <p>开始时间: {{SchedulerCheck.BeginTime||'--'}}</p>
+                <p v-if="!SchedulerCheck.EndTime">待分配模型数量: {{waitAssign}}</p>
+                <p v-else>结束时间: {{SchedulerCheck.EndTime||'--'}}</p>
+              </div>
+            </div>
+            <p style="float:left;width:100%;text-align:center;margin-top:73px;color:#acb5bb;font-size:12px;">本地电脑主机</p>
+          </el-row>
+          <!-- 上传模型文件 -->
+          <div class="path-tips shadow-box" style="top:189px;left:190px;" @click="getNodeDes">
+            <i class="el-icon-error" v-if="UploadState.HasError"></i>
+            <i class="el-icon-warning" v-else-if="UploadState.HasRetry"></i>
+            <p>耗时: {{UploadState.TakeTime||'--'}}</p>
+            <p>平均上传速度: {{UploadStateSpeed}}</p>
+            <p>开始时间: {{UploadState.BeginTime||'--'}}</p>
+            <p>结束时间: {{UploadState.EndTime||'--'}}</p>
+          </div>
+        </div>
+        <div class="second-column column">
+          <div>
+            <div id="ossServer" class="shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <el-row class="server-content">
+                <div style="text-align:center;width:100px" class="sm-box">
+                  <i class="iconfont icon-OSSserver" style="color:#b8c5d0;font-size:50px;"></i>
+                  <p style="margin:18px 0 0;color:#b8c5d0;">oss服务器</p>
+                </div>
+                <el-row class="sm-box">
+                  <div class="image">
+                    <i class="iconfont icon-revit" style="color:#dee6ec;font-size:60px;background:#fff"></i>
+                  </div>
+                  <div class="fixed">
+                    <p :title="OriginalName">模型文件名称{{OriginalName}}</p>
+                    <p style="color:#8d9aa3">模型文件大小: {{(Size/1000/1024).toFixed(1)}}M</p>
+                    <p style="color:#8d9aa3">上传时间: {{UploadState.EndTime||'--'}}</p>
+                  </div>
+                </el-row>
+                <el-row class="sm-box">
+                  <div class="image">
+                    <i class="iconfont icon-json" style="color:#dee6ec;font-size:60px;background:#fff"></i>
+                  </div>
+                  <div class="fixed">
+                    <p>{{OriginalName}} json数据压缩包</p>
+                    <p style="color:#8d9aa3">文件大小: {{ModelExport.JsonzSize?(ModelExport.JsonzSize/1000/1024).toFixed(1)+'M':'--'}}</p>
+                    <p style="color:#8d9aa3">上传时间: {{ModelExport.JsonzEndTime||'--'}}</p>
+                  </div>
+                </el-row>
+              </el-row>
+              <!-- 下载模型文件1 -->
+              <img v-if="!UploadState.EndTime" class="status down-model" src="@/assets/image/model/downModelGray.png" />
+              <img v-else-if="UploadState.EndTime&&!SchedulerCheck.EndTime" class="status down-model" src="@/assets/image/model/downModelBlue.png" />
+              <img v-else class="status down-model" src="@/assets/image/model/downModelGreen.png" />
+              <!-- 下载模型文件2 -->
+              <img v-if="!SchedulerExport.BeginTime" class="status down-model-sec" src="@/assets/image/model/downModelGray.png" />
+              <img v-else-if="SchedulerExport.BeginTime&&!ModelExport.JsonzBeginTime" class="status down-model-sec"
+                src="@/assets/image/model/downModelBlue.png" />
+              <img v-else class="status down-model-sec" src="@/assets/image/model/downModelGreen.png" />
+              <!-- 存储json -->
+              <img v-if="!ModelExport.JsonzBeginTime" class="status up-json" src="@/assets/image/model/upJsonGray.png" />
+              <img v-else-if="ModelExport.JsonzBeginTime&&!ModelExport.JsonzEndTime" class="status up-json"
+                src="@/assets/image/model/upJsonBlue.png" />
+              <img v-else class="status up-json" src="@/assets/image/model/upJsonGreen.png" />
+              <!-- 下载json -->
+              <img v-if="!JsonAnalysis.BeginTime" class="status down-json" src="@/assets/image/model/downJsonGray.png" />
+              <img v-else-if="JsonAnalysis.BeginTime&&!JsonAnalysis.EndTime" class="status down-json" src="@/assets/image/model/downJsonBlue.png" />
+              <img v-else class="status down-json" src="@/assets/image/model/downJsonGreen.png" />
+            </div>
+          </div>
+          <el-row id="revitServer">
+            <pathCard class="revit-item" :title="'楼层模型检查'" @click="getNodeDes" :data="ModelCheck">
+              <p>共检查项: 14项</p>
+            </pathCard>
+            <pathCard class="revit-item" :title="'导出模型json数据并压缩存储'" @click="getNodeDes" :data="ModelExport"></pathCard>
+            <!-- 调度器2 -->
+            <img v-if="!SchedulerExport.BeginTime" class="status row-waiting-manage" src="@/assets/image/model/waitingManageGray.png" />
+            <img v-else-if="SchedulerExport.BeginTime&&!SchedulerExport.EndTime" class="status row-waiting-manage"
+              src="@/assets/image/model/waitingManageBlue.png" />
+            <img v-else class="status row-waiting-manage" src="@/assets/image/model/waitingManageGreen.png" />
+            <!-- 等待解析 -->
+            <img v-if="!JsonAnalysis.BeginTime" class="status waiting-anl" src="@/assets/image/model/waitingAnlGray.png" />
+            <img v-else-if="JsonAnalysis.BeginTime&&!JsonAnalysis.EndTime" class="status waiting-anl" src="@/assets/image/model/waitingAnlBlue.png" />
+            <img v-else class="status waiting-anl" src="@/assets/image/model/waitingAnlGreen.png" />
+            <!-- 未通过 -->
+            <img v-if="ModelCheck.Remove||ModelExport.Remove" class="status del-model" src="@/assets/image/model/delModelBlue.png" />
+            <img v-else class="status del-model" src="@/assets/image/model/delModelGray.png" />
+
+            <!-- 调度器2 -->
+            <div class="path-tips shadow-box" style="top:114px;left:329px;" @click="getNodeDes"
+              v-if="SchedulerExport.BeginTime&&!SchedulerExport.EndTime">
+              <i class="el-icon-error" v-if="SchedulerExport.HasError"></i>
+              <i class="el-icon-warning" v-else-if="SchedulerExport.HasRetry"></i>
+              <p>耗时: {{SchedulerExport.TakeTime||'--'}}</p>
+              <!-- <p>平均上传速度: 1M/s</p> -->
+              <p>开始时间: {{SchedulerExport.BeginTime||'--'}}</p>
+              <p v-if="!SchedulerExport.EndTime">待分配模型数量: {{waitAssign}}</p>
+              <p v-else>结束时间: {{SchedulerExport.EndTime}}</p>
+            </div>
+
+            <p style="float:left;width:100%;text-align:center;margin-top:83px;color:#acb5bb;font-size:12px;">revit本地服务器集群</p>
+          </el-row>
+          <!-- 下载模型文件1 -->
+          <div class="path-tips shadow-box up-model-tips" @click="getNodeDes">
+            <i class="el-icon-error" v-if="ModelCheck.HasError"></i>
+            <i class="el-icon-warning" v-else-if="ModelCheck.HasRetry"></i>
+            <p>耗时: {{ModelCheck.DownTakeTime||'--'}}</p>
+            <p>平均下载速度: {{ModelCheckSpeed}}</p>
+            <p>开始时间: {{UploadState.EndTime||'--'}}</p>
+            <p>结束时间: {{SchedulerCheck.EndTime||'--'}}</p>
+          </div>
+          <!-- 下载模型文件2 -->
+          <div class="path-tips shadow-box up-model-tips2" @click="getNodeDes">
+            <i class="el-icon-error" v-if="ModelExport.HasError"></i>
+            <i class="el-icon-warning" v-else-if="ModelExport.HasRetry"></i>
+            <p>耗时: {{ModelExport.DownTakeTime||'--'}}</p>
+            <p>平均下载速度: {{ModelExportSpeed||'--'}}</p>
+            <p>开始时间: {{SchedulerExport.BeginTime||'--'}}</p>
+            <p>结束时间: {{ModelExport.JsonzBeginTime||'--'}}</p>
+          </div>
+          <!-- 存储json -->
+          <div class="path-tips shadow-box up-json-tips" @click="getNodeDes">
+            <i class="el-icon-error" v-if="ModelExport.HasError"></i>
+            <i class="el-icon-warning" v-else-if="ModelExport.HasRetry"></i>
+            <p>耗时: {{ModelExport.JsonzTakeTime||'--'}}</p>
+            <p>平均上传速度: {{SaveJsonSpeed||'--'}}</p>
+            <p>开始时间: {{ModelExport.JsonzBeginTime||'--'}}</p>
+            <p>结束时间: {{ModelExport.JsonzEndTime||'--'}}</p>
+          </div>
+          <!-- 下载json压缩包 -->
+          <div class="path-tips shadow-box down-json-tips" @click="getNodeDes">
+            <i class="el-icon-error" v-if="JsonAnalysis.HasError"></i>
+            <i class="el-icon-warning" v-else-if="JsonAnalysis.HasRetry"></i>
+            <p>耗时: {{JsonAnalysis.TakeTime||'--'}}</p>
+            <p>平均下载速度: {{DownJsonSpeed||'--'}}</p>
+            <p>开始时间: {{JsonAnalysis.BeginTime||'--'}}</p>
+            <p>结束时间: {{JsonAnalysis.EndTime||'--'}}</p>
+          </div>
+          <div id="secondDel" class="delModel">
+            <i class="iconfont icon-delate" style="color:#89969F;font-size:30px;line-height:1;margin-left:-6px"></i>
+            <p>放弃文件</p>
+          </div>
+        </div>
+        <div class="third-column column">
+          <div>
+            <div id="webDatabase" class="shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <div>
+                <div style="text-align:center;">
+                  <i class="iconfont icon-project-o" style="color:#dee6ec;font-size:40px"></i>
+                  <p style="color:#676767">web服务数据库</p>
+                </div>
+              </div>
+              <img v-if="1||!SaveData.BeginTime" class="status column-up" src="@/assets/image/model/columnGray.png" />
+              <!-- <img v-else-if="SaveData.BeginTime&&!SaveData.EndTime" class="status column-up" src="@/assets/image/model/columnBlue.png" />
+              <img v-else class="status column-up" src="@/assets/image/model/columnGreen.png" /> -->
+
+              <img v-if="1||!MultiFloorCheck.BeginTime" class="status right-down" src="@/assets/image/model/rightDownGray.png" />
+              <!-- <img v-else-if="MultiFloorCheck.BeginTime&&!MultiFloorCheck.EndTime" class="status right-down" src="@/assets/image/model/rightDownBlue.png" />
+              <img v-else class="status right-down" src="@/assets/image/model/rightDownGreen.png" /> -->
+            </div>
+          </div>
+          <el-row id="webServer">
+            <pathCard class="webServer-item" :title="'解压并解析json文件'" :data="JsonAnalysis" @click="getNodeDes"></pathCard>
+            <pathCard class="webServer-item" :title="'存储数据到模型web服务数据库'" :data="SaveData" @click="getNodeDes"></pathCard>
+            <pathCard class="webServer-item" :title="'建筑模型检查'" :data="MultiFloorCheck" @click="getNodeDes">
+              <p>共检查项: 2项</p>
+            </pathCard>
+            <pathCard class="webServer-item" :title="'处理模型数据格式'" :data="SyncDatacenter" @click="getNodeDes"></pathCard>
+
+            <img v-if="!SaveData.BeginTime" class="status path1 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="SaveData.BeginTime&&!SaveData.EndTime" class="status path1 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path1 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="!MultiFloorCheck.BeginTime" class="status path2 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="MultiFloorCheck.BeginTime&&!MultiFloorCheck.EndTime" class="status path2 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path2 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="!SyncDatacenter.BeginTime" class="status path3 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="SyncDatacenter.BeginTime&&!SyncDatacenter.EndTime" class="status path3 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path3 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="!SaveLog.BeginTime" class="status path4 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="SaveLog.BeginTime&&!SaveLog.EndTime" class="status path4 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path4 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="MultiFloorCheck.GridCheck||MultiFloorCheck.LevelCheck" class="status del-model" src="@/assets/image/model/delModelBlue.png" />
+            <img v-else class="status del-model" src="@/assets/image/model/delModelGray.png" />
+
+            <p style="float:left;width:100%;text-align:center;margin-top:83px;color:#acb5bb;font-size:12px;">模型web服务器</p>
+          </el-row>
+          <div id="thirdDel" class="delModel">
+            <i class="iconfont icon-delate" style="color:#89969F;font-size:30px;line-height:1;margin-left:-6px"></i>
+            <p>放弃文件</p>
+          </div>
+        </div>
+        <div class="forth-column column">
+          <div>
+            <div id="dataCenterDatabase" class="shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <div>
+                <div style="text-align:center;">
+                  <i class="iconfont icon-project-o" style="color:#dee6ec;font-size:40px"></i>
+                  <p style="color:#676767">数据中心数据库</p>
+                </div>
+              </div>
+
+              <img v-if="1" class="status column-up" src="@/assets/image/model/columnGray.png" />
+              <!-- <img v-else-if="2" class="status column-up" src="@/assets/image/model/columnBlue.png" />
+              <img v-else class="status column-up" src="@/assets/image/model/columnGreen.png" /> -->
+            </div>
+          </div>
+          <el-row id="dataCenterServer">
+            <pathCard :title="'储存模型数据并记录增删日志'" @click="getNodeDes" :data="SaveLog"></pathCard>
+
+            <img v-if="1" class="status path1" src="@/assets/image/model/arrowGray.png" />
+            <!-- <img v-else-if="2" class="status path1" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path1" src="@/assets/image/model/arrowGreen.png" /> -->
+
+            <p style="float:left;width:100%;text-align:center;margin-top:83px;color:#acb5bb;font-size:12px;">数据中心服务器 </p>
+          </el-row>
+        </div>
+        <div class="fifth-column column">
+          <pathCard class="finish-item" :title="'完成'" :data="SaveLog" :isCustomize="true">
+            <p>后续关系计算...</p>
+            <p>完成时间: {{SaveLog.EndTime||'--'}}</p>
+          </pathCard>
+        </div>
+      </div>
+    </el-row>
+    <nodeDialog ref="nodeDialog"></nodeDialog>
+  </div>
+</template>
+<script>
+import { mapGetters } from "vuex";
+import pathCard from "@/components/model/file/pathCard"
+import nodeDialog from "@/components/model/file/nodeDialog"
+import { modelPathControl, unassignQuery } from "@/api/model/file";
+import Bus from '@/utils/bus.js'
+export default {
+  components: {
+    pathCard,
+    nodeDialog
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      loading: false, //
+      Id: '',
+      Size: 0,
+      OriginalName: '',
+      JsonAnalysis: {}, //解压并解析json文件
+      ModelCheck: {}, //楼层模型检查
+      ModelExport: {}, //导出模型json数据并压缩存储
+      MultiFloorCheck: {}, //建筑模型检查
+      Note: {}, //储存模型数据并记录增删日志
+      SaveData: {}, //存储数据到模型web服务数据库
+      SchedulerCheck: {}, //第一个等待调度器
+      SchedulerExport: {},//第二个等待调度器
+      UploadState: {}, //上传下载功能
+      finish: {},
+      SyncDatacenter: {}, //处理模型数据格式
+      SaveLog: {},// 储存模型数据并记录增删日志
+      timer: null, //定时器
+      timeout: null, //延时器
+      waitAssign: 0,
+      allTakeTime: '', //总耗时
+      UploadStateSpeed: '', // 上传模型文件平均速度
+      ModelCheckSpeed: '',//下载模型文件1平均速度
+      ModelExportSpeed: '',//下载模型文件2平均速度
+      SaveJsonSpeed: '',//存储json平均速度
+      DownJsonSpeed: '',//下载json平均速度
+    }
+  },
+  mounted() {
+    // Bus.$on('modelStatusChange', message => {
+    //   this.init()
+    // })
+  },
+  created() {
+    this.Id = this.$route.query.Id
+    this.Size = this.$route.query.Size
+    this.OriginalName = this.$route.query.OriginalName || '--'
+    this.init();
+  },
+  beforeDestroy() {
+    if (this.timer) {
+      clearInterval(this.timer);
+    }
+    if (this.timeout) {
+      clearTimeout(this.timeout);
+    }
+  },
+  methods: {
+    init() {
+      this.getMessage();
+      if (!this.SchedulerExport.EndTime) {
+        this.getUnassignNum();
+      }
+    },
+    // 弹窗
+    getNodeDes(data, title) {
+      let type = '';
+      if (title == '楼层模型检查') {
+        type = 'firstCheck'
+      } else if (title == '建筑模型检查') {
+        type = 'secondCheck'
+      }
+      this.$refs.nodeDialog.showDialog(data, type)
+    },
+    // 获取流转状态
+    getMessage() {
+      let pa = {
+        Filters: `Id="${this.Id}"`
+      }
+      modelPathControl(pa, res => {
+        if (res.Content.length) {
+          const data = res.Content[0];
+          if (data.SchedulerExport && data.SchedulerExport.BeginTime) {
+            if (data.ModelExport) {
+              data.ModelExport.BeginTime = data.SchedulerExport.BeginTime
+            }
+          }
+          this.updateData(data);
+          this.getSpeed();
+          this.interval(data);
+          if (!this.SaveLog.EndTime) {
+            if (this.timeout) {
+              clearTimeout(this.timeout);
+            }
+            this.timeout = setTimeout(() => {
+              this.init()
+            }, 30000)
+          }
+        } else {
+          this.$message.warning('暂无数据')
+        }
+      })
+    },
+    // 
+    getUnassignNum() {
+      let pa = {
+        Filters: `Status=0 or Status=1 or Status=2`
+      }
+      unassignQuery(pa, res => {
+        this.waitAssign = res.Total
+      })
+    },
+    // 定时器
+    interval(data) {
+      if (this.timer) {
+        clearInterval(this.timer);
+      }
+      this.timer = setInterval(() => {
+        this.updateData(data)
+        this.$forceUpdate()
+      }, 1000)
+    },
+    // 计算耗时
+    updateData(data) {
+      this.JsonAnalysis = this.formatTime(data.JsonAnalysis || {});
+      this.ModelCheck = this.formatTime(data.ModelCheck || {})
+      this.ModelExport = this.formatTime(data.ModelExport || {})
+      this.MultiFloorCheck = this.formatTime(data.MultiFloorCheck || {})
+      this.SaveData = this.formatTime(data.SaveData || {})
+      this.SchedulerCheck = this.formatTime(data.SchedulerCheck || {})
+      this.SchedulerExport = this.formatTime(data.SchedulerExport || {})
+      this.UploadState = this.formatTime(data.UploadState || {})
+      this.SyncDatacenter = this.formatTime(data.SyncDatacenter || {})
+      this.SaveLog = this.formatTime(data.SaveLog || {})
+      if (this.UploadState.BeginTime) {
+        let temp = { BeginTime: this.UploadState.BeginTime }
+        if (this.SaveLog.EndTime) {
+          temp.EndTime = this.SaveLog.EndTime
+        }
+        this.allTakeTime = this.formatTime(temp).TakeTime
+      }
+      if (this.UploadState.EndTime && !this.SchedulerCheck.EndTime) {
+        const sTime = new Date(this.UploadState.EndTime).getTime();
+        const eTime = new Date().getTime();
+        this.ModelCheck.DownTakeTime = this.msToStr(eTime - sTime);
+      } else if (this.UploadState.EndTime && this.SchedulerCheck.EndTime) {
+        const sTime = new Date(this.UploadState.EndTime).getTime();
+        const eTime = new Date(this.SchedulerCheck.EndTime).getTime();
+        this.ModelCheck.DownTakeTime = this.msToStr(eTime - sTime);
+      }
+      if (this.SchedulerExport.BeginTime && !this.ModelExport.JsonzBeginTime) {
+        const sTime = new Date(this.SchedulerExport.BeginTime).getTime();
+        const eTime = new Date().getTime();
+        this.ModelExport.DownTakeTime = this.msToStr(eTime - sTime);
+      } else if (this.SchedulerExport.BeginTime && this.ModelExport.JsonzBeginTime) {
+        const sTime = new Date(this.SchedulerExport.BeginTime).getTime();
+        const eTime = new Date(this.ModelExport.JsonzBeginTime).getTime();
+        this.ModelExport.DownTakeTime = this.msToStr(eTime - sTime);
+      }
+    },
+    // 设置速度
+    getSpeed() {
+      let sTime, eTime;
+      if (this.UploadState.BeginTime && this.UploadState.EndTime) {
+        sTime = new Date(this.UploadState.BeginTime).getTime();
+        eTime = new Date(this.UploadState.EndTime).getTime();
+        if (sTime != eTime) {
+          this.UploadStateSpeed = this.formatSpeed(this.Size / (eTime - sTime))
+        } else {
+          this.UploadStateSpeed = '--'
+        }
+      } else {
+        this.UploadStateSpeed = '--'
+      }
+      if (this.UploadState.EndTime && this.SchedulerCheck.EndTime) {
+        sTime = new Date(this.UploadState.EndTime).getTime();
+        eTime = new Date(this.SchedulerCheck.EndTime).getTime();
+        if (sTime != eTime) {
+          this.ModelCheckSpeed = this.formatSpeed(this.Size / (eTime - sTime))
+        } else {
+          this.ModelCheckSpeed = '--'
+        }
+      } else {
+        this.ModelCheckSpeed = '--'
+      }
+      if (this.SchedulerExport.BeginTime && this.ModelExport.JsonzBeginTime) {
+        sTime = new Date(this.SchedulerExport.BeginTime).getTime();
+        eTime = new Date(this.ModelExport.JsonzBeginTime).getTime();
+        if (sTime != eTime) {
+          this.ModelExportSpeed = this.formatSpeed(this.Size / (eTime - sTime))
+        } else {
+          this.ModelExportSpeed = '--'
+        }
+      } else {
+        this.ModelExportSpeed = '--'
+      }
+      if (this.ModelExport.JsonzBeginTime && this.ModelExport.JsonzEndTime) {
+        sTime = new Date(this.ModelExport.JsonzBeginTime).getTime();
+        eTime = new Date(this.ModelExport.JsonzEndTime).getTime();
+        if (sTime != eTime) {
+          this.SaveJsonSpeed = this.formatSpeed(this.ModelExport.JsonzSize / (eTime - sTime))
+        } else {
+          this.SaveJsonSpeed = '--'
+        }
+      } else {
+        this.SaveJsonSpeed = '--'
+      }
+      if (this.JsonAnalysis.BeginTime && this.JsonAnalysis.EndTime) {
+        sTime = new Date(this.JsonAnalysis.BeginTime).getTime();
+        eTime = new Date(this.JsonAnalysis.EndTime).getTime();
+        if (sTime != eTime) {
+          this.DownJsonSpeed = this.formatSpeed(this.ModelExport.JsonzSize / (eTime - sTime))
+        } else {
+          this.DownJsonSpeed = '--'
+        }
+      } else {
+        this.DownJsonSpeed = '--'
+      }
+    },
+    // 处理时间工具
+    formatTime(data) {
+      if (data.BeginTime && !data.EndTime) {
+        const sTime = new Date(data.BeginTime).getTime();
+        const eTime = new Date().getTime();
+        data.TakeTime = this.msToStr(eTime - sTime);
+      } else if (data.BeginTime && data.EndTime) {
+        const sTime = new Date(data.BeginTime).getTime();
+        const eTime = new Date(data.EndTime).getTime();
+        data.TakeTime = this.msToStr(eTime - sTime);
+      }
+      if (data.JsonzBeginTime && !data.JsonzEndTime) {
+        const sTime = new Date(data.JsonzBeginTime).getTime();
+        const eTime = new Date().getTime();
+        data.JsonzTakeTime = this.msToStr(eTime - sTime);
+      } else if (data.JsonzBeginTime && data.JsonzEndTime) {
+        const sTime = new Date(data.JsonzBeginTime).getTime();
+        const eTime = new Date(data.JsonzEndTime).getTime();
+        data.JsonzTakeTime = this.msToStr(eTime - sTime);
+      }
+      return data;
+    },
+    // 生成speed
+    formatSpeed(speed) {
+      if (speed > 1024) {
+        speed = (speed / 1024).toFixed(1);
+        return `${speed}MB/s`
+      } else {
+        return `${speed.toFixed(1)}KB/s`
+      }
+    },
+    msToStr(mss) {
+      let str = '';
+      const days = parseInt(mss / (1000 * 60 * 60 * 24));
+      const hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+      const minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
+      const seconds = ((mss % (1000 * 60)) / 1000).toFixed();
+      if (days > 0) {
+        str += `${days}天`
+      }
+      if (hours > 0) {
+        str += `${hours}小时`
+      }
+      if (minutes > 0) {
+        str += `${minutes}分钟`
+      }
+      if (seconds > 0) {
+        str += `${seconds}秒`
+      }
+      return str;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#path-control {
+  box-sizing: border-box;
+  padding: 10px;
+  border: 1px solid #e4e4e4;
+  background-color: #fff;
+  overflow: hidden;
+  .title-time {
+    padding: 10px;
+    border-bottom: 1px solid #e4e4e4;
+    & > div {
+      float: left;
+      font-size: 14px;
+    }
+    & > div + div {
+      margin-left: 20px;
+    }
+  }
+  .path-pic {
+    height: calc(100% - 50px);
+    overflow-x: auto;
+    #path-container {
+      position: relative;
+      height: 100%;
+      padding: 20px 0 0;
+      width: 4450px;
+      img.status {
+        position: absolute;
+      }
+      .column {
+        height: 100%;
+        position: relative;
+        float: left;
+        width: 1000px;
+        &.first-column {
+          width: 832px;
+          #baseServer {
+            border: 2px dashed #b8c5d0;
+            border-radius: 4px;
+            padding: 20px 20px 0;
+            margin: 389px 20px 0;
+            width: 584px;
+            height: 270px;
+            .updown {
+              position: relative;
+              width: 150px;
+              height: 150px;
+              float: left;
+              margin-right: 150px;
+            }
+            .mid-transfer {
+              position: relative;
+              width: 235px;
+              height: 90px;
+              float: left;
+              margin-top: 30px;
+            }
+          }
+          .first-title {
+            background-color: #f3f5f6;
+            font-size: 14px;
+            padding: 5px 10px;
+            i {
+              margin-right: 5px;
+            }
+          }
+          .first-content {
+            font-size: 12px;
+            padding: 10px;
+            color: #acb5bb;
+          }
+          .row-status {
+            left: 170px;
+            top: 70px;
+          }
+          .row-waiting-manage {
+            left: 264px;
+            top: 30px;
+          }
+          .up-model {
+            left: 95px;
+            bottom: 96px;
+          }
+        }
+        &.second-column {
+          #ossServer {
+            position: relative;
+            width: 780px;
+            margin: 0 auto;
+            .server-content {
+              padding: 20px 0;
+              .sm-box {
+                float: left;
+                padding: 0 10px;
+                line-height: 1;
+                & > div {
+                  float: left;
+                  font-size: 12px;
+                }
+                &:nth-child(1) {
+                  width: 100px;
+                  margin-right: 30px;
+                }
+                &:nth-child(2),
+                &:nth-child(3) {
+                  padding: 15px 20px;
+                  background: #eef2f6;
+                  border-radius: 4px;
+                  border: 2px dashed #b8c5d0;
+                }
+                &:nth-child(3) {
+                  margin-left: 40px;
+                }
+                .fixed {
+                  p {
+                    width: 167px;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    white-space: nowrap;
+                  }
+                }
+                .image {
+                  margin-right: 20px;
+                }
+                p {
+                  margin-bottom: 8px;
+                }
+              }
+            }
+            .down-model {
+              left: 82px;
+              top: 156px;
+            }
+            .down-model-sec {
+              left: 565px;
+              top: 156px;
+            }
+            .up-json {
+              left: 665px;
+              top: 156px;
+            }
+            .down-json {
+              top: 68px;
+              right: -460px;
+            }
+          }
+          #revitServer {
+            padding: 16px 16px 0;
+            border: 2px dashed #b8c5d0;
+            width: 890px;
+            height: 270px;
+            margin: 235px auto 0;
+            .revit-item {
+              float: left;
+              &:nth-child(1) {
+                margin-right: 255px;
+              }
+            }
+            .row-waiting-manage {
+              left: 300px;
+              top: 80px;
+              transform: scale(0.9);
+            }
+            .waiting-anl {
+              right: -263px;
+              top: 80px;
+            }
+            .del-model {
+              left: 91px;
+              top: 168px;
+            }
+          }
+          .up-model-tips {
+            left: -44px;
+            top: 202px;
+          }
+          .up-model-tips2 {
+            left: 439px;
+            top: 202px;
+          }
+          .up-json-tips {
+            left: 815px;
+            top: 202px;
+          }
+          .down-json-tips {
+            right: -336px;
+            top: 114px;
+          }
+          #secondDel {
+            margin: 48px 0 0 166px;
+          }
+        }
+        &.third-column {
+          width: 1544px;
+          margin-left: 200px;
+          #webDatabase {
+            width: 130px;
+            height: 144px;
+            margin-left: 500px;
+            .column-up {
+              top: 158px;
+              left: 565px;
+              transform: scale(1.1);
+            }
+            .right-down {
+              right: 560px;
+              top: 103px;
+            }
+          }
+          #webServer {
+            border: 2px dashed #b8c5d0;
+            margin-top: 241px;
+            padding: 16px 16px 0;
+            height: 270px;
+            .webServer-item {
+              float: left;
+              & + .webServer-item {
+                margin-left: 105px;
+              }
+            }
+            .path {
+              top: 95px;
+            }
+            .path1 {
+              left: 311px;
+            }
+            .path2 {
+              left: 715px;
+            }
+            .path3 {
+              left: 1117px;
+            }
+            .path4 {
+              left: 1520px;
+            }
+            .del-model {
+              right: 517px;
+              top: 168px;
+            }
+          }
+          #thirdDel {
+            margin: 48px 0 0 925px;
+          }
+        }
+        &.forth-column {
+          width: 335px;
+          margin-left: 70px;
+          margin-right: 87px;
+          #dataCenterDatabase {
+            width: 130px;
+            height: 144px;
+            margin: 0 auto;
+            .column-up {
+              top: 158px;
+              left: 165px;
+              transform: scale(1.1);
+            }
+          }
+          #dataCenterServer {
+            border: 2px dashed #b8c5d0;
+            margin-top: 240px;
+            padding: 16px 16px 0;
+            height: 270px;
+            .path1 {
+              top: 95px;
+              left: 311px;
+            }
+          }
+        }
+        &.fifth-column {
+          width: auto;
+          .finish-item {
+            margin-top: 403px;
+          }
+        }
+      }
+    }
+  }
+  .shadow-box {
+    box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);
+    border-radius: 4px;
+  }
+  .path-tips {
+    position: absolute;
+    font-size: 12px;
+    width: 204px;
+    height: 93px;
+    padding: 10px;
+    i {
+      position: absolute;
+      font-size: 16px;
+      right: 10px;
+      &.el-icon-warning {
+        color: #fbc636;
+      }
+      &.el-icon-error {
+        color: #ff6660;
+      }
+    }
+  }
+  .delModel {
+    width: 76px;
+    height: 66px;
+    font-size: 12px;
+    text-align: center;
+    padding-top: 10px;
+    background: #eef2f6;
+    border: 2px solid #b8c5d0;
+    border-radius: 5px;
+  }
+}
+</style>

+ 1 - 1
src/views/point/config_point/steps/step1.vue

@@ -256,7 +256,7 @@
                     var blob = new Blob([res.data], {
                         type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
                     });
-                    var fileName = res.headers['content-disposition'];
+                    var fileName = decodeURI(res.headers['content-disposition']);
                     if (fileName)
                         fileName = fileName.substring(fileName.indexOf('=') + 1);
                     if ('download' in document.createElement('a')) { // 非IE下载

+ 1 - 5
src/views/ready/buildfloor/addFloor/index.vue

@@ -5,7 +5,7 @@
     </el-row>
     <span slot="footer" class="dialog-footer">
       <el-button size="small" @click="dialogVisible=false">取消</el-button>
-      <el-button size="small" type="primary" @click="confirm" :disabled="disabled">确认</el-button>
+      <el-button size="small" type="primary" @click="confirm" >确认</el-button>
     </span>
   </el-dialog>
 </template>
@@ -36,7 +36,6 @@
         return {
           dialogVisible: false, //弹窗显示与隐藏
           floorData: {},
-          disabled: false
         };
       },
       methods: {
@@ -62,7 +61,6 @@
         handleClose() { },
         //创建
         confirm() {
-          this.disabled = true
           this.$refs.formItems.submitForm(this.save)
         },
         save() {
@@ -77,14 +75,12 @@
               this.$message.success('更新成功')
               this.$emit('refresh')
               this.dialogVisible = false;
-              this.disabled = false
             })
           } else {
             manageCreateFloor(Param, res => {
               this.$message.success('创建成功')
               this.$emit('refresh')
               this.dialogVisible = false;
-              this.disabled = false
             })
           }
         }

+ 1 - 3
src/views/ready/buildfloor/index.vue

@@ -374,17 +374,15 @@
         } else {
           // 删除建筑
           if (this.tableData && this.tableData.length) {
+            this.buildDisabled = false
             this.$message.error("当前建筑中包含楼层,不可删除");
             this.delDialogVis = false;
-            this.buildDisabled = false
           } else {
             let param = [{BuildId: this.curBuildId}];
             this.$message.success("删除成功");
             this.delDialogVis = false;
             objectDeleteBuild(param, res => {
-              this.$message.success("删除成功");
               this.buildDisabled = false
-              this.delDialogVis = false;
               this.handleBuildQuery()
               this.init()
             })

+ 2 - 0
src/views/relation/data/index.vue

@@ -10,10 +10,12 @@
             :disabled="isDisabled"
         >重新转换
         </el-button>
+        <el-tooltip content="编辑转换规则" placement="top">
         <span
             class="iconfont icon-guizeyingyong"
             @click="dataTable"
         ></span>
+        </el-tooltip>
         <span>需补充转换规则的:{{replenishCount}}</span>
       </section>
     </div>