xieqy 1 year ago
parent
commit
b660e2b299

+ 135 - 85
src/views/OnlineImport/widgets/PipeOnlineImport/widget.vue

@@ -3,14 +3,18 @@
     <tf-page>
       <template v-slot:action>
         <tf-title>工程列表</tf-title>
-        <el-row style="padding-bottom:10px;">
+        <el-row style="padding-bottom: 10px">
           <el-col :span="12">
             <el-row>
               <el-col></el-col>
             </el-row>
             <span></span>
             <span>工程名称</span>
-            <pbs-tree :structures='structures' @changeProjectName="treeNodeClick" style="width:50%;display:inline-block;"></pbs-tree>
+            <pbs-tree
+              :structures="structures"
+              @changeProjectName="treeNodeClick"
+              style="width: 50%; display: inline-block"
+            ></pbs-tree>
             <el-button type="primary" size="mini" @click="getPbsTree">查询</el-button>
           </el-col>
           <el-col :span="6" :offset="6">
@@ -18,40 +22,51 @@
           </el-col>
         </el-row>
       </template>
-      <tf-table v-if="!isNewProj" highlight-current-row @current-change="selectChange" class="tabletree" :stripe='false' row-key="id" border style='width:100%' :data="tableData" :tree-props="{children:'children'}">
-        <el-table-column prop="name" label="节点名称" width="400" :show-overflow-tooltip="true">
-
-        </el-table-column>
-        <el-table-column prop="code" label="PBS编码">
-
-        </el-table-column>
-        <el-table-column prop="levelname" label="类型">
-
-        </el-table-column>
+      <tf-table
+        v-if="!isNewProj"
+        highlight-current-row
+        @current-change="selectChange"
+        class="tabletree"
+        :stripe="false"
+        row-key="id"
+        border
+        style="width: 100%"
+        :data="tableData"
+        :tree-props="{ children: 'children' }"
+      >
+        <el-table-column prop="name" label="节点名称" width="400" :show-overflow-tooltip="true"> </el-table-column>
+        <el-table-column prop="code" label="PBS编码"> </el-table-column>
+        <el-table-column prop="levelname" label="类型"> </el-table-column>
         <el-table-column prop="isPublish" label="发布状态">
           <template slot-scope="scope">
-            <el-tag v-if="scope.row.isPublish==='1'" type="success">已发布</el-tag>
+            <el-tag v-if="scope.row.isPublish === '1'" type="success">已发布</el-tag>
             <el-tag v-else type="danger">未发布</el-tag>
           </template>
         </el-table-column>
         <el-table-column prop="" label="操作">
           <template slot-scope="scope">
-            <div v-if="scope.row.levelname==='工程'||scope.row.levelname==='单项工程'||scope.row.levelname==='单位工程(CWP)'">
+            <div
+              v-if="
+                scope.row.levelname === '工程' ||
+                scope.row.levelname === '单项工程' ||
+                scope.row.levelname === '单位工程(CWP)'
+              "
+            >
               <el-button class="tdbutton" size="mini" type="primary" @click="openNewNode(scope.row)">新建</el-button>
               <!-- <i class="el-icon-delete" style="color:red;margin-left:10px;" @click="deleteData(scope.row)"></i> -->
             </div>
-            <div v-else-if="scope.row.levelname==='分部工程(专业)'">
+            <div v-else-if="scope.row.levelname === '分部工程(专业)'">
               <el-button class="tdbutton" size="mini" type="success" @click="pipeDataImport(scope.row)">导入</el-button>
-              <i class="el-icon-delete" style="color:red;margin-left:10px;" @click="deleteData(scope.row)"></i>
+              <i class="el-icon-delete" style="color: red; margin-left: 10px" @click="deleteData(scope.row)"></i>
             </div>
             <div v-else>
               <el-button class="tdbutton" size="mini" type="primary" @click="openNewNode(scope.row)">新建</el-button>
-              <i class="el-icon-delete" style="color:red;margin-left:10px;" @click="deleteData(scope.row)"></i>
+              <i class="el-icon-delete" style="color: red; margin-left: 10px" @click="deleteData(scope.row)"></i>
             </div>
           </template>
         </el-table-column>
       </tf-table>
-      <el-row v-else type="flex" justify="center" align="middle" style="height:100%;background:#fff;">
+      <el-row v-else type="flex" justify="center" align="middle" style="height: 100%; background: #fff">
         <el-button type="primary" @click="addProjectNode">创建项目工程结构树</el-button>
       </el-row>
     </tf-page>
@@ -64,8 +79,8 @@
           <el-input v-model="addNodeForm.pCode" disabled></el-input>
         </el-form-item>
         <el-form-item label="下级节点选择">
-          <el-select @change="nextNodeChange()" v-model="addNodeForm.id" clearable style="width:100%">
-            <el-option v-for="(item,index) in nodeOptions" :key="index" :label="item.name" :value="item.id">
+          <el-select @change="nextNodeChange()" v-model="addNodeForm.id" clearable style="width: 100%">
+            <el-option v-for="(item, index) in nodeOptions" :key="index" :label="item.name" :value="item.id">
               <span style="float: left">{{ item.name }}</span>
               <span style="float: right; color: #8492a6; font-size: 13px">{{ item.value }}</span>
             </el-option>
@@ -75,30 +90,49 @@
           <el-input v-model="addNodeForm.code" disabled></el-input>
         </el-form-item>
       </el-form>
-      <div slot="footer" style="text-align:right;">
+      <div slot="footer" style="text-align: right">
         <el-button type="primary" @click="addNodeSubmit()" size="small">提 交</el-button>
         <el-button @click="newNodeDialogShow = false" size="small">取 消</el-button>
       </div>
     </tf-dialog>
-    <tf-dialog class="fullDialog" title="管线数据导入" max-width="100%" max-height="calc(100vh - 54px)" :fullscreen="true" :visible.sync="importDialogShow">
-      <el-container style="height:100%;">
-        <el-aside width="300px" style="overflow-x:hidden">
+    <tf-dialog
+      class="fullDialog"
+      title="管线数据导入"
+      max-width="100%"
+      max-height="calc(100vh - 54px)"
+      :fullscreen="true"
+      :visible.sync="importDialogShow"
+    >
+      <el-container style="height: 100%">
+        <el-aside width="300px" style="overflow-x: hidden">
           <div>
             <tf-title>成果表选择</tf-title>
-            <el-form ref='addForm' :model="impForm" size="mini">
+            <el-form ref="addForm" :model="impForm" size="mini">
               <el-form-item label="项目工程" prop="prjName" class="impForm" :rules="addRules">
                 <!-- <pbs-tree @changeProjectName="treeNodeClick" style="width:100%;"></pbs-tree> -->
                 <el-input type="textarea" :rows="3" v-model="impForm.prjName"></el-input>
               </el-form-item>
               <el-form-item label="数据阶段" prop="stage">
-                <el-select v-model="impForm.stage" style="width:100%">
+                <el-select v-model="impForm.stage" style="width: 100%">
                   <el-option label="设计" value="SJ"></el-option>
                   <!-- <el-option label="普查" value="PC"></el-option>
           <el-option label="竣工" value="JG"></el-option> -->
                 </el-select>
               </el-form-item>
               <el-form-item label="成果表">
-                <el-upload class="eluploadcontainer" action="none" :file-list="fileList" accept=".xls,.xlsx" multiple :limit="2" :before-remove="onBeforeRemove" :on-remove="onRemove" :on-change="onChange" :auto-upload="false" :on-exceed="onExceed">
+                <el-upload
+                  class="eluploadcontainer"
+                  action="none"
+                  :file-list="fileList"
+                  accept=".xls,.xlsx"
+                  multiple
+                  :limit="2"
+                  :before-remove="onBeforeRemove"
+                  :on-remove="onRemove"
+                  :on-change="onChange"
+                  :auto-upload="false"
+                  :on-exceed="onExceed"
+                >
                   <el-button slot="trigger" size="small" type="text">本地文件</el-button>
                   <el-button size="small" type="text" @click="OnlineAccess">在线获取</el-button>
                 </el-upload>
@@ -106,10 +140,10 @@
               <el-form-item>
                 <el-row :gutter="20">
                   <el-col :span="12">
-                    <el-button type="primary" size="small" style="width:100%">取消</el-button>
+                    <el-button type="primary" size="small" style="width: 100%">取消</el-button>
                   </el-col>
                   <el-col :span="12">
-                    <el-button type="primary" size="small" style="width:100%" @click="previewExcel">提交</el-button>
+                    <el-button type="primary" size="small" style="width: 100%" @click="previewExcel">提交</el-button>
                   </el-col>
                 </el-row>
               </el-form-item>
@@ -133,7 +167,13 @@
                 </el-form-item>
                 <el-form-item>
                   <el-input v-model="queryPara" clearable placeholder="支持数据名称,上传单位">
-                    <el-button type="primary" slot="append" size="mini" icon="el-icon-search" @click="getlist"></el-button>
+                    <el-button
+                      type="primary"
+                      slot="append"
+                      size="mini"
+                      icon="el-icon-search"
+                      @click="getlist"
+                    ></el-button>
                   </el-input>
                   <!-- <el-button type="primary" size="mini" icon="el-icon-search" @click="getlist"></el-button> -->
                 </el-form-item>
@@ -154,7 +194,7 @@
                 </el-form-item>
               </el-form>
               <!-- 弹出框表单 -->
-              <div class="content-body" style="height:410px;">
+              <div class="content-body" style="height: 410px">
                 <tf-table @page-change="onPageChange" :data="onlineRecords" :pagination="pagination">
                   <template slot="empty">
                     <img src="@/assets/icon/null.png" alt="暂无数据" />
@@ -166,7 +206,11 @@
                   <el-table-column prop="batchName" label="数据名称" :show-overflow-tooltip="true"></el-table-column>
                   <el-table-column prop="dataSource" label="数据阶段"></el-table-column>
                   <el-table-column prop="submitStatus" label="提交状态"></el-table-column>
-                  <el-table-column prop="detectionUnit" label="上传单位" :show-overflow-tooltip="true"></el-table-column>
+                  <el-table-column
+                    prop="detectionUnit"
+                    label="上传单位"
+                    :show-overflow-tooltip="true"
+                  ></el-table-column>
                   <el-table-column prop="updateTime" label="上传时间" width="150px"></el-table-column>
                   <el-table-column label="下载" width="50">
                     <template slot-scope="scope">
@@ -185,14 +229,14 @@
           <el-tabs class="pipetable">
             <el-tab-pane label="表格">
               <el-row>
-                <el-col :span="8">源数据情况:{{importInfo}}</el-col>
-                <el-col :span="8">预览情况:{{priviewInfo}}</el-col>
+                <el-col :span="8">源数据情况:{{ importInfo }}</el-col>
+                <el-col :span="8">预览情况:{{ priviewInfo }}</el-col>
                 <el-col :span="8">
                   <el-button type="primary" size="small" @click="buildDatasets">预览</el-button>
                   <el-button type="primary" size="small" @click="zsbuildDatasets">提交</el-button>
                 </el-col>
               </el-row>
-              <el-tabs>
+              <el-tabs style="height: calc(100% - 32px)">
                 <el-tab-pane label="点表">
                   <tf-table :columns="impForm.pointColumns" :data="impForm.pointData"></tf-table>
                 </el-tab-pane>
@@ -207,8 +251,7 @@
           </el-tabs>
         </el-main>
       </el-container>
-      <div slot="footer">
-      </div>
+      <div slot="footer"></div>
     </tf-dialog>
     <tf-dialog title="服务发布" width="600px" :visible.sync="isPublicDialogShow">
       <el-checkbox-group v-model="publicConfig">
@@ -216,9 +259,9 @@
         <el-checkbox label="发布地图服务" :disabled="true"></el-checkbox>
         <el-checkbox label="更新发布标识" :disabled="!listSelect"></el-checkbox>
       </el-checkbox-group>
-      <div slot='footer' style="text-align:right;">
+      <div slot="footer" style="text-align: right">
         <el-button type="primary" size="small" @click="submitPublicService">确 定</el-button>
-        <el-button size="small" @click="isPublicDialogShow=false">取 消</el-button>
+        <el-button size="small" @click="isPublicDialogShow = false">取 消</el-button>
       </div>
     </tf-dialog>
   </div>
@@ -272,7 +315,7 @@ export default class PipeOnlineImprt extends Vue {
     lineData: []
   }
   /**是否创建新项目 */
-  isNewProj=false
+  isNewProj = false
   /**服务发布对话框 */
   isPublicDialogShow = false
   /**发布服务选项 */
@@ -293,7 +336,8 @@ export default class PipeOnlineImprt extends Vue {
     pCode: '',
     id: '',
     code: '',
-    name: ''
+    name: '',
+    nextCode: ''
   }
   /**表格树勾选项 */
   listSelect = null
@@ -453,12 +497,12 @@ export default class PipeOnlineImprt extends Vue {
           })
         }
         if (result[0]) {
-          this.isNewProj=false
+          this.isNewProj = false
           this.structures = result[0].structures
           let data = formatTree(result[0].structures)
           this.tableData = data
-        }else{
-          this.isNewProj=true;
+        } else {
+          this.isNewProj = true
         }
       } else {
         this.$message.error('信息获取失败')
@@ -506,7 +550,7 @@ export default class PipeOnlineImprt extends Vue {
                       }).then((boinfos) => {
                         if (boinfos.code === 1) {
                           const list = boinfos.result.records.map((item) => {
-                            return { name: item.name, value: item.code,id:item.id }
+                            return { name: item.name, value: item.code, id: item.id }
                           })
                           this.nodeOptions = list
                         }
@@ -527,21 +571,21 @@ export default class PipeOnlineImprt extends Vue {
       pid: this.addNodeForm.pid,
       code: this.addNodeForm.code,
       name: this.addNodeForm.name,
-      prjId: this.$store.state.project.project.id
+      prjId: this.$store.state.project.project.id,
+      nextCode: this.addNodeForm.nextCode
     }
-    addStrctureNode(data)
-      .then((result) => {
-        if (result.code === -1) {
-          this.$message.error('添加失败')
-          return
-        }
-        this.$message.success('添加成功')
-        this.newNodeDialogShow = false
-        this.getPbsTree()
-      })
-      .catch((err) => {
-        console.error(err)
-      })
+    addStrctureNode(data).then((result) => {
+      if (result.code === -1) {
+        this.$message.error(result.message || '添加失败')
+        return
+      }
+      this.$message.success('添加成功')
+      this.newNodeDialogShow = false
+      this.getPbsTree()
+    })
+    // .catch((err) => {
+    //   console.error(err)
+    // })
   }
   /**下级节点选择器选中事件 */
   nextNodeChange() {
@@ -550,6 +594,7 @@ export default class PipeOnlineImprt extends Vue {
     })
     this.addNodeForm.code = this.addNodeForm.pCode + this.connector + node.value
     this.addNodeForm.name = node.name
+    this.addNodeForm.nextCode = node.value
   }
   /**添加项目 */
   addProjectNode() {
@@ -574,11 +619,11 @@ export default class PipeOnlineImprt extends Vue {
                 const list = boinfos.result.records.map((item) => {
                   return { name: item.name, value: item.code }
                 })
-                if(list.length===0){
-                  this.$message.warning('未创建工程业务对象');
-                  return;
+                if (list.length === 0) {
+                  this.$message.warning('未创建工程业务对象')
+                  return
                 }
-                const proj=list[0]
+                const proj = list[0]
                 const data = {
                   pid: null,
                   code: proj.value,
@@ -638,8 +683,8 @@ export default class PipeOnlineImprt extends Vue {
       this.$message.warning('请选择导入层级')
       return
     }
-    const wkid=this.$store.state.project.project;
-    if(!wkid||wkid===''){
+    const wkid = this.$store.state.project.project.wkid
+    if (!wkid || wkid === '') {
       this.$message.warning('请选择导入层级')
       return
     }
@@ -660,13 +705,18 @@ export default class PipeOnlineImprt extends Vue {
       url: '/tofly-lzd-data/data/import/' + this.impForm.id,
       method: 'post',
       data: formdata,
-      timeout:600000
+      timeout: 600000
     })
       .then((result) => {
         if (result.code === 1) {
           this.$message.success('临时库数据集生成成功')
-          this.priviewInfo = '管点:' + result.result['管点数量'] + ',管线' + result.result['管线数量'] + '条'
           //this.buildNetwork()
+          request({
+            url: '/tofly-lzd-data/data/getDataPreviewCount',
+            method: 'get'
+          }).then((res) => {
+            this.priviewInfo = '管点:' + res.result['点表'] + ',管线' + res.result['线表'] + '条'
+          })
         }
       })
       .catch((err) => {
@@ -746,7 +796,7 @@ export default class PipeOnlineImprt extends Vue {
   导入excel表,创建二三维数据集【正式库】  
    */
   zsbuildDatasets() {
-    const dataUser=this.$store.state.project.project.dataUser
+    const dataUser = this.$store.state.project.project.dataUser
     if (this.files.length === 0) {
       this.$message.warning('请上传管网数据表')
       return
@@ -755,12 +805,12 @@ export default class PipeOnlineImprt extends Vue {
       this.$message.warning('请选择导入层级')
       return
     }
-    if(!dataUser||dataUser===''){
+    if (!dataUser || dataUser === '') {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
-    const wkid=this.$store.state.project.project;
-    if(!wkid||wkid===''){
+    const wkid = this.$store.state.project.project.wkid
+    if (!wkid || wkid === '') {
       this.$message.warning('请选择导入层级')
       return
     }
@@ -777,12 +827,12 @@ export default class PipeOnlineImprt extends Vue {
     formdata.append('importType', '1')
     formdata.append('id', '' + this.impForm.id)
     formdata.append('wkid', wkid)
-    formdata.append('dataUser',dataUser)
+    formdata.append('dataUser', dataUser)
     request({
       url: '/tofly-lzd-data/data/import/' + this.impForm.id,
       method: 'POST',
       data: formdata,
-      timeout:600000
+      timeout: 600000
     })
       .then((result) => {
         this.$message.success('正式库数据集生成成功')
@@ -819,15 +869,15 @@ export default class PipeOnlineImprt extends Vue {
     重建三维网络【正式库】
    */
   zsbuildNetwork() {
-    const dataUser=this.$store.state.project.project.dataUser
-    if(!dataUser||dataUser===''){
+    const dataUser = this.$store.state.project.project.dataUser
+    if (!dataUser || dataUser === '') {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
     request({
-      url: '/tofly-lzd-data/data/createNetwork?importType=1&dataUser='+dataUser,
+      url: '/tofly-lzd-data/data/createNetwork?importType=1&dataUser=' + dataUser,
       method: 'POST',
-      timeout:600000
+      timeout: 600000
     })
       .then((result) => {
         if (result.code === 1) {
@@ -863,13 +913,13 @@ export default class PipeOnlineImprt extends Vue {
     制作场景缓存【正式库】
    */
   zsbuildModelTiles() {
-    const dataUser=this.$store.state.project.project.dataUser
-    if(!dataUser||dataUser===''){
+    const dataUser = this.$store.state.project.project.dataUser
+    if (!dataUser || dataUser === '') {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
     request({
-      url: '/tofly-lzd-data/data/modelSlice3d?importType=1&dataUser='+dataUser,
+      url: '/tofly-lzd-data/data/modelSlice3d?importType=1&dataUser=' + dataUser,
       method: 'POST'
     })
       .then((result) => {
@@ -927,8 +977,8 @@ export default class PipeOnlineImprt extends Vue {
   }
   /**更新发布标识 */
   updatePubcliSign(id) {
-    const dataUser=this.$store.state.project.project.dataUser
-    if(!dataUser||dataUser===''){
+    const dataUser = this.$store.state.project.project.dataUser
+    if (!dataUser || dataUser === '') {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
@@ -960,8 +1010,8 @@ export default class PipeOnlineImprt extends Vue {
    * 根据工程id删除数据
    */
   deleteData(row) {
-    const dataUser=this.$store.state.project.project.dataUser
-    if(!dataUser||dataUser===''){
+    const dataUser = this.$store.state.project.project.dataUser
+    if (!dataUser || dataUser === '') {
       this.$message.warning('未绑定空间数据库,请检查')
       return
     }
@@ -975,7 +1025,7 @@ export default class PipeOnlineImprt extends Vue {
           background: 'rgba(0, 0, 0, 0.7)'
         })
         request({
-          url: '/tofly-lzd-data/data/deleteData/' + id + '?importType=1&id=' + id+'&dataUser='+dataUser,
+          url: '/tofly-lzd-data/data/deleteData/' + id + '?importType=1&id=' + id + '&dataUser=' + dataUser,
           method: 'POST'
         })
           .then((result) => {

+ 29 - 9
src/views/groupPage/baseMap/components/ProjectMap.vue

@@ -1,6 +1,9 @@
 <template>
-  <div class="ProjectMap" id="ProjectMap" v-if="show">
-    <ComInfoBox ref="ComInfoBox" />
+  <div class="widget-outWrap">
+    <div class="ProjectMap" id="ProjectMap" v-if="show">
+      <ComInfoBox ref="ComInfoBox" />
+    </div>
+    <div class="widget-mask" v-if="districtModuleName"></div>
   </div>
 </template>
 
@@ -83,9 +86,9 @@ export default {
       this.$nextTick(() => {
         this.initData()
           .then((result) => {
-            setTimeout(() => {
-              this.addToMap()
-            }, 3000)
+            // setTimeout(() => {
+            this.addToMap()
+            // }, 3000)
           })
           .catch((error) => {
             console.log(error)
@@ -102,6 +105,9 @@ export default {
     },
     currentProjectInfo() {
       return this.$store.state.bigScreen.currentProjectInfo
+    },
+    districtModuleName() {
+      return this.$store.state.bigScreen.currentActive
     }
   },
   methods: {
@@ -184,11 +190,12 @@ export default {
       //   }
       // })
       this.$store.state.bigScreen.initView = initView
-      this.addInitScene()
-      this.addTerrain()
       setTimeout(() => {
+        //
+        this.addInitScene()
+        this.addTerrain()
         this.initModulesContentShow()
-      }, 5000)
+      }, 3000)
     },
     addRoad() {
       let viewer = this.viewer
@@ -440,8 +447,21 @@ export default {
 .ProjectMap {
   width: 100%;
   height: 100%;
-  position: relative;
+  // position: relative;
   // background: #000;
   background-size: 100% 100%;
 }
+.widget-outWrap {
+  position: relative;
+  height: 100%;
+  width: 100%;
+}
+.widget-mask {
+  pointer-events: none;
+  position: absolute;
+  top: 0;
+  background-image: -webkit-radial-gradient(center center, 50% 60% transparent, rgba(255, 255, 255, 0), #020306);
+  height: 100%;
+  width: 100%;
+}
 </style>

+ 13 - 8
src/views/groupPage/districtPageModules/commonModules/SearchBox.vue

@@ -34,7 +34,7 @@
         leave-active-class="animate__fadeOut"
       >
         <div class="infoPanel" v-if="isShowInfoPanel" @mouseenter="PanelEnter()" @mouseleave="PanelLeave()">
-          <pbs-tree ref="pbsTree" @selectChange="pbsTreeSelectChange" />
+          <pbs-tree ref="pbsTree" @selectChange="pbsTreeSelectChange" @searchCompleted="pbsSearchCompleted" />
         </div>
         <div class="devicePanel" v-if="!isShowInfoPanel && searchDeviceList.length > 0">
           <div
@@ -109,6 +109,7 @@ export default class SearchBox extends Vue {
   //设备查询列表
   searchDeviceList = []
   mounted() {
+    this.isShowInfoPanel = true //初始化显示Pbs树面板
     let target = this.$refs['widget-SearchBox'] as any
     if (this.$store.state.bigScreen.currentActive) target.style.setProperty('--left', '2.34375rem')
     else target.style.setProperty('--left', '.10417rem')
@@ -238,6 +239,13 @@ export default class SearchBox extends Vue {
       this.isSearching = false
       return
     }
+    this.loading = this.$loading({
+      lock: true,
+      text: '正在搜索中,请耐心等待...',
+      spinner: 'el-icon-loading',
+      background: 'rgba(0, 0, 0, 0.3)',
+      customClass: 'loadingclass'
+    })
     switch (searchType) {
       case '4':
         this.searchPrjSpeedInfo(inputObj)
@@ -266,13 +274,6 @@ export default class SearchBox extends Vue {
       // this.clearSelection()
       return
     }
-    this.loading = this.$loading({
-      lock: true,
-      text: '正在搜索中,请耐心等待...',
-      spinner: 'el-icon-loading',
-      background: 'rgba(0, 0, 0, 0.3)',
-      customClass: 'loadingclass'
-    })
     const data = { queryText: prjName } //查询条件
     const pipe = (this.config as any).pipe
     const that = this
@@ -492,6 +493,7 @@ export default class SearchBox extends Vue {
         break
       case '3':
         this.searchInput = data.code ? data.code : ''
+        this.isShowInfoPanel = false
         break
       case '2':
         this.searchInput = data.pipeId ? data.pipeId : ''
@@ -504,6 +506,9 @@ export default class SearchBox extends Vue {
   searchPbsTree(code) {
     ;(this.$refs['pbsTree'] as any).searchOnline(code)
   }
+  pbsSearchCompleted() {
+    this.loading.close()
+  }
   searchEntity(input) {
     this.searchDeviceList = []
     let dataSource = this.viewer.dataSources.getByName('monitorTree')

+ 16 - 5
src/views/groupPage/districtPageModules/customTools/monitorTree.vue

@@ -159,19 +159,28 @@ export default class monitorTree extends Vue {
     return iconSrc
   }
   handleTreeNodeClick(data) {
+    console.log(data)
     if (!data.longitude || !data.latitude) {
       this.$message.info('暂无位置信息')
       return
     }
-    let entity = customDataSource.entities.getById(data.name)
+    let entity = customDataSource.entities.getById(data.id)
     let item = {
       name: data.name,
       id: data.id,
       position: [Number(data.longitude), Number(data.latitude)],
       info: data
     }
-    this.viewer.flyTo(entity).then(() => {
-      this.initInfoPop(item, Cesium.Cartesian3.fromDegrees(item.position[0], item.position[1]))
+    // this.viewer
+    //   .flyTo(entity)
+    //   .then(() => {
+    //     this.initInfoPop(item, Cesium.Cartesian3.fromDegrees(item.position[0], item.position[1]))
+    //   })
+    this.viewer.camera.flyTo({
+      destination: Cesium.Cartesian3.fromDegrees(item.position[0] + 0.005, item.position[1], 5000.0), //设置相机终点位置偏移以及高度
+      complete: () => {
+        this.initInfoPop(item, Cesium.Cartesian3.fromDegrees(item.position[0], item.position[1]))
+      }
     })
   }
   getCheckList() {
@@ -229,7 +238,7 @@ export default class monitorTree extends Vue {
     const position = Cesium.Cartesian3.fromDegrees(options.position[0], options.position[1], 0)
     var bottomPosition = Cesium.Cartographic.fromCartesian(position)
     var entity = new Cesium.Entity({
-      id: options.name,
+      id: options.id,
       type: 'deviceInfo',
       name: options.name,
       show: true,
@@ -246,7 +255,9 @@ export default class monitorTree extends Vue {
       },
       info: options
     })
-    customDataSource.entities.add(entity)
+    if (!customDataSource.entities.getById(options.id)) {
+      customDataSource.entities.add(entity)
+    }
   }
   iconSelect(type) {
     let icon = ''

+ 1 - 0
src/views/groupPage/districtPageModules/customTools/pbsTree.vue

@@ -442,6 +442,7 @@ export default {
         })
         this.treeData = nodes
       }
+      this.$emit('searchCompleted')
     },
     /**
      * 工程名称选项本地搜索

+ 2 - 1
src/views/groupPage/districtPageModules/projectPanoramic/ParticipationUnits.vue

@@ -18,7 +18,7 @@
             <div class="icon"></div>
             <span class="item-name">{{ item.indexName }}</span>
           </div>
-          <div class="content">{{ item.indexValue }}</div>
+          <div class="content">{{ item.indexValue.replaceAll('、', '\n') }}</div>
         </div>
       </div>
     </div>
@@ -164,6 +164,7 @@ export default class ParticipationUnits extends Vue {
         font-weight: 400;
         color: #ffffff;
         line-height: 0.109375rem /* 21/192 */;
+        white-space: pre-wrap;
       }
     }
   }

+ 1 - 1
src/views/groupPage/districtPageModules/projectPanoramic/ProjectProgress.vue

@@ -342,7 +342,7 @@ export default class ProjectProgress extends Vue {
       building: bsd.filter((i) => i.node_status == 'doing').length,
       finished: bsd.filter((i) => i.node_status == 'done').length,
       nobuilding: bsd.filter((i) => i.node_status == 'normal').length,
-      unit: '总个数'
+      unit: '总作业面'
     }
   }
 }

+ 388 - 0
src/views/groupPage/districtPageModules/projectPanoramic/ProjectProgressNew.vue

@@ -0,0 +1,388 @@
+<template>
+  <transition
+    appear
+    name="animate__animated animate__move"
+    enter-active-class="animate__slideInRight"
+    leave-active-class="animate__slideOutRight"
+  >
+    <div class="widget-ProjectProgress">
+      <div class="head">
+        <div class="title">
+          <div class="icon"></div>
+          <span class="site-info">项目进展</span>
+        </div>
+      </div>
+      <div class="content-info">
+        <!--  -->
+        <div class="content-item progress">
+          <div class="title">
+            <div class="icon"></div>
+            <span class="item-name">施工情况</span>
+          </div>
+          <div class="content contruct-content">
+            {{ contructContent }}
+          </div>
+        </div>
+        <!--  -->
+        <div class="content-item settlement">
+          <div class="title">
+            <div class="icon"></div>
+            <span class="item-name">本年结算情况</span>
+          </div>
+          <div class="content"></div>
+        </div>
+        <!--  -->
+        <div class="content-item outputValue">
+          <div class="title">
+            <div class="icon"></div>
+            <span class="item-name">建管本年产值统计</span>
+          </div>
+          <div class="content"></div>
+        </div>
+        <!--  -->
+        <div class="content-item outputValueSta">
+          <div class="title">
+            <div class="icon"></div>
+            <span class="item-name">建管本年产值统计</span>
+          </div>
+          <div class="content"></div>
+        </div>
+      </div>
+    </div>
+  </transition>
+</template>
+
+<script lang="ts">
+import url from '../../images/base64/3dBaseBack'
+import { getRequestResult, getEpcBuilding, getWeekCountData } from '../../apis'
+import { setNullAndUndefinedEmpty, fontSize as fs } from '../../util'
+import { Vue, Component, Prop, Watch } from 'vue-property-decorator'
+import ComOneBatteryChart from '../../components/BatteryChart/ComOneBatteryChart.vue'
+import ComProgressChart from '../../components/BarChart/ComProgressChart.vue'
+import ComProgressPieChart from '../../components/PieChart/ComProgressPieChart.vue'
+import ComThreeDimensionsChart from '../../components/OthersChart/ComThreeDimensionsChart.vue'
+const staffTypeList = [
+  { code: 'person_all', name: '总包部' },
+  { code: 'person_build', name: '建设部' },
+  { code: 'person_survey', name: '勘察单位' },
+  { code: 'person_design', name: '设计单位' },
+  { code: 'person_construct', name: '施工单位' }
+]
+const deviceTypeList = [
+  { code: 'device_gdjc', name: '管道检修设备' },
+  { code: 'device_kw', name: '开挖设备' },
+  { code: 'device_other', name: '其他设备' },
+  { code: 'device_cl', name: '测量设备' },
+  { code: 'device_fdj', name: '发电机' },
+  { code: 'device_dj', name: '地基处理设备' },
+  { code: 'device_zh', name: '支护设备' },
+  { code: 'device_tz', name: '填筑设备' },
+  { code: 'device_ly', name: '拉运设备' }
+]
+//项目进展
+@Component({
+  name: 'ProjectProgress',
+  components: { ComOneBatteryChart, ComProgressChart, ComProgressPieChart, ComThreeDimensionsChart }
+})
+export default class ProjectProgress extends Vue {
+  @Prop({ type: Object, default: () => {} }) dataInfo!: any
+  url = url
+  investData: object = {}
+  contructContent: string = ''
+  progressData: Array<any> = [{}, {}, {}]
+  buildStatusData: object = {}
+  buildDredgingData: object = {}
+  complishPercent: number = 0 //完成占比
+  staList: Array<any> = [{}, {}]
+  totalPerson: number = 0
+  totalDevice: number = 0
+  staffingList: Array<any> = []
+  devicesList: Array<any> = []
+  get fontSize() {
+    return fs
+  }
+  get setNoNull() {
+    return setNullAndUndefinedEmpty
+  }
+  get projectCode() {
+    return this.$store.state.bigScreen.currentProjectCode
+  }
+  // @Watch('projectCode', { immediate: true })
+  // onChangMehod() {
+  //   setTimeout(() => {
+  //     this.getPageData()
+  //   }, 3000)
+  // }
+  roundFun(value, n) {
+    return Math.round(value * Math.pow(10, n)) / Math.pow(10, n)
+  }
+  // getPageData() {
+  //   let data = { blockCode: 'ycepclist' }
+  //   let projectCode = this.projectCode
+  //   this.reset()
+  //   //获取全部数据
+  //   getRequestResult(data).then((res: Array<any>) => {
+  //     res = res.filter((item) => item.indexCode.indexOf(projectCode + '-') != -1)
+  //     res = res.map((item) => {
+  //       Object.keys(item).forEach((val) => (item[val] = item[val] || ''))
+  //       return {
+  //         ...item,
+  //         indexValue:
+  //           item.unit === '万'
+  //             ? this.roundFun(this.setNoNull(item.indexValue) / 10000, 4)
+  //             : this.setNoNull(item.indexValue)
+  //       }
+  //     })
+  //     //投资完成情况
+  //     this.investData = {
+  //       num: res.find((e) => e.indexCode == projectCode + '-' + 21).indexValue,
+  //       numUnit: res.find((e) => e.indexCode == projectCode + '-' + 2).unit,
+  //       total: res.find((e) => e.indexCode == projectCode + '-' + 2).indexValue,
+  //       totalUnit: res.find((e) => e.indexCode == projectCode + '-' + 2).unit
+  //     }
+  //     //设计进度
+  //     this.progressData = this.progressData.map((item, index) => {
+  //       let target = index * 2
+  //       return {
+  //         name: res.find((e) => e.indexCode == projectCode + '-' + (index + 22)).indexName,
+  //         percent:
+  //           res.find((e) => e.indexCode == projectCode + '-' + (index + 22)).indexValue +
+  //           res.find((e) => e.indexCode == projectCode + '-' + (index + 22)).unit,
+  //         totalAmout: res.find((e) => e.indexCode == projectCode + '-' + (target + 25)).indexValue,
+  //         finishAmout: res.find((e) => e.indexCode == projectCode + '-' + (target + 26)).indexValue
+  //       }
+  //     })
+  //     //施工进度
+  //     this.buildStatusData = {
+  //       building: res.find((e) => e.indexCode == projectCode + '-' + 31).indexValue,
+  //       finished: res.find((e) => e.indexCode == projectCode + '-' + 32).indexValue,
+  //       nobuilding: res.find((e) => e.indexCode == projectCode + '-' + 33).indexValue,
+  //       unit: res.find((e) => e.indexCode == projectCode + '-' + 31).unit
+  //     }
+  //     this.buildDredgingData = {
+  //       building: res.find((e) => e.indexCode == projectCode + '-' + 34).indexValue,
+  //       finished: 0,
+  //       nobuilding: res.find((e) => e.indexCode == projectCode + '-' + 35).indexValue,
+  //       unit: res.find((e) => e.indexCode == projectCode + '-' + 34).unit
+  //     }
+  //     //上周项目情况
+  //     this.complishPercent =
+  //       res.find((e) => e.indexCode == projectCode + '-' + 38).indexValue +
+  //       res.find((e) => e.indexCode == projectCode + '-' + 38).unit
+  //     this.staList = this.staList.map((item, index) => {
+  //       return {
+  //         name: res.find((e) => e.indexCode == projectCode + '-' + (index + 36)).indexName,
+  //         value: res.find((e) => e.indexCode == projectCode + '-' + (index + 36)).indexValue,
+  //         unit: '亿'
+  //       }
+  //     })
+  //     //
+  //     this.totalPerson = res.find((e) => e.indexCode == projectCode + '-' + +39).indexValue
+  //     this.totalDevice = res.find((e) => e.indexCode == projectCode + '-' + +40).indexValue
+  //     res
+  //       .filter((item) => item.indexCode.indexOf(projectCode + '-' + '40') != -1)
+  //       .forEach((citem) => {
+  //         this.staffingList.push({
+  //           title: citem.indexName,
+  //           value: citem.indexValue,
+  //           unit: citem.unit
+  //         })
+  //       })
+  //     res
+  //       .filter((item) => item.indexCode.indexOf(projectCode + '-' + '44') != -1)
+  //       .forEach((citem) => {
+  //         this.devicesList.push({
+  //           title: citem.indexName,
+  //           value: citem.indexValue,
+  //           unit: citem.unit
+  //         })
+  //       })
+  //   })
+  // }
+  reset() {
+    this.staffingList = []
+    this.devicesList = []
+  }
+  @Watch('dataInfo')
+  onChangMehod() {
+    this.getPageData()
+  }
+  async getPageData() {
+    this.reset()
+    if (!this.dataInfo) return
+    const { contract_epc_money, contract_ppp_money } = this.dataInfo || {}
+    //投资完成情况
+    this.investData = {
+      num: this.roundFun(contract_epc_money / 10 ** 8, 4),
+      numUnit: '亿',
+      total: this.roundFun(contract_ppp_money / 10 ** 8, 4),
+      totalUnit: '亿'
+    }
+    //获取施工状态
+    this.getBuildStatusData()
+    //周报统计
+    const weekCountData = await getWeekCountData({ code: this.projectCode })
+    const wcd = weekCountData.result
+    if (!wcd) return
+    const { year_finish_ratio, year_finish, year_plan, contruct_content } = wcd || {}
+    this.contructContent = contruct_content
+    this.complishPercent = year_finish_ratio
+    this.staList = [
+      { name: '本年计划完成产值', value: +year_plan, unit: '万元' },
+      { name: '本年实际完成产值', value: +year_finish, unit: '万元' }
+    ]
+    let staff = [],
+      devices = []
+    for (const key in wcd) {
+      if (key.includes('person_') && key != 'person_num') {
+        staff.push(this.assembleStuff(key, wcd))
+      }
+      if (key.includes('device_') && key != 'device_num') {
+        devices.push(this.assembleDevice(key, wcd))
+      }
+    }
+    this.staffingList = staff
+    this.totalPerson = this.countTotal(staff, 'value')
+    this.devicesList = devices
+    this.totalDevice = this.countTotal(devices, 'value')
+  }
+  countTotal(arr, keyName) {
+    let total = 0
+    total = arr.reduce(function (total, currentValue, currentIndex, arr) {
+      return currentValue[keyName] ? total + currentValue[keyName] : total
+    }, 0)
+    return total
+  }
+  assembleStuff(key, obj) {
+    let target: any = staffTypeList.find((i) => i.code == key) || {}
+    return { title: target.name, value: +obj[key], unit: '人' }
+  }
+  assembleDevice(key, obj) {
+    let target: any = deviceTypeList.find((i) => i.code == key) || {}
+    return { title: target.name, value: +obj[key], unit: '台' }
+  }
+  //施工状态
+  async getBuildStatusData() {
+    const buildStatusData = await getEpcBuilding({ code: this.projectCode })
+    if (buildStatusData.result.length == 0) return
+    const bsd = buildStatusData.result
+    this.buildStatusData = {
+      building: bsd.filter((i) => i.node_status == 'doing').length,
+      finished: bsd.filter((i) => i.node_status == 'done').length,
+      nobuilding: bsd.filter((i) => i.node_status == 'normal').length,
+      unit: '总作业面'
+    }
+  }
+}
+</script>
+
+<style lang='scss' scoped>
+.animate__slideInRight,
+.animate__slideOutRight {
+  animation-duration: 3s; //动画持续时间
+  animation-delay: 0s; //动画延迟时间
+}
+.widget-ProjectProgress {
+  $size10: 0.052083rem /* 10/192 */;
+  $size20: 0.104167rem /* 20/192 */;
+  z-index: 2;
+  //position
+  bottom: $size10 /* 10/192 */;
+  margin-right: $size20 /* 20/192 */;
+  right: 0;
+  position: absolute;
+  //size
+  height: calc(100% - 0.557292rem /* 107/192 */);
+  width: 2.083333rem /* 400/192 */;
+  color: #eee;
+  .head {
+    height: 0.166667rem /* 32/192 */;
+    width: 100%;
+    background: linear-gradient(-90deg, rgba(43, 167, 255, 0.2) 0%, rgba(43, 167, 255, 0.08) 100%);
+    font-family: Source Han Sans CN-HEAVY;
+    .title {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      font-weight: 400;
+      align-items: center;
+      .icon {
+        height: 0.166667rem /* 32/192 */;
+        width: 0.34375rem /* 66/192 */;
+        background: url('~@/views/groupPage/images/模块图标/项目进展.png') no-repeat center center;
+        background-size: 100% 100%;
+      }
+      span {
+        flex: 1;
+        font-weight: bold;
+        font-size: 0.083333rem /* 16/192 */;
+        color: #ffffff;
+        padding: 0.041667rem /* 8/192 */;
+        background: linear-gradient(0deg, #9bd2fa 0%, #ffffff 100%);
+        background-clip: text;
+        -webkit-text-fill-color: transparent;
+      }
+    }
+  }
+  .content-info {
+    width: 100%;
+    height: calc(100% - 0.166667rem);
+    overflow: auto;
+    .content-item {
+      margin-top: 0.052083rem /* 10/192 */;
+      padding: 0.088542rem /* 17/192 */ 0.046875rem /* 9/192 */ 0.083333rem /* 16/192 */ 0.046875rem /* 9/192 */;
+      width: 100%;
+      float: left;
+      overflow: hidden;
+      background: linear-gradient(0deg, rgba(14, 167, 255, 0.1) 0%, rgba(14, 167, 255, 0.1) 100%);
+      .title {
+        width: 100%;
+        display: flex;
+        margin-bottom: 0.0625rem /* 12/192 */;
+        .icon {
+          height: 0.072917rem /* 14/192 */;
+          width: 0.078125rem /* 15/192 */;
+          margin-right: 0.046875rem /* 9/192 */;
+          background: url('~@/views/groupPage/images/三角.png') no-repeat center center;
+          background-size: 100% 100%;
+        }
+        .item-name {
+          font-family: Source Han Sans CN;
+          color: #0ea7ff;
+          font-size: 0.072917rem /* 14/192 */;
+          font-weight: 500;
+        }
+        .item-info {
+          color: #2ba7ff;
+          font-size: 0.072917rem /* 14/192 */;
+          font-weight: 500;
+        }
+      }
+      .content {
+        height: calc(100% - 0.125rem /* 24/192 */);
+        width: 100%;
+        display: flex;
+      }
+      .contruct-content {
+        overflow: auto;
+        text-indent: 1cm; //28px
+        color: #feffff;
+        font-family: Source Han Sans CN;
+        font-size: 0.07292rem;
+        line-height: 0.109375rem /* 21/192 */;
+        word-break: break-all;
+      }
+    }
+    .progress {
+      height: 0.859375rem /* 165/192 */ !important;
+    }
+    .settlement,
+    .outputValue {
+      height: 1.041667rem /* 200/192 */ !important;
+    }
+    .outputValueSta {
+      height: calc(100% - 3.151042rem /* 605/192 */) !important;
+    }
+  }
+}
+</style>

+ 2 - 1
src/views/groupPage/districtPageModules/statisticalAnalysis/ThemeSwitch.vue

@@ -134,7 +134,8 @@ export default class specialSwitch extends Vue {
           }
         }
         .active {
-          height: 0.286458rem /* 55/192 */;
+          // height: 0.286458rem /* 55/192 */;
+          height: 0.229167rem /* 44/192 */;
           background: url('~@/views/groupPage/images/模块图标/统计分析/当前tab.png') no-repeat center center;
           background-size: 100% 100%;
         }

+ 7 - 0
src/views/groupPage/districtPageModules/statisticalAnalysis/qualityModule/ProjectSituationofQMNew.vue

@@ -171,7 +171,14 @@ export default class ProjectSituationofQM extends Vue {
     const res = await getEpcQbsDetailPage({ project_code: this.projectCode })
     let { code, result } = res
     if (code != 1) return
+    result.records.sort((a, b) => {
+      return b.create_time.localeCompare(a.create_time)
+    })
+    result.records = result.records.filter(
+      (item) => moment(new Date()).diff(moment(item.create_time), 'days') < moment(new Date()).daysInMonth()
+    )
     this.recordsList = result.records
+    console.log('质量验评记录', this.recordsList)
   }
   async getImgData() {
     const res = await getImgFiles({ size: 999, imgType: 'tjfxzl', groupCode: this.projectCode, isShow: 1 })

+ 2 - 2
src/views/groupPage/groupPageModules/IndexStatistic.vue

@@ -94,8 +94,8 @@ export default {
     //   })
     // },
     async setData() {
-      const { projectNum, totalInvestment, epcNum, epcZtz } = this.dataInfo || {}
-      const prjArr = [projectNum, totalInvestment, epcNum, epcZtz]
+      const { projectNum, jgZhtje, epcNum, epcZtz } = this.dataInfo || {}
+      const prjArr = [projectNum, jgZhtje, epcNum, epcZtz]
       this.dataList = this.dataList.map((item, index) => {
         return { ...item, value: prjArr[index] }
       })

+ 1 - 0
src/views/groupPage/header/header.vue

@@ -341,6 +341,7 @@ export default {
   $size14: 0.072917rem /* 14/192 */;
   $size10: 0.052083rem /* 10/192 */;
   $size8: 0.041667rem /* 8/192 */;
+  user-select: none;
   .header {
     width: 100%;
     height: 0.375rem /* 72/192 */;

BIN
src/views/groupPage/images/模块图标/统计分析/当前tab.png


BIN
src/views/groupPage/images/模块图标/统计分析/默认tab.png


+ 3 - 3
src/views/login/index.vue

@@ -24,7 +24,7 @@
         >
           <el-input
             ref="username"
-            v-model="loginForm.username"
+            v-model.trim="loginForm.username"
             prefix-icon="el-icon-user"
             placeholder="请输入账号"
             name="username"
@@ -36,7 +36,7 @@
           <el-input
             :key="passwordType"
             ref="password"
-            v-model="loginForm.password"
+            v-model.trim="loginForm.password"
             :type="passwordType"
             placeholder="请输入密码"
             name="password"
@@ -52,7 +52,7 @@
             tabindex="3"
             prefix-icon="el-icon-tickets"
             placeholder="请输入短信验证码"
-            v-model="loginForm.msg"
+            v-model.trim="loginForm.msg"
             type="text"
             class="form-input"
           >