Bläddra i källkod

表单配置修改

duy 1 månad sedan
förälder
incheckning
0a42b2b960
2 ändrade filer med 6563 tillägg och 140 borttagningar
  1. 6200 0
      src/views/manager/projectinfo/tree copy.vue
  2. 363 140
      src/views/manager/projectinfo/tree.vue

+ 6200 - 0
src/views/manager/projectinfo/tree copy.vue

@@ -0,0 +1,6200 @@
+<template>
+  <div style="height: 100%">
+    <basic-container v-show="showType == 1">
+      <el-row class="titlerow">
+        <el-col>
+          <div style="position: relative">
+            <span style="float: left; margin-top: 15px; color: white">{{
+              projectName
+            }}</span>
+              <el-button
+              size="medium"
+              icon="el-icon-help"
+              style="margin-right: 10px"
+              @click="fileTitleHandle"
+              >文件题名(全局)
+            </el-button>
+
+            <el-dropdown   style="margin-right: 10px"  @command	="handleBasicClick" v-if="wbsType == 2">
+              <el-button  size="medium">
+                基础数据管理<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item command="code">编号管理</el-dropdown-item>
+                <el-dropdown-item command="rule">规范参数配置</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+            <!-- 同步按钮 -->
+            <el-button
+              size="medium"
+              style="margin-right: 10px"
+              @click="proSyncbtn"
+              >项目数据同步
+            </el-button>
+            <el-button
+              size="medium"
+              icon="el-icon-s-grid"
+              @click="eleFormulaHandle"
+              v-if="leftType == 5"
+              >表单设置
+            </el-button>
+            <el-button
+              size="medium"
+              icon="el-icon-s-grid"
+              @click="eleHandle"
+              v-else
+              >元素设置
+            </el-button>
+
+           
+
+            <el-button size="medium" icon="el-icon-help" @click="nodeInfoHandle"
+              >节点参数设置
+            </el-button>
+            <el-button
+              style="margin-top: 10px"
+              size="medium"
+              icon="el-icon-price-tag"
+              @click="independent"
+              >独立表单库
+            </el-button>
+            <el-button
+              style="margin-top: 10px"
+              size="medium"
+              icon="el-icon-time"
+              @click="archiveTimeClick"
+              >归档文件时间设置
+            </el-button>
+         
+          </div>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20" class="h-100p" style="padding: 10px">
+        <el-col :span="8" style="height: 85%">
+          <div class="h-100p flex flex-d-c">
+               <p style="margin-top: 2px">
+              工程节点信息
+                <el-button
+                v-if="isNodeType"
+                style="margin-right: 10px"
+                size="medium"
+                icon="el-icon-set-up"
+                @click="changeType(false)"
+                type="primary"
+                >切换表单
+              </el-button>
+              <el-button
+              v-else
+                style="margin-right: 10px"
+                size="medium"
+                icon="el-icon-set-up"
+                @click="changeType(true)"
+                type="warning"
+                >切换节点
+              </el-button>
+            </p>
+            <div
+              class="flex"
+              style="align-items: center; justify-content: space-between"
+            >
+            <div v-if="isNodeType">
+               <div>
+                 <el-radio v-model="searchType" label="1">节点</el-radio>
+               </div>
+                <div>
+                  <el-radio v-model="searchType" label="2">表名</el-radio>
+                </div>
+            </div>
+              <el-input
+              v-if="isNodeType"
+                placeholder="输入关键字进行过滤"
+                v-model="filterText"
+                clearable
+                style="width: 65%; margin-right: 15px"
+                @clear="clearSearch"
+              ></el-input>
+             
+              <el-button type="primary" @click="searchTreeClick" v-if="isNodeType"
+                >搜索</el-button
+              >
+               <el-input
+               v-if="!isNodeType"
+                placeholder="输入关键字进行过滤"
+                v-model="filterText1"
+                clearable
+                style="width: 65%; margin-right: 15px"
+                @clear="clearSearch1"
+              ></el-input>
+             
+              <el-button type="primary" @click="searchTreeClick1"  v-if="!isNodeType"
+                >搜索</el-button
+              >
+              <el-tooltip content="查询工序节点无内业资料类型" placement="top">
+                <el-button type="success" @click="filterSearchClick"  v-if="isNodeType">过滤</el-button>
+              </el-tooltip>
+            </div>
+            <div class="flex1 ov-hidden" v-if=isNodeType>
+              <el-scrollbar class="h-100p" v-if="isShowTree">
+                <div v-loading="treeLoad">
+                  <el-tree
+                    class="filter-tree"
+                    lazy
+                    :load="loadNode"
+                    @node-click="getNodeDetail"
+                    :props="defaultProps"
+                    :expand-on-click-node="false"
+                    highlight-current
+                    node-key="id"
+                    ref="tree"
+                    :default-expanded-keys="defaultExpandedKeys"
+                    v-show="!isSearch"
+                  >
+                    <span
+                      class="custom-tree-node"
+                      :class="data.moreShow ? 'show' : ''"
+                      slot-scope="{ node, data }"
+                      @mouseleave="mouseout(data)"
+                    >
+                      <div class="pd-r-20">
+                        {{ node.label }}
+                        <div class="normal-black">
+                          <div>
+                            <el-link :underline="false">
+                              <i
+                                class="el-icon-menu"
+                                @click.stop="showMenu($event, data, node)"
+                                v-if="node.level != 1"
+                              ></i>
+                            </el-link>
+
+                            <!-- 因右键自定义菜单事件需要获取当前点击的位置,所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置 -->
+                            <ul
+                              v-show="menuvisible"
+                              :style="{
+                                left: menuleft + 'px',
+                                top: menutop + 'px',
+                              }"
+                              class="contextmenu"
+                            >
+                              <li
+                                v-for="item in menusData"
+                                :key="item"
+                                @click="menuClick($event, item, data,node)"
+                              >
+                                <i :class="item.icon"></i>
+                                <el-tooltip
+                                  class="item"
+                                  effect="light"
+                                  :content="item.content"
+                                  placement="right-start"
+                                >
+                                  <span>{{ item.label }}</span>
+                                </el-tooltip>
+                              </li>
+                            </ul>
+                          </div>
+                        </div>
+                      </div>
+                    </span>
+                  </el-tree>
+                  <el-tree
+                    :load="searchtreeLoad"
+                    :data="searchTreeData"
+                    @node-click="getNodeDetail"
+                    :props="defaultProps"
+                    :expand-on-click-node="false"
+                    highlight-current
+                    node-key="id"
+                    v-show="isSearch"
+                    default-expand-all
+                  >
+                    <span
+                      class="custom-tree-node"
+                      :class="data.moreShow ? 'show' : ''"
+                      slot-scope="{ node, data }"
+                      @mouseleave="mouseout(data)"
+                    >
+                      <div class="pd-r-20">
+                        {{ node.label }}
+                        <div class="normal-black">
+                          <div>
+                            <el-link :underline="false">
+                              <i
+                                class="el-icon-menu"
+                                @click="showMenu($event, data, node)"
+                                v-if="node.level != 1"
+                              ></i>
+                            </el-link>
+
+                            <ul
+                              v-show="menuvisible"
+                              :style="{
+                                left: menuleft + 'px',
+                                top: menutop + 'px',
+                              }"
+                              class="contextmenu"
+                            >
+                              <li
+                                v-for="item in menusData"
+                                :key="item"
+                                @click="menuClick($event, item, data,node)"
+                              >
+                                <i :class="item.icon"></i>{{ item.label }}
+                              </li>
+                            </ul>
+                          </div>
+                        </div>
+                      </div>
+                    </span>
+                  </el-tree>
+                </div>
+              </el-scrollbar>
+            </div>
+            <div v-else  class="flex1 ov-hidden">        
+              <el-scrollbar class="h-100p" >
+              
+              <el-tree
+             
+                :default-expanded-keys="defaultExpandedKeysType"
+                ref="treeByType"
+                class="filter-tree"
+                lazy
+                :load="loadNodeByType"
+                :props="defaultPropsByType"
+                :expand-on-click-node="false"
+                highlight-current
+                node-key="id"
+                @node-click="getNodeDetailByType"
+                @node-expand="handleNodeExpand"
+                @node-collapse="handleNodeCollapse"
+              >
+                <span class="custom-tree-node" slot-scope="{ node, data }">
+                  <div class="pd-r-20">
+                    {{ node.label }}
+                  </div>
+                </span>
+              </el-tree>
+              
+              
+              </el-scrollbar>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="16" class="h-100p flex flex-d-c">
+          <template v-if="leftType == 5">
+            <div class="mg-b-10" v-if='isNodeType'>节点信息</div>
+            <div v-if="isNodeType">
+              <el-table :data="tableData" border style="width: 100%">
+                <el-table-column
+                  align="center"
+                  prop="nodeName"
+                  label="当前节点"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="nodeType"
+                  :formatter="formatCat"
+                  label="节点类型"
+                  width="180"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="parentName"
+                  label="上级节点"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="primaryKeyId"
+                  label="primaryKeyId"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="id"
+                  label="id"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="majorDataType"
+                  :formatter="formMajorType"
+                  label="内业资料类型"
+                ></el-table-column>
+              </el-table>
+            </div>
+            <div class="flex jc-sb">
+              <p>
+                <span>当前项目信息表</span>
+          
+                <el-button
+               
+                  type="text"
+                  style="margin-left: 10px"
+                  icon="el-icon-edit-outline"
+                  class="text-icon"
+                  @click="editEditElementForm()"
+                ></el-button>
+                <el-button
+             v-if="isNodeType"
+                  type="text"
+                  icon="el-icon-sort"
+                  class="text-icon"
+                  @click="privateTableSort()"
+                ></el-button>
+              </p>
+              <div class="mg-t-10"></div>
+            </div>
+            <div style="flex: 1; position: relative">
+              <el-table
+                :data="formData"
+                border
+                height="100%"
+                style="width: 100%; position: absolute"
+              >
+                <el-table-column
+                  align="center"
+                  prop="tableName"
+                  label="表单名称"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="elementTotal"
+                  width="80"
+                  label="字段总量"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="fillRate"
+                  width="80"
+                  label="填报率"
+                ></el-table-column>
+                <el-table-column
+               
+                  align="center"
+                  prop="tableType"
+                  :formatter="formatTableType"
+                  width="100"
+                  label="表单类型"
+                ></el-table-column>
+                
+                <el-table-column width="150" 
+                  align="center"
+                  prop="tableOwner"
+                  :formatter="formatOwner"
+                  label="所属方"
+                ></el-table-column>
+                
+                <el-table-column label="操作"      >
+                  <template slot-scope="scope">
+                    <el-button
+                      size="mini"
+                     
+
+                      @click="handlePreview(scope.$index, scope.row)"
+                      >预览
+                    </el-button>
+                    <el-button
+                      size="mini"
+                      @click="handleEdit(scope.$index, scope.row)"
+                      >编辑
+                    </el-button>
+                    <el-button
+                      size="mini"
+                      type="success"
+                      v-throttle="3000"
+                      v-show="scope.row.status == 0"
+                      @click="hideMD(scope.row)"
+                      >取消隐藏
+                    </el-button>
+                    <el-button
+                      size="mini"
+                      type="primary"
+                      v-throttle="3000"
+                      v-show="scope.row.status == 1"
+                      @click="hideMD(scope.row)"
+                      >隐藏表单
+                    </el-button>
+                    <el-button
+                    v-if="isNodeType"
+                      size="mini"
+                      type="danger"
+                      @click="handleDelete(scope.$index, scope.row)"
+                      >删除
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </template>
+          <template v-if="leftType == 4">
+            <div style="flex: 1; position: relative">
+              <el-table
+                :data="formData"
+                border
+                height="100%"
+                style="width: 100%; position: absolute"
+              >
+                <el-table-column
+                  align="center"
+                  prop="tableName"
+                  label="表单名称"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="tableType"
+                  :formatter="formatTableType"
+                  label="表单类型"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="fillRate"
+                  label="填报率"
+                ></el-table-column>
+                <el-table-column
+                  label="是否关联清表"
+                  prop="isLinkTable"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <span v-if="scope.row.isLinkTable == 2">是</span>
+                    <span v-else>否</span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="tableOwner"
+                  :formatter="formatOwner"
+                  label="所属方"
+                ></el-table-column>
+                <el-table-column label="操作" width="520" align="center">
+                  <template slot-scope="scope">
+                    <el-link type="primary" @click="Associationlist(scope)"
+                      >关联清表
+                    </el-link>
+                    <el-link
+                      class="mg-l-10"
+                      type="primary"
+                      :disabled="
+                        scope.row.excelId == -1 || scope.row.excelId == null
+                      "
+                      @click="
+                        rightClick(
+                          scope.row.pkeyId,
+                          scope.row.excelId,
+                          scope.row.id,
+                          scope.row.initTableName,
+                          scope.row.initTableId
+                        )
+                      "
+                      >编辑元素
+                    </el-link>
+                    <el-link
+                      class="mg-l-10"
+                      type="primary"
+                      :disabled="
+                        scope.row.excelId == -1 || scope.row.excelId == null
+                      "
+                      @click="adjustExcel(scope.row.pkeyId, scope.row.excelId)"
+                      >调整表单
+                    </el-link>
+                    <el-link
+                      class="mg-l-10"
+                      type="primary"
+                      @click="handleEditFormula(scope.$index, scope.row)"
+                      v-if="isNodeType"
+                      >编辑元素公式
+                    </el-link>
+               
+                  <el-dropdown @command="handleCommand($event,scope.row)"  v-if="isNodeType">
+                    <el-button type="text"  class="mg-l-10">
+                      表单同步<i class="el-icon-arrow-down el-icon--right"></i>
+                    </el-button>
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item command="a">同步到项目下所有表单</el-dropdown-item>
+                      <el-dropdown-item command="b">同步其他表单配置</el-dropdown-item>
+                    </el-dropdown-menu>
+                  </el-dropdown>
+                    <el-button
+                      class="mg-l-10"
+                      type="text"
+                      :loading="handlesyncLoad"
+                      @click="handleLinkNodes(scope.$index, scope.row)"
+                      v-if="
+                        curTreeData.nodeType === 1000 ||
+                        curTreeData.nodeType === 1001
+                      "
+                      >关联节点
+                    </el-button>
+                    <el-link
+                      class="mg-l-10"
+                      type="danger"
+                      @click="handleDelete(scope.$index, scope.row)"
+                       v-if="isNodeType"
+                      >删除表单
+                    </el-link>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </template>
+        </el-col>
+      </el-row>
+    </basic-container>
+    <el-row class="h-100p" v-show="showType == 2">
+      <el-col :span="6" class="h-100p">
+        <basic-container>
+          <el-scrollbar class="h-100p">
+            <el-tree
+              class="filter-tree"
+              lazy
+              :data="typeTreeData"
+              :load="typeTreeLoadNode"
+              @node-click="getTypeTreeDetail"
+              :props="defaultProps"
+              :expand-on-click-node="false"
+              highlight-current
+              node-key="id"
+            >
+            </el-tree>
+          </el-scrollbar>
+        </basic-container>
+      </el-col>
+      <el-col :span="18" class="h-100p">
+        <basic-container>
+          <div class="flex h-100p flex-d-c">
+            <div style="flex: 1; position: relative">
+              <el-table
+                :data="formData"
+                border
+                height="100%"
+                style="width: 100%; position: absolute"
+              >
+                <el-table-column
+                  align="center"
+                  prop="tableName"
+                  label="表单名称"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="tableType"
+                  :formatter="formatTableType"
+                  label="表单类型"
+                ></el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="fillRate"
+                  label="填报率"
+                ></el-table-column>
+                <el-table-column
+                  label="是否关联清表"
+                  prop="isLinkTable"
+                  align="center"
+                >
+                  <template slot-scope="scope">
+                    <span v-if="scope.row.isLinkTable == 2">是</span>
+                    <span v-else>否</span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  align="center"
+                  prop="tableOwner"
+                  :formatter="formatOwner"
+                  label="所属方"
+                ></el-table-column>
+                <el-table-column label="操作" align="center">
+                  <template slot-scope="scope">
+                    <el-link type="primary" @click="Associationlist(scope)"
+                      >关联清表
+                    </el-link>
+                    <el-link
+                      class="mg-l-10"
+                     
+                      type="primary"
+                      :disabled="
+                        scope.row.excelId == -1 || scope.row.excelId == null
+                      "
+                      @click="
+                        rightClick(
+                          scope.row.pkeyId,
+                          scope.row.excelId,
+                          scope.row.id,
+                          scope.row.initTableName,
+                          scope.row.initTableId
+                        )
+                      "
+                      >编辑元素
+                    </el-link>
+                 
+                    <el-link
+                      class="mg-l-10"
+                      type="primary"
+                      :disabled="
+                        scope.row.excelId == -1 || scope.row.excelId == null
+                      "
+                      @click="adjustExcel(scope.row.pkeyId, scope.row.excelId)"
+                      >调整表单
+                    </el-link>
+                    <el-link
+                      class="mg-l-10"
+                      type="primary"
+                      @click="handleEditFormula(scope.$index, scope.row)"
+                      >编辑元素公式
+                    </el-link>
+
+                    <el-link
+                      class="mg-l-10"
+                      type="danger"
+                      @click="handleDelete(scope.$index, scope.row)"
+                      >删除表单
+                    </el-link>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div class="mg-t-10 flex jc-sb">
+              <div></div>
+              <el-button size="medium" @click="showType = 1"
+                >返回WBS树
+              </el-button>
+            </div>
+          </div>
+        </basic-container>
+      </el-col>
+    </el-row>
+
+    <!-- 编辑元素表单信息 -->
+    <el-dialog
+      title="编辑元素表单信息"
+      :visible.sync="editElementFormTag"
+      width="60%"
+      :modal-append-to-body="false"
+    >
+      <div>
+        <el-table :data="formDatass" border style="width: 100%">
+          <el-table-column prop="tableName" label="表名">
+            <template slot-scope="scope">
+              <el-input
+                v-model="scope.row.tableName"
+                placeholder="请输入表名称"
+              ></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column prop="tableType" label="表类型">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.tableType" placeholder="请选择">
+                <el-option
+                  v-for="(item, key) in tableTypelist"
+                  :key="key"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                >
+                </el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column prop="tableOwner" label="所属方">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.tableOwner" placeholder="请选择">
+                <el-option
+                  v-for="(item, key) in ownerTypeList"
+                  :key="key"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                >
+                </el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column prop="fillRate" label="填报率">
+            <template slot-scope="scope">
+              <el-input
+                v-model="scope.row.fillRate"
+                placeholder="请输入填报率"
+              ></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column prop="nodeType" label="节点类型" v-if="wbsType == 5">
+            <template slot-scope="scope">
+              <el-select v-model="scope.row.nodeType" placeholder="请选择" >
+                <el-option
+                  v-for="item in nodeTypelist"
+                  :key="item.id"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                ></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="editElementFormTag = false">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="editeditElementFormMF()"
+          :loading="editeditElementFormMFLoading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 调整表单模板 -->
+    <div v-if="excelHtml" class="excelHtml">
+      <dynamicExcel
+        @remove="removeExcel"
+        v-if="excelHtml"
+        :pkeyId="GLExcelFrom.id"
+        :excelId="GLExcelFrom.excelId"
+      />
+    </div>
+
+
+    <el-dialog
+      title="调整排序"
+      :visible.sync="sortTag"
+      width="50%"
+      append-to-body
+    >
+      <ManualSorting v-if="sortTag2" @bianhua="bianhua()" :sort="sort" />
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="(sortTag = false), (sortTag2 = false)"
+          >取 消</el-button
+        >
+        <el-button type="primary" @click="editSort()" v-loading="sureSortload"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 元素表排序 -->
+    <el-dialog
+      title="调整排序"
+      :visible.sync="excelSortTag"
+      width="50%"
+      append-to-body
+    >
+      <ManualSorting
+        v-if="excelSortTag2"
+        @bianhua="bianhua2()"
+        :sort="tableSortList"
+      />
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="excelSortTag = false">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="editPrivateSort()"
+          v-loading="surePrivateSortload"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 关联清表 -->
+    <el-dialog
+      title="关联清表"
+      class="excelBox"
+      :visible.sync="GLExcel"
+      width="500px"
+      modal-append-to-body
+      append-to-body
+      @close="GLExcelMD"
+    >
+      <div>
+        <el-select
+          style="width: 400px"
+          v-model="GLExcelFrom.name"
+          placeholder="请选择"
+          @change="changetherr()"
+        >
+          <el-option
+            v-for="(item, key) in GLExcelData"
+            :key="key"
+            :label="item.name"
+            :value="item.id"
+          >
+          </el-option>
+        </el-select>
+        <el-scrollbar style="margin-top: 20px; height: 50vh">
+          <el-input
+            style="width: 400px"
+            v-model.trim="GLExcelFrom.search"
+            placeholder="请输入需要选择的内容"
+          ></el-input>
+          <el-tree
+            :filter-node-method="filterNode222"
+            ref="tree"
+            class="filter-tree"
+            style="margin-top: 10px"
+            :props="GLExcelProps"
+            :data="exceldata"
+            node-key="id"
+            accordion
+            show-checkbox
+            @check="checkchange"
+            v-loading="GLExcelLoading"
+          >
+          </el-tree>
+        </el-scrollbar>
+      </div>
+      <span
+        slot="footer"
+        class="dialog-footer"
+        style="display: flex; justify-content: center; align-items: center"
+      >
+        <el-button @click="GLExcelMD()">取 消</el-button>
+        <el-button
+          style="margin-left: 30px"
+          type="primary"
+          v-throttle="2000"
+          @click="saveLinkTab()"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 节点详情 -->
+    <el-dialog
+      :title="dialogTitle"
+      :visible.sync="dialogVisible"
+      width="50%"
+      append-to-body
+      :close-on-click-modal="false"
+      @closed="saveNodeLoading = false"
+    >
+      <el-form
+        ref="nodeDetail"
+        :model="nodeDetail"
+        :rules="rules"
+        label-width="140px"
+      >
+        <el-form-item label="节点名称" prop="nodeName">
+          <div class="flex">
+            <el-input v-model="nodeDetail.nodeName"></el-input>
+            <el-button class="mg-l-10" type="primary" @click="aliasShow"
+              >添加别名
+            </el-button>
+          </div>
+        </el-form-item>
+        <el-form-item label="上级节点">
+          <el-input v-model="nodeDetail.parentName" disabled></el-input>
+        </el-form-item>
+        <el-form-item label="节点类型" prop="nodeType">
+          <el-select
+            v-model="nodeDetail.nodeType"
+            placeholder="请选择"
+            class="w-100p"
+            @change="nodeTypeChange"
+            clearable
+          >
+            <el-option
+              v-for="item in nodeTypelist"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictKey"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="划分编号" v-if="wbsType !== 2 && wbsType !== 5">
+          <el-input v-model="nodeDetail.partitionCode"></el-input>
+        </el-form-item>
+        <!-- <el-form-item label="唯一编码" v-if="wbsType !== 5">
+          <el-input v-model="nodeDetail.uniqueCode"></el-input>
+        </el-form-item> -->
+        <el-form-item label="参数掩码" v-if="wbsType !== 5">
+          <el-input v-model="nodeDetail.uniqueCode" placeholder="可填写分部评定权值/试验编号配置"></el-input>
+        </el-form-item>
+          <el-form-item label="含附件类型" >
+            <el-select
+                v-model="nodeDetail.tableFileType"
+                placeholder="请选择"
+                class="w-100p"
+                clearable
+                multiple 
+              >
+                <el-option
+                  v-for="item in tableFileTypeList"
+                  :key="item.id"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                ></el-option>
+              </el-select>
+        </el-form-item> 
+        <template v-if="nodeDetail.nodeType == 6">
+          <el-form-item label="是否有混凝土">
+            <el-radio-group v-model="nodeDetail.isConcrete" size="small">
+              <el-radio :label="0" border>无</el-radio>
+              <el-radio :label="1" border>有</el-radio>
+            </el-radio-group>
+          </el-form-item>
+          <el-form-item label="是否试验节点">
+            <el-radio-group v-model="nodeDetail.isExpernode" size="small">
+              <el-radio :label="0" border>否</el-radio>
+              <el-radio :label="1" border>是</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </template>
+        <el-form-item
+          label="内业资料类型"
+          prop="majorDataType"
+          v-if="wbsType !== 2 && wbsType !== 5"
+        >
+          <el-select
+            v-model="nodeDetail.majorDataType"
+            placeholder="请选择"
+            class="w-100p"
+            clearable
+          >
+            <el-option
+              v-for="item in majorDataTypeList"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictKey"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="标准分类">
+          <el-select
+            v-model="nodeDetail.className"
+            placeholder="请选择"
+            class="w-100p"
+            @change="changeStandType"
+            clearable
+          >
+            <el-option
+              v-for="item in standardTypeOptions"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictKey"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="单元名称">
+          <el-select
+            v-model="nodeDetail.unitName"
+            placeholder="请选择"
+            class="w-100p"
+            clearable
+          >
+            <el-option
+              v-for="item in unitOptions"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictKey"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="是否新增中隐藏"
+          prop="isAddConceal"
+          v-if="wbsType !== 2 && wbsType !== 5"
+        >
+          <el-radio-group v-model="nodeDetail.isAddConceal" size="small">
+            <el-radio :label="1" border>是</el-radio>
+            <el-radio :label="0" border>否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item
+          label="勾选相关联试验"
+          prop="mixRatioTestIds"
+          v-if="wbsType === 2 && nodeDetail.nodeType === 53"
+        >
+          <div
+            style="position: relative; height: 300px; border: 1px solid #dddfe6"
+          >
+            <el-scrollbar class="h-100p">
+              <div v-loading="testTreeLoad">
+                <el-tree
+                  class="filter-tree"
+                  :data="testTreeData"
+                  :props="defaultProps"
+                  :expand-on-click-node="false"
+                  highlight-current
+                  node-key="id"
+                  ref="treeall"
+                  show-checkbox
+                  :default-checked-keys="mixRatioTestIds"
+                  @check="TestTreeCheckChange"
+                />
+              </div>
+            </el-scrollbar>
+          </div>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="saveNode" :loading="saveNodeLoading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 创建新的元素表 -->
+    <el-dialog
+      title="创建新的元素表"
+      :visible.sync="eleVisible"
+      width="80%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <el-form
+        ref="eleDialog"
+        :model="eleForm"
+        :rules="eleRules"
+        label-width="110px"
+      >
+        <el-form-item label="表名" prop="nodeName">
+          <el-input v-model="eleForm.nodeName"></el-input>
+        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="表类型" prop="tableType">
+              <el-select
+                v-model="eleForm.tableType"
+                placeholder="请选择"
+                class="w-100p"
+              >
+                <el-option
+                  v-for="item in tableTypelist"
+                  :key="item.id"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="所属方" prop="tableOwner">
+              <el-select
+                v-model="eleForm.tableOwner"
+                placeholder="请选择"
+                class="w-100p"
+              >
+                <el-option
+                  v-for="item in ownerTypeList"
+                  :key="item.id"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div class="flex jc-sb">
+        <div></div>
+        <div>
+          <el-link type="primary" @click="importVisible = true"
+            >快捷导入
+          </el-link>
+          <el-link type="primary" class="mg-l-20" @click="downloadTmp"
+            >下载导入模版
+          </el-link>
+        </div>
+      </div>
+      <div class="border-grey">
+        <p class="font-c-warning">编辑元素信息(请谨慎操作)</p>
+        <el-table
+          :data="eleForm.elementList"
+          border
+          style="width: 100%"
+          height="400px"
+        >
+          <el-table-column
+            align="center"
+            type="index"
+            width="50"
+          ></el-table-column>
+          <el-table-column align="center" prop="eName" label="字段名称">
+            <template slot-scope="scope">
+              <el-input
+                v-model="scope.row.eName"
+                size="small"
+                placeholder="请输入内容"
+              ></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="eType"
+            label="数据类型"
+            width="120"
+          >
+            <template slot-scope="scope">
+              <el-select
+                v-model="scope.row.eType"
+                size="small"
+                placeholder="请选择"
+              >
+                <el-option
+                  v-for="item in dataTypeList"
+                  :key="item.id"
+                  :label="item.dictValue"
+                  :value="item.dictKey"
+                ></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="eLength"
+            label="长度"
+            width="120"
+          >
+            <template slot-scope="scope">
+              <el-input
+                v-model="scope.row.eLength"
+                size="small"
+                placeholder="请输入内容"
+                :disabled="scope.row.eType == 4"
+              ></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="eAllowDeviation"
+            label="允许偏差值"
+          >
+            <template slot-scope="scope">
+              <div class="flex">
+                <el-select
+                  v-model="scope.row.allow"
+                  size="small"
+                  placeholder="请选择"
+                  style="width: 120px"
+                >
+                  <el-option :key="1" label="≥" value="≥"></el-option>
+                  <el-option :key="2" label="≤" value="≤"></el-option>
+                  <el-option :key="3" label="±" value="±"></el-option>
+                  <el-option :key="4" label="【】" value="【】"></el-option>
+                </el-select>
+                <el-input
+                  v-model="scope.row.deviation"
+                  size="small"
+                  placeholder="请输入内容"
+                ></el-input>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="eInspectionMethod"
+            label="检查方法和频率"
+          >
+            <template slot-scope="scope">
+              <el-input
+                v-model="scope.row.eInspectionMethod"
+                size="small"
+                placeholder="请输入内容"
+              ></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="操作" width="80">
+            <template slot="header">
+              <el-button
+                @click="addEleRow(eleForm.elementList)"
+                type="text"
+                icon="el-icon-circle-plus-outline"
+                class="text-icon"
+              ></el-button>
+            </template>
+            <template slot-scope="scope">
+              <el-button
+                icon="el-icon-remove-outline"
+                type="text"
+                @click="delEleRow(scope.$index, eleForm.elementList)"
+                class="text-icon text-icon-danger"
+              ></el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="eleVisible = false">取 消</el-button>
+        <el-button type="primary" @click="saveFormAndElementHandle"
+          >保 存</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 模板导入 -->
+    <el-dialog
+      title="模版导入"
+      :visible.sync="importVisible"
+      width="50%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <p>
+        提示:必须按照系统要求的模版格式上传,否则系统识别无效
+        <el-link type="primary" @click="downloadTmp">下载导入模版</el-link>
+      </p>
+      <div>
+        <el-button size="small" type="primary" @click="fileClick2"
+          >本地上传
+        </el-button>
+        <input
+          @change="tmpImport"
+          type="file"
+          hidden
+          ref="file2"
+          accept=".xls, .xlsx"
+        />
+      </div>
+      <el-table :data="tempList" border style="width: 100%">
+        <el-table-column align="center" prop="eName" label="字段信息">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="eType"
+          label="数据类型"
+          width="120"
+        >
+        </el-table-column>
+        <el-table-column align="center" prop="eLength" label="长度" width="120">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="eAllowDeviation"
+          label="允许偏差值"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="eInspectionMethod"
+          label="检查方法和频率"
+        >
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="importVisible = false">取 消</el-button>
+        <el-button type="primary" @click="importHandle">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 预览元素 -->
+    <el-dialog
+      :title="(curEleTable.tableName ? curEleTable.tableName : '') + ''"
+      :visible.sync="editEleVisible"
+      width="80%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <!-- <p class="font-c-warning">编辑元素信息(请谨慎操作)</p> -->
+      <el-table :data="editEleList" border style="width: 100%" height="400px">
+        <el-table-column
+          align="center"
+          type="index"
+          width="50"
+        ></el-table-column>
+        <el-table-column align="center" prop="eName" label="字段信息">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="eType"
+          label="数据类型"
+          width="120"
+          :formatter="eTypeFormatter"
+        >
+        </el-table-column>
+        <el-table-column align="center" prop="eLength" label="长度" width="120">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="eAllowDeviation"
+          label="允许偏差值"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="eInspectionMethod"
+          label="检查方法和频率"
+        >
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="editEleVisible = false">取 消</el-button>
+        <!-- <el-button
+          type="primary"
+          @click="saveEles"
+        >确 定</el-button> -->
+      </span>
+    </el-dialog>
+    <!-- 元素公式 -->
+    <el-dialog
+      :title="
+        (curEleTable.tableName ? curEleTable.tableName : '') + '  元素公式'
+      "
+      :visible.sync="editEleFormulaVisible"
+      width="800px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <div class="flex mg-b-10">
+        <el-input
+          v-model="formulaInput"
+          placeholder="请输入名称"
+          size="samll"
+          clearable
+          @clear="searchFormulaName"
+        ></el-input>
+        <el-button type="info" class="mg-l-10" @click="searchFormulaName"
+          >搜索
+        </el-button>
+      </div>
+      <el-table
+        :data="editEleListFilter"
+        border
+        style="width: 100%"
+        height="400px"
+      >
+        <el-table-column align="center" prop="eName" label="字段信息">
+        </el-table-column>
+        <el-table-column align="center" label="操作" width="200">
+          <template slot-scope="scope">
+            <el-link
+              :type="scope.row.globalFormula == 1 ? 'warning' : 'primary'"
+              @click="toFormulaEdit(scope.row, 10)"
+              >全局公式
+            </el-link>
+            <el-link
+              v-show="scope.row.hasPartFormula"
+              class="mg-l-10"
+              :type="scope.row.isSaveFormula == 1 ? 'warning' : 'primary'"
+              @click="toFormulaEdit(scope.row, 20)"
+              >节点公式
+            </el-link>
+            <!-- <el-link
+              class="mg-l-10"
+              type="danger"
+              @click="delEleRowHandle(scope.$index,editEleListFilter)"
+            >删除</el-link> -->
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+    <!-- 导入划分 -->
+    <el-dialog
+      title="导入划分"
+      :visible.sync="importTemplateVisible"
+      width="800px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <div v-loading="importLoading">
+        <div>
+          <el-link type="primary" @click="handleDownload">下载导入模版</el-link>
+        </div>
+        <div class="mg-t-20">
+          <el-button type="primary" @click="fileClick">选择文件</el-button>
+          <span v-if="upFile" class="mg-l-20">{{ upFile.name }}</span>
+          <input
+            @change="fileChange"
+            type="file"
+            hidden
+            ref="file"
+            accept=".xls, .xlsx"
+          />
+        </div>
+        <div v-if="!upFile">当前还未选择文件,请选择需要导入的文件</div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="importTemplateVisible = false">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="importTemplateHandle"
+          :loading="importLoading"
+          >导 入</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 节点参数 -->
+    <el-dialog
+      title="节点参数"
+      :visible.sync="nodeInfoVisible"
+      width="800px"
+      append-to-body
+      class="jiedian"
+      :close-on-click-modal="false"
+      :show-close="false"
+      @close="closenodeInfoVisible"
+    >
+      <div>
+        <el-button
+          type="text"
+          icon="el-icon-s-operation"
+          class="right-btn"
+          @click="setNodeParameters()"
+        ></el-button>
+        <div class="flexEnd">
+          <i
+            class="el-icon-circle-plus marbottom10"
+            @click="addNodeInfoTable()"
+            style="font-size: 24px; color: rgb(37, 193, 99); cursor: pointer"
+          ></i>
+          <i
+            class="el-icon-refresh-right marbottom10"
+            @click="refreshnfoTable()"
+            style="font-size: 24px; color: rgb(37, 193, 99); cursor: pointer"
+          ></i>
+        </div>
+        <el-table
+          :data="nodeInfoTable"
+          border
+          style="width: 100%"
+          height="400"
+          v-loading="nodeInfoTableLoad"
+        >
+          <el-table-column align="center" prop="name" label="参数名称">
+            <template slot-scope="scope">
+              <el-select
+                v-model="scope.row.k"
+                placeholder="请选择"
+                class="w-100p"
+              >
+                <el-option
+                  v-for="item in namelist"
+                  :key="item.k"
+                  :label="item.name"
+                  :value="item.k"
+                ></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="value" label="参数值设置">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.v"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="describe" label="描述">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.remark"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="120" align="center">
+            <template slot-scope="scope">
+              <el-button
+                type="text"
+                size="small"
+                class="text-icon-primary"
+                @click="linkEle(scope.row)"
+                >关联元素
+              </el-button>
+              <el-button
+                type="text"
+                size="small"
+                class="text-icon-danger"
+                @click="delNodeInfoss(scope.$index, scope.row)"
+                >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="nodeInfoVisible = false">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="nodeInfoSave()"
+          :loading="nodeInfoSaveload"
+          >保 存</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 设置参数名称 -->
+    <el-dialog
+      title="设置参数名称"
+      :visible.sync="infoNameVisible"
+      width="800px"
+      append-to-body
+      class="jiedian"
+      :close-on-click-modal="false"
+    >
+      <div>
+        <div class="flexEnd">
+          <i
+            class="el-icon-circle-plus marbottom10"
+            @click="setParameterName()"
+            style="font-size: 24px; color: rgb(37, 193, 99); cursor: pointer"
+          ></i>
+        </div>
+        <el-table :data="namelists" border style="width: 100%" height="400">
+          <el-table-column align="center" prop="name" label="参数名称">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.name"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="key" label="参数值KEY">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.k"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="describe" label="描述">
+            <template slot-scope="scope">
+              <el-input v-model="scope.row.remark"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="120" align="center">
+            <template slot-scope="scope">
+              <el-button
+                type="text"
+                size="small"
+                class="text-icon-danger"
+                @click="delNodeInfo(scope.$index, scope.row)"
+                >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addParameterName()">保 存</el-button>
+        <el-button @click="closeParameter()">关 闭</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      title="别名"
+      :visible.sync="aliasVisible"
+      width="600px"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <div>
+        <div class="flex">
+          <el-input
+            v-model="aliasInput"
+            placeholder="请输入节点别名"
+          ></el-input>
+          <el-button class="mg-l-20" type="primary" @click="addAlias"
+            >添加
+          </el-button>
+        </div>
+        <div class="flex" style="flex-wrap: wrap">
+          <div class="mg-t-10" v-for="(tag, index) in aliasArr" :key="index">
+            <el-tag closable @close="delAlias(index)">
+              {{ tag }}
+            </el-tag>
+            <span v-if="index != aliasArr.length - 1">、</span>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="aliasVisible = false">取 消</el-button>
+        <el-button type="primary" @click="saveAliasHandle">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 节点公式 -->
+    <el-dialog
+      :title="
+        (curEleTable.tableName ? curEleTable.tableName : '') +
+        '  元素公式(元素库)'
+      "
+      :visible.sync="formulaCompVisible"
+      fullscreen
+      append-to-body
+      class="full-dialog"
+      @close="closeformulaComp"
+    >
+      <FormulaEdit
+        :istableType="!isNodeType"
+        :fromcurNode="curTreeData"
+        :projectid="projectid"
+        :wbsid="id"
+        :nodeid="curTreeData.id"
+        :eleid="formulaCurRow.id"
+        :globaltype="formulaCurRow.globaltype"
+        :iswbstype="0"
+        @hideDialog="formulaCompVisible = false"
+        v-if="formulaCompVisible"
+      ></FormulaEdit>
+    </el-dialog>
+    <!-- 全局公式 -->
+    <el-dialog
+      title=""
+      :visible.sync="formulaCompVisible1"
+      fullscreen
+      append-to-body
+      class="full-dialog"
+      @close="closeformulaComp1"
+    >
+      <FormulaEditone
+        :wbsid="id"
+        :nodeid="curTreeData.id"
+        :eleid="formulaCurRow.id"
+        :elementType="formulaCurRow.elementType"
+        :projectid="projectid"
+        :tableType="istableType"
+        :globaltype="formulaCurRow.globaltype"
+        @hideDialog="formulaCompVisible1 = false"
+        :fromcurNode="curEleTable"
+        :iswbstype="0"
+        v-if="formulaCompVisible1"
+      >
+      </FormulaEditone>
+    </el-dialog>
+
+    <!-- 编辑元素 -->
+    <el-dialog
+      title=" "
+      :visible.sync="editElementVisible"
+      fullscreen
+      append-to-body
+      class="full-dialog"
+    >
+      <EditElement
+        :editElementQuery="curTreeData"
+        :pkeyId="editElementQuery.pkeyId"
+        :excelId="editElementQuery.excelId"
+        :id="editElementQuery.id"
+        :initTableName="editElementQuery.initTableName"
+        :pid="editElementQuery.pid"
+        :wbsid="editElementQuery.wbsid"
+        :initTableId="editElementQuery.initTableId"
+        :nodeid="editElementQuery.nodeid"
+        @hideDialog="hideEditElementVisible"
+        @adjustExcel="adjustExcel"
+        v-if="editElementVisible"
+      ></EditElement>
+    </el-dialog>
+
+    <el-dialog
+      title="节点参数设置-关联元素"
+      :visible.sync="linkEleVisible"
+      width="800px"
+      append-to-body
+      class="jiedian"
+      :close-on-click-modal="false"
+    >
+      <div>
+        <el-table
+          :data="linkEleTableList"
+          border
+          style="width: 100%"
+          height="400"
+        >
+          <el-table-column align="center" prop="tableName" label="元素表名">
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="elementName"
+            label="关联元素字段"
+          >
+          </el-table-column>
+          <el-table-column label="操作" width="160" align="center">
+            <template slot-scope="scope">
+              <el-button
+                v-if="!scope.row.mappingId"
+                type="text"
+                size="small"
+                class="text-icon-primary"
+                @click="tolinkEle(scope.row)"
+                >选择元素
+              </el-button>
+              <el-button
+                v-if="!!scope.row.mappingId"
+                type="text"
+                size="small"
+                class="text-icon-danger"
+                @click="delLink(scope.row)"
+                >删除关联
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <!-- <el-button @click="saveLinks">保 存</el-button> -->
+        <el-button @click="linkEleVisible = false">关 闭</el-button>
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      title="选择关联元素"
+      :visible.sync="linkCheckVisible"
+      width="600px"
+      append-to-body
+      class="jiedian"
+      :close-on-click-modal="false"
+    >
+      <div>
+        <div class="flex mg-b-20">
+          <el-input
+            v-model="linkEleKey"
+            placeholder="请输入元素关键字搜索"
+          ></el-input>
+          <el-link class="mg-l-20" :underline="false">
+            <i
+              class="el-icon-search"
+              style="font-size: 20px"
+              @click="searchEle"
+            ></i>
+          </el-link>
+        </div>
+        <el-table :data="linkEleList" border style="width: 100%" height="400">
+          <el-table-column align="center" prop="eName" label="元素名">
+          </el-table-column>
+
+          <el-table-column label="操作" width="55">
+            <template slot-scope="scope">
+              <el-checkbox
+                v-model="scope.row.checked"
+                @change="(value) => linkEleCheck(value, scope.$index)"
+              ></el-checkbox>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="saveLinkEle">保 存</el-button>
+        <el-button @click="linkCheckVisible = false">关 闭</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 关联节点 -->
+    <el-dialog
+      title="关联节点"
+      :visible="isLinkNodes"
+      append-to-body
+      center
+      destroy-on-close
+      custom-class="hc-link-nodes-dialog"
+      @close="linkNodesClose"
+    >
+      <el-tree
+        ref="tree2"
+        class="hc-link-nodes-tree"
+        lazy
+        :load="loadNode"
+        :props="defaultProps"
+        show-checkbox
+        check-strictly
+        :default-checked-keys="checkedLinkNodesKeys"
+        highlight-current
+        node-key="primaryKeyId"
+      />
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="linkNodesClose">取 消</el-button>
+        <el-button
+          type="primary"
+          @click="linkNodesSave"
+          v-loading="linkNodesLoad"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 编辑 -->
+    <el-dialog
+      :title="(curEleTable.tableName ? curEleTable.tableName : '') + ''"
+      :visible.sync="editDialogShow"
+      width="80%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+      <p class="font-c-warning">编辑元素信息(请谨慎操作)</p>
+      <div style="display: flex; margin-bottom: 10px">
+        <el-input
+          placeholder="请输入你想编辑的元素名称"
+          v-model="searchinput"
+          :size="size"
+          clearable
+          @clear="clearsearchinput"
+        >
+        </el-input>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="small"
+          @click="searchinputChange"
+          >搜索</el-button
+        >
+      </div>
+      <el-table
+        :data="editTable"
+        border
+        style="width: 100%"
+        height="400px"
+        v-loading="editEleTableloading"
+      >
+        <el-table-column
+          align="center"
+          type="index"
+          width="50"
+        ></el-table-column>
+        <el-table-column align="center" prop="eName" label="元素名称">
+          <template slot="header">
+            <i class="required"></i>
+            <span>元素名称</span>
+          </template>
+          <template slot-scope="scope">
+            <el-input
+              v-model="scope.row.eName"
+              size="small"
+              placeholder="请输入内容"
+            ></el-input>
+          </template>
+        </el-table-column>
+
+        <el-table-column align="center" prop="dynamicDict" label="动态字典">
+          <template slot="header">
+            <span>动态字典</span>
+          </template>
+          <template slot-scope="scope">
+            <el-select
+              v-model="scope.row.dynamicDict"
+              filterable
+              size="small"
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in dynamicDictList"
+                :key="item.id"
+                :label="item.dictValue"
+                :value="item.dictKey"
+              ></el-option>
+            </el-select>
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="editDialogShow = false">取 消</el-button>
+        <el-button type="primary" @click="saveEles" :loading="saveLoading"
+          >确 定</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <!-- 文件题名全局配置 -->
+    <el-dialog
+      title="文件题名全局配置"
+      :visible.sync="fileTitleVisible"
+      width="60%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+ 
+        <div class="flexEnd">
+          <i
+            class="el-icon-circle-plus "
+            style="font-size: 24px; color: rgb(37, 193, 99); cursor: pointer"
+            @click="addRow"
+          ></i>
+          <i
+            class="el-icon-refresh "
+            style="font-size: 24px; color: rgb(37, 193, 99); cursor: pointer"
+            @click="refreshRow"
+          ></i>
+        </div>
+     
+    <el-table
+    :data="fileTableData"
+    style="width: 100%;height: 500px;"
+    align="center"
+    v-loading="fileTableLoading"
+    >
+ 
+    <el-table-column
+      label="文件题名规则"
+      prop="roleNameVal">
+      <template #default="scope">
+        <el-select
+        :id="selectDiv"
+            v-if="scope.row.isEdit"
+            v-model="scope.row.ruleName"
+            multiple
+            placeholder="请选择"
+            style="width: 240px"
+            @change="changeRoleName($event,scope.row,scope.index)"
+          >
+          <el-option
+              v-for="item in nodeTypelist1"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictKey"
+            ></el-option>
+          </el-select>
+       <span v-else>
+        <el-tag  v-for="(item,index) in scope.row.roleNameVal" style="margin-right: 2px;" :key="index">{{ item }}</el-tag>
+      </span>
+      </template>
+
+
+    </el-table-column>
+    <el-table-column
+      label="文件题名范围"
+      prop="ruleSizeVal"
+     
+      >
+      <template #default="scope">
+        <div  v-if="isShowSize">
+          <span v-if="scope.row.type===1" :class="{'orange': scope.row.isEdit}"  @click="chooseFile(scope.$index, scope.row)">所有节点</span>
+          <div v-else>
+            <el-link type="warning" @click="chooseFile(scope.$index, scope.row)"  v-if="!scope.row.ruleSizeVal">选择题名范围</el-link>
+            <span v-else  @click="chooseFile(scope.$index, scope.row)" :class="{'orange': scope.row.isEdit}">{{ scope.row.ruleSizeVal }}</span>
+          </div>
+        </div>
+      </template>
+    </el-table-column>
+    <el-table-column
+      label="操作"
+      width="150px"
+>
+      
+      <template slot-scope="scope">
+        <el-link
+        v-if="!scope.row.isEdit"
+        type="primary"
+        class="mg-r-10"
+        @click="editRow(scope.$index, scope.row)">编辑</el-link>
+        <el-link
+        v-else
+        type="primary"
+        class="mg-r-10"
+        @click="saveRow(scope.$index, scope.row)">保存</el-link>
+        <el-link
+         @click="delRow(scope.$index, scope.row)"
+          type="danger"
+        >删除</el-link>
+      </template>
+    </el-table-column>
+  </el-table>
+
+  <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="fileTitleVisible=false">取消</el-button>
+        <el-button type="primary" @click="batchsaveFileSize" :loading="saveFileLoading">
+          保存
+        </el-button>
+      </div>
+    </template>
+    </el-dialog>
+    <!-- 选择题名范围i -->
+    <el-dialog
+    :visible.sync="chooseFileVisible"
+    title="选择题名范围"
+    width="500"
+    align-center
+    append-to-body
+  >  
+  <el-form label-position="left" label-width="80px" :model="fileTitleModel"  :rules="fileTitleRules" ref="fileTitleRef">
+     
+      <el-form-item label="题名范围" prop="type">
+        <el-radio v-model="fileTitleModel.type" :label="1" @input="changeRadio">所有节点</el-radio><br/>
+        <el-radio v-model="fileTitleModel.type" :label="2"  @input="changeRadio">部分节点</el-radio>  
+        <div v-if="fileTitleModel.type==2" class="warning-text">请选择节点</div>
+
+          <el-scrollbar class="h-100p" style="height: 400px;" v-if="fileTitleModel.type==2" v-loading="fileTreeLoading">
+                <el-tree
+                        :data="fileTreeData"
+                        :props="filedefaultProps"
+                        :expand-on-click-node="false"
+                        highlight-current
+                        node-key="id"
+                        show-checkbox
+                        @check="checkFileSize"
+                        :default-checked-keys="deCheckTreeKeys"
+                        
+
+                      >
+                      </el-tree>
+        </el-scrollbar>
+      </el-form-item>
+   
+    </el-form>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="chooseFileVisible=false">取消</el-button>
+        <el-button type="primary" @click="saveFileSize">
+          保存
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+
+  <!-- 项目数据同步 -->
+ 
+    <el-dialog
+     
+      :visible.sync="proSyncTag"
+      width="80%"
+      append-to-body
+      @close=closeProSyncTag
+    >
+      <span slot="title" class="dialog-title">
+       <div class="dialog-title-text">项目数据同步</div>
+        <span class="dialog-title-tip">重新同步项目下所有配置,不保留独有配置,慎重同步!!!</span>
+      </span>
+      <div class="sync-container">
+        <el-card class="box-card-1" :style="{ width: isShowLeft ? '40%' : '0%' }">
+          <el-scrollbar style="height: 100%;">
+                <div v-loading="treeLoad">
+                  <el-tree
+             
+                    class="filter-tree"
+                    lazy
+                    :load="loadNode"
+                    show-checkbox
+                    :props="defaultProps"
+                    :expand-on-click-node="false"
+                    highlight-current
+                    node-key="primaryKeyId"
+                   @check="handleCheckChange"
+                   @check-change="handleCheckChange1"
+                   ref="syncProTree"
+                  >
+                  </el-tree>
+                 
+                </div>
+              </el-scrollbar>
+        </el-card>
+        <el-card class="box-card-2">
+            <el-form ref="syncForm" :model="syncForm"  label-position="top">
+                <el-form-item label="同步范围" v-if="!isShowTable">
+                      <el-radio-group v-model="syncForm.range">
+                        <el-radio
+                          v-for="item in rangeOptions"
+                          :key="item.id"
+                          :label="item.dictKey"
+                        >{{  item.dictValue}}</el-radio>
+                      </el-radio-group>
+                </el-form-item>
+                  <el-form-item label="同步类型" prop="type">
+                    <el-checkbox :indeterminate="isIndeterminate" v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>
+                        <div style="margin: 15px 0;"></div>
+                        <el-checkbox-group v-model="syncForm.type" @change="handleCheckedTypeChange">
+                          <el-checkbox v-for="item in typeOptions" :label="item.dictKey" :key="item.id">{{ item.dictValue}}</el-checkbox>
+                        </el-checkbox-group>
+                  </el-form-item>
+                  <!-- <el-form-item label="选择同步范围(节点状态)" prop="contractRange" v-if="syncForm.range==='2'">
+                    <el-checkbox-group v-model="syncForm.contractRange">
+                      <el-checkbox label="全选" name="1"></el-checkbox>
+                      <el-checkbox v-for="(item,index) in checkIdList"  :label="item.dictKey" :key="item.id">{{ item.dictValue}}</el-checkbox>
+                    
+                    </el-checkbox-group>
+                  </el-form-item> -->
+                  <el-form-item label="选择同步范围(节点状态)" prop="contractRange"  v-if="syncForm.range==='2'">
+                    <el-checkbox :indeterminate="isIndeterminate1" v-model="checkAll1" @change="handleCheckAllChange1">全选</el-checkbox>
+                        <div style="margin: 15px 0;"></div>
+                        <el-checkbox-group v-model="syncForm.contractRange" @change="handleCheckedTypeChange1">
+                          <el-checkbox v-for="item in checkIdList" :label="item.dictKey" :key="item.id">{{ item.dictValue}}</el-checkbox>
+                        </el-checkbox-group>
+                  </el-form-item>
+                  <el-form-item label="选择同步源" prop="templateId" v-else>
+                    <el-select v-model="syncForm.templateId" placeholder="请选择同步源" style="width: 100%;" size="small" @change="changeTemplateId">
+                      <el-option
+                        v-for="item in templateIdList"
+                        :key="item.id"
+                        :label="item.name"
+                        :value="item.id">
+                      </el-option>
+                    </el-select>
+                </el-form-item>
+                
+            </el-form>
+            <div class="table-box" v-if="isShowTable">
+              <h4 style="margin-left: 4px;">表单预览</h4>
+              <el-table
+              
+              size="small"
+              ref="proTable"
+                  :data="preTableData"
+                  stripe
+                  style="width: 100%"
+                  max-height="300"
+                  @selection-change="handleSelectionChange"
+                  >
+                  <el-table-column
+                    type="selection"
+                    width="55">
+                  </el-table-column>
+                  <el-table-column
+                    prop="tableName"
+                    label="表单名称"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                   prop="tableType"
+                  :formatter="formatTableType"
+                    label="表单类型"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                      prop="tableOwner"
+                     :formatter="formatOwner"
+                    label="所属方">
+                  </el-table-column>
+                </el-table>
+            </div>
+        </el-card>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeProSyncTag">取 消</el-button>
+        <el-button type="primary" @click="saveProTag" :loading="saveProTagLoading">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 同步队列 -->
+    <el-dialog
+      title="同步队列"
+      :visible.sync="syncListDialog"
+      width="30%"
+      append-to-body
+      :close-on-click-modal="false"
+      @close="closeSyncListTag"
+    >
+    <div class="content-box" v-loading="refreshLoading||refreshLoading1">
+      <el-image
+      style="width: 100px; height: 100px"
+     :src="require('@/assets/loader.svg')"
+      fit="contain"></el-image>
+      <div class="mt-14">同步中</div>
+      <div  class="mt-14">
+        同步数量{{ syncListData.nodeNum }} 剩余数量{{ syncListData.nodeNumEnd }}
+      </div>
+     <div  class="mt-14">
+      <el-button type="primary" @click="syncListDialog=false">好的,我已知晓</el-button>
+      </div>
+      <div  class="mt-14">
+      <el-link type="primary" @click="refreshData" v-loading="refreshLoading" v-if="!isAdd">刷新数据</el-link>
+      <el-link type="primary" @click="refreshData1" v-loading="refreshLoading1" v-else>刷新数据</el-link>
+     </div>
+    </div>
+      
+   
+     
+    </el-dialog>
+     <!-- 同步表单其他配置 -->
+     <el-dialog
+      title="同步表单其他配置"
+      :visible.sync="syncTableDialog"
+      width="70%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+    <div class="sync-container">
+        <el-card class="box-card-1" :style="{ width: isShowLeft ? '40%' : '0%' }">
+          <el-scrollbar style="height: 100%;">
+                <div >
+                  <el-tree
+                    class="filter-tree"
+                    lazy
+                    :load="loadNode"
+                   @node-click="handleNodeClick"
+                    :default-expanded-keys="defaultExpandedKeys"
+                    :props="defaultProps"
+                    :expand-on-click-node="false"
+                    highlight-current
+                    node-key="primaryKeyId"
+                  >
+                  </el-tree>
+                 
+                </div>
+              </el-scrollbar>
+        </el-card>
+        <el-card class="box-card-2">
+         
+            <div class="table-box">
+              <h4 style="margin-left: 4px;">表单预览</h4>
+              <el-table
+              size="small"
+              ref="proTable1"
+                  :data="preTableData1"
+                  stripe
+                  style="width: 100%"
+                  max-height="300"
+                  @selection-change="handleSelectionChange1"
+                  
+                  >
+                  <el-table-column
+                    type="selection"
+                    width="55">
+                  </el-table-column>
+                  <el-table-column
+                    prop="tableName"
+                    label="表单名称"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                   prop="tableType"
+                  :formatter="formatTableType"
+                    label="表单类型"
+                    width="180">
+                  </el-table-column>
+                  <el-table-column
+                      prop="tableOwner"
+                     :formatter="formatOwner"
+                    label="所属方">
+                  </el-table-column>
+                </el-table>
+            </div>
+        </el-card>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="syncTableDialog = false">取 消</el-button>
+        <el-button type="primary" @click="saveTableSync" :loading="saveTableSyncLoad">确 定</el-button>
+      </span>
+    </el-dialog>
+    <!-- 编号设置弹窗 -->
+     <CodeSet ref="codeSetRef"  ></CodeSet>
+  </div>
+</template>
+
+<script>
+import ManualSorting from "@/components/WbsTree/ManualSorting";
+import dynamicExcel from "./treeTemplate/dynamicExcel.vue";
+import FormulaEdit from "@/views/formula/edit.vue";
+import FormulaEditone from "@/views/formula/edit1.vue";
+import EditElement from "@/views/manager/projectinfo/editElement/editElement.vue";
+import CodeSet from "./codeSet.vue";
+import {
+  saveFormAndElement,
+  selectFormElements,
+  importWbsTree,
+  findWbsTreePrivateSameLevel,
+  wbsTreePrivateSort,
+  parameters,
+  saveOrUpdateBatch,
+  keymap,
+  updateBatchNodeTableInfo2,
+  updateStatus,
+  getParamElements,
+  specifiedParamElements,
+  delParamElements,
+  selectPrivateFormElements,
+  syncCurrentFormInProject,
+  getQueryValueByType,
+  getQueryValueByNodeType,
+   getTreeByType,
+} from "@/api/manager/wbstree";
+import {
+  saveElement,
+  remove as removeElement,
+  updateBatchElements,
+  getTemplate,
+  importWbsElement,
+} from "@/api/manager/wbsformelement";
+import {
+ 
+  getLazytree,
+  getDetail,
+  update,
+  findNodeTableByCondition as selectByNodeTable,
+  removeTableByCondition as removeTableById,
+  removePrivateTreeNode,
+  wbsTreePrivateTableSort,
+  privateSubmitFullName,
+  syncNodeParam,
+  syncProjecteVisa,
+  syncNodeTable,
+  syncNodeinfo,
+  tabTypeLazyTree,
+  syncContractTabSort,
+  linkNodeTree,
+  getLinekNodeTreelist,getNameRule,getTitleRange,saveOrUpdateNameRule,deletedNameRule,delTabInfoAll
+} from "@/api/manager/wbsprivate";
+import { findProjectTree as getAlltree } from "@/api/manager/projectinfo";
+
+import { refrehPram } from "@/api/manager/wbstree";
+
+import { getList as getAttchFromOriginalName } from "@/api/resource/attach";
+import { getDictionary, getChildList } from "@/api/system/dict";
+import { mapGetters } from "vuex";
+import {
+  getList,
+  tabLazytreeAll,
+  saveLinkTab,
+  getExcelHtml,
+} from "@/api/exctab/excelmodel";
+import { getStore, setStore } from "@/util/store";
+
+import { getTempProject,addSync,getNodeStatus,getById } from "@/api/manager/ledger";
+import { selectByNodeTable   as findNodeTableByCondition1 } from "@/api/manager/wbstree";
+
+import { getDictionaryBiz } from "@/api/other";
+export default {
+
+  data() {
+    var checkMajorDataType = (rule, value, callback) => {
+      //console.log(this.nodeDetail.nodeType)
+      //console.log(this.nodeDetail.majorDataType)
+      if (this.nodeDetail.nodeType == 6) {
+        if (!this.nodeDetail.majorDataType) {
+          callback(new Error("工序节点必须选择内业资料类型"));
+        }
+      }
+
+      callback();
+    };
+
+    return {
+      isNodeType:true,
+      isRestoringSelection: false,
+
+      expandedKeysType: [],
+      defaultExpandedKeysType: [],
+      currentNodeKey: null, // 保存当前选中的节点key
+      fromcurNode: {},
+      formDatass: [],
+      editElementFormTag: false,
+      editeditElementFormMFLoading: false,
+      jiedianId: "",
+      //#region
+      sortTag: false,
+      sortTag2: false,
+      sureSortload: false,
+      surePrivateSortload: false,
+
+      sort: [],
+      //#endregion
+
+      //#region 关联清表
+      loading: false,
+      GLExcel: false,
+      GLExcelFrom: {
+        id: "",
+        name: "",
+        search: "", //搜素框舒服的值
+        ids: "",
+        excelId: "",
+        initTableName: "",
+        initTableId: "",
+      },
+      GLExcelData: [], //
+      GLExcelProps: {
+        label: "name",
+        children: "children",
+        disabled: "hasChildren",
+        isLeaf: function (data) {
+          let tag = false;
+          if (!data.hasChildren) {
+            tag = true;
+          }
+          if (data.isExistForm == 1) {
+            tag = true;
+          }
+          return tag;
+        },
+      },
+      exceldata: [], //清表模板
+      GLExcelLoading: false,
+      //#endregion
+
+      //#region 调整表单
+      adjustmentExcel: "",
+      excelHtml: false,
+      //#endregion
+
+      //#region
+      id: "",
+      projectid: "",
+      filterText: "",
+      filterText1: "",
+      isShowTree1:true,
+      treeData: [],
+      searchType: "1",
+      isSearch: false,
+      searchTreeData: [],
+      searchtreeLoad: false,
+
+      treeLoad: false,
+      isShowTree: true,
+      menuShow: false,
+      defaultProps: {
+        children: "children",
+        label: "title",
+        isLeaf: function (data) {
+          //console.log(data, !data.hasChildren, data.isExistForm);
+          let tag = false;
+          if (!data.hasChildren) {
+            tag = true;
+          }
+          /*if (data.isExistForm == 1) {
+                        tag = true;
+                    }*/
+          if (data.nodeType >= 6 && data.nodeType <= 13) {
+            tag = true;
+          }
+          //中间交工。开工报告、质量评定)
+          if (
+            data.majorDataType == 1 ||
+            data.majorDataType == 2 ||
+            data.majorDataType == 3
+          ) {
+            tag = true;
+          }
+          return tag;
+          // return !data.hasChildren || (data.isExistForm == 1);
+        },
+      },
+      defaultPropsByType:{
+        children: 'children',
+          label: 'title',
+           isLeaf:function (data) {
+             return !data.hasChildren
+           }
+      },
+      leftType: 5,
+      curTreeData: {},
+      curTreeNode: {},
+      tableData: [],
+      nodeDetail: {},
+      formData: [],
+      editType: 1,
+      dialogVisible: false,
+      saveNodeLoading: false,
+      nodeTypelist1: [],
+      majorDataTypeList: [],
+      rules: {
+        nodeName: [
+          { required: true, message: "请输入节点名称", trigger: "blur" },
+        ],
+        nodeType: [
+          { required: true, message: "请选择节点类型", trigger: "change" },
+        ],
+        majorDataType: [{ validator: checkMajorDataType, trigger: "change" }],
+        isAddConceal: [
+          {
+            required: true,
+            message: "请选择是否新增中隐藏",
+            trigger: "change",
+          },
+        ],
+      },
+      eleVisible: false,
+      tableTypelist: [],
+      dataTypeList: [],
+      ownerTypeList: [],
+      eleForm: {
+        elementList: [],
+      },
+      eleRules: {
+        nodeName: [
+          { required: true, message: "请输入表名称", trigger: "blur" },
+        ],
+        tableType: [
+          { required: true, message: "请选择表类型", trigger: "change" },
+        ],
+        tableOwner: [
+          { required: true, message: "请选择所属方", trigger: "change" },
+        ],
+      },
+
+      importVisible: false,
+      tempList: [],
+
+      curEleTable: {},
+      istableType: true,
+      editEleVisible: false,
+      editEleList: [],
+      eleReg: /(≥|≤|±|【】)?([^≥≤±【】]*)/,
+
+      editEleFormulaVisible: false,
+      isMeter: false,
+      formulaInput: "",
+      editEleListFilter: [],
+      editEleListAll: [],
+      tableFileTypeList:[],
+      importTemplateVisible: false,
+      fileUrl: "",
+      upFile: null,
+      importLoading: false,
+
+      nodeInfoVisible: false,
+      nodeInfoTable: [],
+      nodeInfoTableLoad: false,
+      namelist: [],
+      namelists: [],
+      delids: [],
+
+      infoNameVisible: false,
+
+      excelSortTag: false,
+      excelSortTag2: false,
+      tableSortList: [],
+      //#endregion
+
+      defaultExpandedKeys: [],
+      expandName: this.$route.fullPath,
+
+      aliasVisible: false, //别名
+      aliasInput: "",
+      aliasArr: [],
+
+      formulaCompVisible: false, //公式弹框
+      formulaCompVisible1: false,
+      formulaCurRow: {}, //当前元素
+
+      editElementVisible: false, //编辑元素弹框
+      editElementQuery: {
+        pkeyId: "",
+        excelId: "",
+        id: "",
+        initTableName: "",
+        initTableId: "",
+        pid: "",
+        wbsid: "",
+        nodeid: "",
+      }, //传参
+
+      syncBtnLoad: false,
+      syncElectricLoad: false,
+
+      showType: 1,
+      typeTreeData: [],
+      testTreeLoad: false,
+      testTreeData: [],
+      mixRatioTestIds: [],
+
+      //节点参数,关联元素
+      curParam: {}, //当前节点参数
+      linkEleVisible: false,
+      linkEleTableList: [], //元素表数组
+      curLinkEleTable: {}, //当前元素表
+      linkCheckVisible: false, //关联弹框
+      linkEleList: [], //元素数组
+      linkEleKey: "", //搜索关键字
+      menusData: [
+        // {icon: 'el-icon-s-promotion', label: '新增节点', key: "add"},
+        {
+          icon: "el-icon-s-promotion",
+          label: "编辑节点",
+          key: "edit",
+          content: "编辑节点",
+        },
+        {
+          icon: "el-icon-upload",
+          label: "后管数据同步",
+          key: "sync1",
+          content: "后管数据同步",
+        },
+        {
+          icon: "el-icon-upload",
+          label: "同步到合同段",
+          key: "sync3",
+          content: "同步到合同段",
+        },
+    
+        
+        {
+          icon: "el-icon-sort",
+          label: "调整排序",
+          key: "sort",
+          content: "调整排序",
+        },
+        {
+          icon: "el-icon-s-promotion",
+          label: "删除节点",
+          key: "del",
+          content: "删除节点",
+        },
+      ], //树组件操作菜单
+      menuvisible: false,
+      menuleft: 20,
+      menutop: 0,
+      //同步菜单按钮
+      menuoptions: [
+        {
+          value: "jdSync",
+          label: "节点参数同步",
+          load: false,
+        },
+        {
+          value: "dqSync",
+          label: "电签同步",
+          load: false,
+        },
+        {
+          value: "gsSync",
+          label: "公式同步",
+          load: false,
+        },
+        // {
+        //   value: "zdSync",
+        //   label: "字典同步",
+        //   load: false,
+        // },
+      ],
+      menuvalue: "",
+      isshowSyncbtn: false,
+      projectName: "",
+      nodeInfoSaveload: false,
+      handlesyncLoad: false, //表单同步
+      isLinkNodes: false,
+      linkNodesLoad: false,
+      checkedLinkNodesKeys: [],
+      rowPkeyId: "",
+      nodesCheck: [],
+      standardTypeOptions: [], //标准分类
+      unitOptions: [], //单位名称
+      editDialogShow: false, //编辑元素
+      searchinput: "",
+      editTable: [],
+      editEleTableloading: false,
+      dynamicDictList: [],
+      saveLoading: false,
+      fileTitleVisible:false,
+      deCheckTreeKeys:[],
+      fileTableData:[
+        
+      ],
+      fileTitleRef:null,
+     
+      fileTitleModel:{
+        type:'',
+  
+      },
+      fileTreeLoading:false,
+      fileTreeData:[],
+      filedefaultProps:{
+         children: 'children',
+          label: 'nodeName',
+          disabled:function (data) {
+          return data.status===11 ;
+        },
+      },
+      fileTitleRules:{
+        type: [
+            { required: true, message: '请选择题名范围', trigger: 'blur' },
+          
+          ],
+      },
+      
+      fileTableLoading:false,
+      chooseFileVisible:false,
+      chooseFileRow: {},
+      chooseFileIndex: -1,
+      isShowSize:true,
+      selectDiv:Math.random(),
+      saveFileLoading:false,
+      proSyncTag:false,
+      rangeOptions:[],
+      typeOptions:[],
+      checkAll: false,
+      checkAll1: false,
+      isIndeterminate: false,
+      isIndeterminate1: false,
+      syncForm:{
+        range:'',
+        rangeName:'',
+        type:[],
+        typeName:'',
+        templateId:'',
+        templateName:'',
+        contractRange:[],
+        contractRangeName:'',
+        formIds:''
+      },
+      preTableData:[],
+      multipleSelection: [],
+      checkIdList:[
+       
+      ],
+      isShowLeft:false,
+      isShowTable:false,
+      templateIdList:[],//同步源
+      saveProTagLoading:false,
+      syncTableDialog:false,
+      preTableData1:[],
+      formIds:'',
+      saveTableSyncLoad:false,
+      checkRow:null,
+      syncListDialog:false,
+      refreshLoading:false,
+      syncListData:{
+        nodeNum:'',//同步节点数量
+        nodeNumEnd:''//已同步数量
+      },
+      isAdd:'',
+      refreshLoading1:false,
+      codeDialog:false,
+ 
+      codeSetRef: null,
+      typeTem:'',
+      isShowTree1:true,
+      cachedNodes: new Map(),      // 缓存已加载的节点数据
+      
+    };
+  },
+  computed: {
+    ...mapGetters(["userInfo"]),
+
+  },
+  created() {
+    this.init();
+
+    
+
+        // 尝试恢复之前选中的节点
+    // // 尝试恢复之前的状态
+    // this.restoreTreeState();
+     // 从本地存储恢复展开的keys
+    // const savedExpandedKeys = JSON.parse(localStorage.getItem('treeExpandedKeys') || '[]');
+    // this.defaultExpandedKeysType = savedExpandedKeys;
+  },
+  methods: {
+    //#region
+    changeType(val){
+      console.log(val,'val');
+      
+      this.isNodeType=val
+      this.formData=[]
+       localStorage.setItem('isNodeType',val);
+       this.filterText1=''
+        
+
+    },
+    init() {
+      //this.id = this.$route.query.wbsid;
+      //this.projectid = this.$route.query.pid;
+      const { wbsid, pid, type } = this.$route.query;
+      this.id = wbsid;
+      this.projectid = pid;
+      this.wbsType = type ? Number(type) : 1;
+      this.getNodeTypelistData()
+      this.getNodeTypelist();
+      this.getTableTypelist();
+      this.getDataTypelist();
+      this.getOwnerTypelist();
+      this.getStandardTypeOptions();
+      this.getMajorDataTypeList();
+      this.getTableFileTypeList();
+      this.defaultExpandedKeys = getStore({ name: this.expandName });
+      this.projectName = this.$route.query.projectName;
+    },
+    
+    loadNode(node, resolve) {
+      
+      let pid = 0;
+      if (node.level != 0) {
+        pid = node.data.id;
+      }
+      const type = this.wbsType;
+      getLazytree(this.id, pid, this.userInfo.tenant_id, this.projectid, {
+        wbsType: type,
+      }).then((res) => {
+        let arr = [];
+        if (Array.isArray(res.data.data)) {
+          arr = res.data.data;
+        }
+
+        return resolve(arr);
+      });
+    },
+    // 在 loadNodeByType 中恢复选中状态
+  loadNodeByType(node, resolve) {
+     // 如果有缓存且不是根节点,直接返回缓存
+    if (node.level !== 0 && this.cachedNodes.has(node.data.id)) {
+      return resolve(this.cachedNodes.get(node.data.id));
+    }
+    let pid = 12345678910;
+    if (node.level != 0) {
+      pid = node.data.id;
+    }
+    getTreeByType({
+      parentId: pid,
+      projectId: this.projectid,
+      current: 1,
+      size: 1000,
+      titleName: this.filterText1
+    }).then((res) => {
+      let arr = [];
+      if (Array.isArray(res.data.data['records'])) {
+        arr = res.data.data['records'];
+      }
+      resolve(arr);
+      
+      // 恢复选中状态
+      this.$nextTick(() => {
+        if (this.currentNodeKey) {
+          this.$refs.treeByType.setCurrentKey(this.currentNodeKey);
+        }
+      });
+    }).catch(error => {
+      console.error('加载树节点失败:', error);
+      resolve([]);
+    });
+  },
+
+ saveTreeState() {
+    const tree = this.$refs.treeByType;
+    if (!tree) return;
+    
+    // 保存当前选中节点
+    this.currentNodeKey = tree.getCurrentKey();
+    
+    // 保存所有展开节点
+    this.defaultExpandedKeysType = [];
+    const traverse = (node) => {
+      if (node.expanded && node.data) {
+        this.defaultExpandedKeysType.push(node.data.id);
+      }
+      if (node.childNodes) {
+        node.childNodes.forEach(traverse);
+      }
+    };
+    traverse(tree.store.root);
+  },
+  
+  // 节点展开时保存状态
+  handleNodeExpand(data) {
+    if (!this.defaultExpandedKeysType.includes(data.id)) {
+      this.defaultExpandedKeysType.push(data.id);
+    }
+  },
+  
+  // 节点折叠时更新状态
+  handleNodeCollapse(data) {
+    const index = this.defaultExpandedKeysType.indexOf(data.id);
+    if (index > -1) {
+      this.defaultExpandedKeysType.splice(index, 1);
+    }
+  },
+  
+  getNodeDetail(data, node) {
+      console.log("getNodeDetail", data);
+      let parentName = "";
+      if (node.parent.data) {
+        parentName = node.parent.data.title;
+      }
+      this.curTreeData = data;
+      this.curTreeNode = node;
+      this.curTreeData.parentName = parentName;
+      getDetail(data.id, this.id, this.projectid).then((res) => {
+        res.data.data.parentName = parentName;
+        let tableObj=res.data.data;
+        tableObj.primaryKeyId=data.primaryKeyId
+        this.tableData = [res.data.data];
+        this.nodeDetail = Object.assign({}, res.data.data);
+          const { tableFileType } = this.nodeDetail;
+        this.nodeDetail.tableFileType = tableFileType.length>0 ? tableFileType.split(",") : [];
+        
+      });
+      this.updateNodeTable();
+      // this.nodeTypeChange(data.nodeType)
+
+      //获取节点展开路径
+      this.getExpandedKeys(node);
+    },
+    getNodeDetailByType(data, node) {
+      console.log(data, 'data');
+       // 保存当前选中的节点
+    this.currentNodeKey = data.id;
+      this.curTreeData = data;
+      this.curTreeNode = node;
+      data.tableName = data.title;
+      this.formData = [data];
+      
+    
+
+          
+          // 只存储node对象中的必要信息,避免循环引用
+          const nodeInfo = {
+            id: node.data.id,
+            label: node.label,
+            level: node.level,
+            isLeaf: node.isLeaf,
+            expanded: node.expanded,
+            // 其他你需要的属性
+          };
+          localStorage.setItem('lastDataNode', JSON.stringify(nodeInfo));
+    },
+  
+    saveNode() {
+      const type = this.wbsType;
+      this.$refs["nodeDetail"].validate((valid) => {
+        if (valid) {
+        
+          if (type === 2 && nodeType === 53) {
+            if (mixRatioTestIds) {
+              if (this.editType == 1) {
+                this.addNode();
+              } else if (this.editType == 2) {
+                this.updateNode();
+              }
+            } else {
+              this.$message({
+                type: "error",
+                message: "请先选择节点",
+              });
+              return false;
+            }
+          } else {
+            if (this.editType == 1) {
+              this.addNode();
+            } else if (this.editType == 2) {
+              this.updateNode();
+            }
+          }
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+    addNode() {
+      this.saveNodeLoading = true;
+        const { tableFileType } = this.nodeDetail;
+        this.nodeDetail.tableFileType = tableFileType.length>0 ? tableFileType.join(",") : "";
+      update(this.nodeDetail).then(() => {
+        this.updateTreeNewNode();
+        this.dialogVisible = false;
+        this.$message({
+          type: "success",
+          message: "新增成功!",
+        });
+      });
+    },
+    updateNode() {
+        const { tableFileType } = this.nodeDetail;
+        this.nodeDetail.tableFileType = tableFileType.length>0 ? tableFileType.join(",") : "";
+      update(this.nodeDetail).then(() => {
+        let node = this.tableData[0];
+        node.nodeName = this.nodeDetail.nodeName;
+        node.nodeType = this.nodeDetail.nodeType;
+        this.curTreeData.title = this.nodeDetail.nodeName;
+        this.dialogVisible = false;
+        this.$message({
+          type: "success",
+          message: "修改成功!",
+        });
+      });
+    },
+    toSplit(val) {
+      return val ? String(val).split(",") : "";
+    },
+    setLeftType(type, data, node) {
+      this.jiedianId = data.id;
+      this.getNodeTypelistData()
+      if (type == 4 || type == 5) {
+        this.leftType = type;
+      }
+      this.curTreeData = data;
+      this.curTreeNode = node;
+      this.$refs.tree.setCurrentKey(data.id);
+
+      if (type == 1 || type == 2) {
+        this.getMajorDataTypeList();
+       
+        this.dialogVisible = true;
+        this.editType = type;
+      }
+  
+      getDetail(data.id, this.id, this.projectid).then((res) => {
+        let parentName = "";
+        if (node.parent.data) {
+          parentName = node.parent.data.title;
+        }
+        res.data.data.parentName = parentName;
+        this.tableData = [res.data.data];
+        if (type == 1) {
+          this.nodeDetail = {
+            parentId: res.data.data.id,
+            parentName: parentName,
+            projectId: res.data.data.projectId,
+          };
+        } else {
+          this.nodeDetail = Object.assign({}, res.data.data);
+
+          this.mixRatioTestIds = this.toSplit(res.data.data.mixRatioTestIds);
+        }
+        this.nodeDetail.type = 1; //	'1'节点 '2'表单
+        this.nodeDetail.wbsId = this.id;
+        this.nodeDetail.tenantId = this.userInfo.tenant_id;
+        this.changeStandType(this.nodeDetail.className);
+      });
+      if (this.leftType == 4) {
+        selectByNodeTable(data.id, this.projectid, this.id).then((res) => {
+          if (res.data.data.length) {
+            this.formData = res.data.data;
+          } else {
+            this.formData = [];
+          }
+        });
+      }
+
+      //获取节点展开路径
+      this.getExpandedKeys(node);
+    },
+
+    showFormElement() {
+      if (!this.nodeDetail.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择在哪个节点下创建表",
+        });
+        return;
+      }
+      this.eleVisible = true;
+    },
+
+    addEleRow(list) {
+      list.push({});
+    },
+    delEleRow(index, list) {
+      list.splice(index, 1);
+    },
+    saveFormAndElementHandle() {
+      this.$refs["eleDialog"].validate((valid) => {
+        if (valid) {
+          this.eleForm.wbsId = this.id;
+          this.eleForm.tenantId = this.userInfo.tenant_id;
+          this.eleForm.nodeType = -1;
+          this.eleForm.type = 2; //	'1'节点 '2'表单
+          this.eleForm.parentId = this.nodeDetail.id;
+          this.eleForm.elementList.forEach((element) => {
+            element.eAllowDeviation =
+              (element.allow ? element.allow : "") +
+              (element.deviation ? element.deviation : "");
+            if (element.eType == 4) {
+              element.eLength = 0;
+            }
+          });
+          saveFormAndElement(this.eleForm).then(() => {
+            //console.log(res)
+            this.updateTreeNewNode();
+            this.updateNodeTable();
+            this.eleVisible = false;
+            this.$message({
+              type: "success",
+              message: "新增成功!",
+            });
+          });
+        } else {
+          console.log("error submit!!");
+          return false;
+        }
+      });
+    },
+
+    updateTreeNewNode() {
+      getLazytree(
+        this.id,
+        this.nodeDetail.parentId,
+        this.userInfo.tenant_id,
+        this.projectid
+      ).then((res) => {
+        this.$refs.tree.updateKeyChildren(
+          this.nodeDetail.parentId,
+          res.data.data
+        );
+      });
+    },
+
+    updateNodeTable() {
+
+      if(this.isNodeType){
+                selectByNodeTable( this.curTreeData.id, this.projectid, this.id).then(
+            (res) => {
+              if (res.data.data && res.data.data.length) {
+                this.formData = res.data.data;
+                this.formData.forEach((ele) => {
+                  ele.nodeType = Number(ele.nodeType);
+                });
+              } else {
+                this.formData = [];
+              }
+            }
+          );
+      }else{
+        console.log(8888888);
+        this.reloadEntireTree();
+      
+      }
+    },
+
+async reloadEntireTree() {
+  this.isNodeType = false;
+  
+  // 1. 获取树组件引用和当前选中节点
+  const tree = this.$refs.treeByType;
+  if (!tree) return;
+  
+  const currentKey = tree.getCurrentKey();
+  const currentPath = [];
+  
+  // 2. 收集当前选中节点的路径和所有展开节点
+  const allExpandedNodes = [];
+  
+  const traverseTree = (node) => {
+    if (node.expanded && node.level > 0) {
+      allExpandedNodes.push({
+        id: node.data.id,
+        node: node
+      });
+    }
+    if (node.childNodes) {
+      node.childNodes.forEach(traverseTree);
+    }
+  };
+  traverseTree(tree.store.root);
+  
+  // 3. 获取选中节点的完整路径
+  if (currentKey) {
+    const currentNode = tree.getNode(currentKey);
+    if (currentNode) {
+      let parent = currentNode.parent;
+      while (parent && parent.level > 0) {
+        currentPath.unshift(parent.data.id);
+        parent = parent.parent;
+      }
+      currentPath.push(currentKey); // 包含当前节点本身
+    }
+  }
+  
+  // 4. 清空缓存
+  this.cachedNodes.clear();
+  
+  // 5. 强制重新加载当前路径上的所有节点
+  for (const nodeId of currentPath) {
+    const node = tree.getNode(nodeId);
+    if (node) {
+      node.loaded = false; // 标记为需要重新加载
+      // 从缓存中移除
+      this.cachedNodes.delete(nodeId);
+    }
+  }
+  
+  // 6. 关闭所有非当前路径的展开节点
+  allExpandedNodes.forEach(({id, node}) => {
+    if (!currentPath.includes(id)) {
+      node.expanded = false;
+      node.loaded = false; // 标记为需要重新加载
+      this.cachedNodes.delete(id);
+    }
+  });
+  
+  // 7. 重新加载根节点
+  const rootNode = tree.store.root;
+  const rootId = rootNode.childNodes[0].data.id || 'root';
+  await this.$nextTick();
+  tree.updateKeyChildren(rootId, []);
+  
+  const root = tree.getNode(rootId);
+  if (root) {
+    root.loaded = false;
+    root.expand();
+  }
+  
+  // 8. 等待树重新加载完成
+  await new Promise(resolve => {
+    const checkLoaded = () => {
+      if (root.loaded) {
+        resolve();
+      } else {
+        setTimeout(checkLoaded, 50);
+      }
+    };
+    checkLoaded();
+  });
+  
+  // 9. 重新展开当前路径
+  this.defaultExpandedKeysType = [...currentPath];
+  for (const nodeId of currentPath) {
+    const node = tree.getNode(nodeId);
+    if (node && !node.expanded) {
+      node.expand();
+      // 等待节点加载
+      await new Promise(resolve => {
+        const checkNodeLoaded = () => {
+          if (node.loaded) {
+            resolve();
+          } else {
+            setTimeout(checkNodeLoaded, 50);
+          }
+        };
+        checkNodeLoaded();
+      });
+    }
+  }
+  
+  // 10. 恢复选中状态
+  if (currentKey) {
+    // 检查节点是否仍然存在
+    const currentNode = tree.getNode(currentKey);
+    if (currentNode) {
+      tree.setCurrentKey(currentKey);
+      this.currentNodeData = currentNode.data;
+      this.formData = [{
+        ...this.currentNodeData,
+        tableName: this.currentNodeData.title
+      }];
+    } else {
+      // 节点已被删除
+      this.currentNodeKey = null;
+      this.currentNodeData = null;
+      this.formData = [];
+      // this.$message.warning('当前选中节点已被删除');
+    }
+  }
+},
+  // 关闭所有非路径上的展开节点
+closeOtherExpandedNodes(tree, keepOpenPath) {
+  const closeNodes = (node) => {
+    if (node.expanded && node.level > 0) {
+      const nodeId = node.data.id;
+      // 如果节点不在需要保持展开的路径中,则关闭它
+      if (!keepOpenPath.includes(nodeId)) {
+        node.expanded = false;
+      }
+    }
+    
+    if (node.childNodes) {
+      node.childNodes.forEach(closeNodes);
+    }
+  };
+  
+  // 从根节点开始遍历
+  closeNodes(tree.store.root);
+},
+    deleNode(data, node) {
+      let pid = data.primaryKeyId ? data.primaryKeyId : data.pKeyId;
+      this.$confirm(
+        "此操作将删除节点【" + data.title + "】, 是否继续?",
+        "提示",
+        {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }
+      )
+        .then(() => {
+          removePrivateTreeNode(pid).then(() => {
+            this.$refs.tree.remove(node);
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+          });
+        })
+        .catch(() => {});
+    },
+  // 重新加载整棵树
+
+    importHandle() {},
+
+    handlePreview(index, row) {
+      this.curEleTable = row;
+      if(!this.curEleTable.initTableId){
+        this.$message({ type: "warning", message: '请先关联清表' })
+         return 
+      }
+      selectPrivateFormElements(this.curEleTable.initTableId).then((res) => {
+        res.data.data.forEach((element) => {
+          this.eleReg.exec(element.eAllowDeviation);
+          element.allow = RegExp.$1 ? RegExp.$1 : "";
+          element.deviation = RegExp.$2 ? RegExp.$2 : "";
+        });
+        this.editEleList = res.data.data;
+      });
+      this.editEleVisible = true;
+    },
+    //关联节点
+    handleLinkNodes(index, row) {
+      this.rowPkeyId = row.pkeyId;
+      this.linkNodesLoad = false;
+      this.isLinkNodes = true;
+      getLinekNodeTreelist(row.pkeyId)
+        .then(({ data }) => {
+          const res = data.data;
+          if (res instanceof Array) {
+            this.checkedLinkNodesKeys = res;
+          } else {
+            this.checkedLinkNodesKeys = [];
+          }
+        })
+        .catch(() => {
+          this.checkedLinkNodesKeys = [];
+        });
+    },
+    //确定关联
+    linkNodesSave() {
+      const keys = this.$refs.tree2.getCheckedKeys();
+      // if (keys.length <= 0) {
+      //   this.$message({
+      //     type: "warning",
+      //     message: "请先勾选节点",
+      //   });
+      //   return;
+      // }
+   
+      const pkeyId = this.rowPkeyId;
+      this.linkNodesLoad = true;
+      linkNodeTree(keys.length >0?keys.join(","):'', pkeyId)
+        .then(() => {
+          this.$message({
+            type: "success",
+            message: "关联成功!",
+          });
+          this.linkNodesLoad = false;
+          this.linkNodesClose();
+        })
+        .catch(() => {
+          this.linkNodesLoad = false;
+        });
+    },
+    //关闭关联弹窗
+    linkNodesClose() {
+      this.isLinkNodes = false;
+      this.linkNodesLoad = false;
+      this.checkedLinkNodesKeys = [];
+      this.nodesCheck = [];
+      this.rowPkeyId = "";
+    },
+    handleDelete(index, row) {
+      this.$confirm("是否删除  " + row.tableName + "  ?", "删除元素表", {
+        distinguishCancelAndClose: true,
+        confirmButtonText: "删除",
+        cancelButtonText: "取消",
+      }).then(() => {
+       
+       
+          if(this.isNodeType){
+              removeTableById(row.id, this.projectid, this.id).then(() => {
+                this.formData.splice(index, 1);
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                });
+            });
+          }else{
+              delTabInfoAll(row.pkeyId).then(() => {
+                this.formData.splice(index, 1);
+                this.$message({
+                  type: "success",
+                  message: "删除成功!",
+                });
+            });
+          }
+      });
+    },
+    async hideMD(row) {
+      //隐藏按钮
+      const code = await this.updateStatus(row.pkeyId, row.status);
+      if (code == 200) {
+        if (row.status == 0) {
+          row.status = 1;
+        } else {
+          row.status = 0;
+        }
+      }
+    },
+    async updateStatus(pKeyId, status) {
+      //隐藏功能激活
+      const { data: res } = await updateStatus({ pKeyId });
+      if (res.code == 200) {
+        this.$message({
+          type: "success",
+          message: status == 1 ? "隐藏成功" : "激活成功",
+        });
+      }
+      return res.code;
+    },
+    handleEditFormula(index, row) {
+      this.curEleTable = row;
+      selectFormElements(this.curEleTable.pkeyId, { type: 0 }).then((res) => {
+        this.editEleListFilter = res.data.data;
+        this.editEleListAll = [].concat(this.editEleListFilter);
+      });
+      this.editEleFormulaVisible = true;
+    },
+
+    //表单同步
+    handlesync(index, row) {
+   
+    },
+    //搜索 筛选
+    searchFormulaName() {
+      this.editEleListFilter = this.editEleListAll.filter((ele) => {
+        return ele.eName.indexOf(this.formulaInput) > -1;
+      });
+    },
+
+    saveNewEle(row) {
+      row.eAllowDeviation =
+        (row.allow ? row.allow : "") + (row.deviation ? row.deviation : "");
+      row.fId = this.curEleTable.initTableId;
+      row.initTableName = this.curEleTable.initTableName;
+      if (row.eType == 4) {
+        row.eLength = 0;
+      }
+      saveElement(row).then((res) => {
+        if (res.data.data) {
+          this.$set(row, "id", res.data.data.id);
+          this.$set(row, "ekey", res.data.data.ekey);
+          this.$message({
+            type: "success",
+            message: "保存成功!",
+          });
+        }
+      });
+    },
+    delEleRowHandle(index, list) {
+      let row = list[index];
+      if (row.id) {
+        //有id需要请求删除
+        this.$confirm("是否确认删除?", "删除元素", {
+          distinguishCancelAndClose: true,
+          confirmButtonText: "删除",
+          cancelButtonText: "取消",
+        }).then(() => {
+          removeElement(row.id, this.curEleTable.initTableName, row.ekey).then(
+            () => {
+              list.splice(index, 1);
+            }
+          );
+        });
+      } else {
+        list.splice(index, 1);
+      }
+    },
+
+    nodeTypeChange(val) {
+      console.log(333333333);
+      if (val === 53) {
+        // if (this.testTreeData.length > 0) {
+        //   return;
+        // }
+
+        this.testTreeLoad = true;
+        // getAlltreeTrial(this.projectid, this.id, this.curTreeData.primaryKeyId).then((res) => {
+        //   this.testTreeLoad = false;
+        //   console.log(res.data.data,'data');
+        //   let trialdata=res.data.data
+        //   if(trialdata&&trialdata.allTree){
+        //     this.testTreeData = trialdata.allTree[0];
+        //     if(trialdata.allStatusIds.length>0){
+        //       //设置勾选相关联试验全选
+        //       this.mixRatioTestIds =trialdata.allStatusIds[0];
+        //     }
+
+        //   }
+
+        // });
+        let pid = this.curTreeData.primaryKeyId
+          ? this.curTreeData.primaryKeyId
+          : this.curTreeData.pKeyId;
+
+        getAlltree(this.projectid, this.id, pid).then((res) => {
+          this.testTreeLoad = false;
+          console.log(res.data.data, "data");
+          this.testTreeData = res.data.data;
+        });
+      }
+    },
+    //根据逗号联合
+    toJoin(arr) {
+      return arr ? arr.join() : "";
+    },
+    TestTreeCheckChange(_, { checkedKeys, halfCheckedKeys }) {
+      // const newarr = [...checkedKeys, ...halfCheckedKeys];
+      const newarr = [...checkedKeys];
+      this.nodeDetail.mixRatioTestIds = this.toJoin(newarr);
+    },
+    // filterChange() {
+    //   if (this.treeData.length > 0) {
+    //     this.$refs.treeall.filter(this.filterText);
+    //     return;
+    //   }
+    //   this.treeLoad = true;
+    //   getAlltree(this.projectid, this.id).then((res) => {
+    //     this.treeLoad = false;
+    //     this.treeData = res.data.data;
+    //     console.log(res.data.data,'res.data.data');
+    //     this.$nextTick(() => {
+    //       this.$refs.treeall.filter(this.filterText);
+    //     });
+    //   });
+    // },
+    //搜索树
+
+    //搜索树
+    searchTreeClick() {
+      if (this.filterText.length > 0) {
+        this.isSearch = true;
+        this.searchtreeLoad = true;
+        getQueryValueByType({
+          queryValue: this.filterText,
+          type: this.searchType,
+          wbsId: this.id,
+          projectId: this.projectid,
+        }).then((res) => {
+          let arr = [];
+          if (Array.isArray(res.data.data)) {
+            arr = res.data.data;
+            this.searchTreeData = arr;
+          } else {
+            this.searchTreeData = [];
+          }
+        });
+      } else {
+        this.isSearch = false;
+      }
+
+      this.searchtreeLoad = false;
+    },
+     searchTreeClick1() {
+      if(!this.curTreeData.hasChildren){
+        this.$message.warning('请先选择一个父节点');
+        return;
+      }
+        // if (!this.filterText1.trim()) {
+        //   this.$message.warning('请输入搜索内容');
+        //   return;
+        // }
+        
+        // 保存当前状态
+            // 保存当前状态
+      this.saveTreeState();
+           // 清空缓存
+      this.cachedNodes.clear();
+        
+           // 重新加载选中节点及其子节点
+      this.reloadSelectedNode();
+
+      },
+      
+  // 清空搜索
+clearSearch1() {
+  this.filterText1 = '';
+
+    this.searchTreeClick1();
+
+},
+    // 重新加载选中节点
+ async reloadSelectedNode() {
+      const tree = this.$refs.treeByType;
+      if (!tree || !this.currentNodeKey) return;
+      
+      // 获取当前节点
+      const currentNode = tree.getNode(this.currentNodeKey);
+      if (!currentNode) return;
+      
+      // 标记为未加载,强制重新加载
+      currentNode.loaded = false;
+      currentNode.expand(); // 这会触发loadNodeByType
+      
+      // 恢复状态
+      await this.$nextTick();
+      tree.setCurrentKey(this.currentNodeKey);
+  },
+    // 重新加载树
+    reloadTree() {
+      const tree = this.$refs.treeByType;
+      if (!tree) return;
+      
+      // 清空根节点
+      const rootNode = tree.store.root;
+      const rootId = rootNode.childNodes[0].data.id || 'root';
+      tree.updateKeyChildren(rootId, []);
+      
+      // 强制重新加载根节点
+      const root = tree.getNode(rootId);
+      if (root) {
+        root.loaded = false;
+        root.expand();
+      }
+      
+      // 恢复状态
+      this.$nextTick(() => {
+        if (this.currentNodeKey) {
+          tree.setCurrentKey(this.currentNodeKey);
+        }
+      });
+    },
+
+
+// 刷新树数据
+
+
+    filterSearchClick(){
+    
+        this.isSearch = true;
+        this.searchtreeLoad = true;
+        getQueryValueByNodeType({
+          queryValue: this.filterText,
+          wbsId: this.id,
+          projectId: this.projectid,
+        }).then((res) => {
+          let arr = [];
+          if (Array.isArray(res.data.data)) {
+            arr = res.data.data;
+            this.searchTreeData = arr;
+          } else {
+            this.searchTreeData = [];
+          }
+        });
+      
+
+      this.searchtreeLoad = false;
+    },
+    clearSearch() {
+      this.isSearch = false;
+    },
+    importTemplate(data) {
+      this.importTemplateVisible = true;
+      this.curTreeData = data;
+
+      if (!this.fileUrl) {
+        getAttchFromOriginalName(1, 20, {
+          originalName: "WBS划分模板.xls",
+        }).then((res) => {
+          if (res.data.data.records.length) {
+            this.fileUrl = res.data.data.records[0].link;
+          } else {
+            this.fileUrl = "";
+          }
+        });
+      }
+    },
+
+    importTemplateHandle() {
+      if (!this.upFile) {
+        this.$message({
+          type: "warning",
+          message: "请先选择文件再进行导入",
+        });
+        return;
+      }
+      let forms = new FormData();
+      forms.append("excelFile", this.upFile);
+      let wbsTreeFu = {
+        wbsId: this.id,
+        parentId: this.curTreeData.id,
+        // ancestors:'0,'+this.curTreeData.id,
+      };
+      let json = JSON.stringify(wbsTreeFu);
+      let blob = new Blob([json], { type: "application/json" });
+      forms.append("wbsTreeFu", blob);
+      this.importLoading = true;
+      importWbsTree(forms)
+        .then(() => {
+          //this.$router.go(0)
+          let node = this.$refs.tree.getNode(this.curTreeData.id);
+          node.isLeaf = false;
+          this.importTemplateVisible = false;
+          this.upFile = null;
+        })
+        .finally(() => {
+          this.importLoading = false;
+        });
+    },
+
+    handleDownload() {
+      if (this.fileUrl) {
+        window.open(this.fileUrl);
+      } else {
+        this.$message({
+          type: "warning",
+          message: "请先在附件管理上传【WBS划分模板.xls】文件",
+        });
+      }
+    },
+    fileClick() {
+      this.$refs.file.click();
+    },
+
+    fileChange(e) {
+      const file = e.target.files[0];
+      if (!file) {
+        // 如果用户没有选择图片,只是点了文件上传这个按钮
+        return;
+      }
+      //console.log(file)
+      this.upFile = file;
+    },
+    editNodeInfo(index, row) {
+      this.$set(row, "isEdit", true);
+    },
+    saveNodeInfoHandle(index, row) {
+      row.isEdit = false;
+    },
+
+    downloadTmp() {
+      getTemplate().then((res) => {
+        //console.log(res)
+        let blob = new Blob([res.data], {
+          type: "application/vnd.ms-excel",
+        });
+        //console.log(blob)
+        let filename = Date.parse(new Date()) + ".xls";
+        if (window.navigator.msSaveOrOpenBlob) {
+          // 兼容IE10
+          window.navigator.msSaveBlob(blob, filename);
+        } else {
+          //  兼容chrome/firefox
+          let aTag = document.createElement("a");
+          aTag.download = Date.parse(new Date()) + ".xls";
+          aTag.href = window.URL.createObjectURL(blob);
+          aTag.click();
+          URL.revokeObjectURL(aTag.href);
+        }
+      });
+    },
+
+    fileClick2() {
+      this.$refs.file2.click();
+    },
+    tmpImport(e) {
+      const file = e.target.files[0];
+      const formData = new FormData();
+      formData.append("file", file);
+      //console.log(file.name)
+      importWbsElement(formData)
+        .then((res) => {
+          res.data.data.forEach((element) => {
+            element.eName = element.elementName;
+            element.eLength = element.elementLength;
+            element.eType = Number(element.elementType);
+            element.eAllowDeviation = element.elementAllowDeviation;
+            element.eInspectionMethod = element.elementInspectionMethod;
+            this.eleReg.exec(element.eAllowDeviation);
+            // console.log(RegExp.$1)
+            // console.log(RegExp.$2)
+            element.allow = RegExp.$1 ? RegExp.$1 : "";
+            element.deviation = RegExp.$2 ? RegExp.$2 : "";
+          });
+          this.eleForm.elementList = res.data.data;
+          this.importVisible = false;
+        })
+        .finally(() => {
+          e.target.value = "";
+        });
+    },
+
+    visiblechange(value, data) {
+      this.$set(data, "moreShow", value);
+    },
+
+    bianhua2() {
+      this.excelSortTag2 = false;
+      this.$nextTick(() => {
+        this.excelSortTag2 = true;
+      });
+    },
+    //私有树的元素表修改排序
+    privateTableSort() {
+      if (!this.curTreeData.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择需要排序的节点",
+        });
+        return;
+      }
+      this.tableSortList = this.formData.map((form, index) => {
+        return {
+          sort: index + 1,
+          nodeName: form.tableName,
+          pkeyId: form.pkeyId,
+        };
+      });
+      this.excelSortTag = true;
+      this.excelSortTag2 = true;
+    },
+    editPrivateSort() {
+      this.surePrivateSortload = true;
+      wbsTreePrivateTableSort(this.tableSortList).then(() => {
+        this.$message({
+          type: "success",
+          message: "排序成功!",
+        });
+
+        this.updateNodeTable();
+        this.surePrivateSortload = false;
+        this.excelSortTag = false;
+        this.excelSortTag2 = false;
+      });
+    },
+
+    //解析元素数据类型
+    eTypeFormatter(row) {
+      let text = "";
+      for (let i = 0; i < this.dataTypeList.length; i++) {
+        if (this.dataTypeList[i].dictKey == row.eType) {
+          text = this.dataTypeList[i].dictValue;
+          break;
+        }
+      }
+      return text;
+    },
+
+    //跳转到公式配置页面
+    toFormulaEdit(row, type) {
+      this.curEleTable.hasPartFormula = row.hasPartFormula;
+      this.formulaCurRow = row;
+      this.formulaCurRow.globaltype = type;
+      if (type === 10) {
+        this.formulaCompVisible1 = true;
+        this.formulaCurRow.elementType = false;
+        this.istableType = true;
+      } else {
+        this.formulaCompVisible = true;
+      }
+    },
+    //关闭公式弹窗
+    closeformulaComp() {
+      console.log("关闭");
+      selectFormElements(this.curEleTable.pkeyId, { type: 0 }).then((res) => {
+        this.editEleListFilter = res.data.data;
+        this.editEleListAll = [].concat(this.editEleListFilter);
+      });
+    },
+    //关闭公式弹窗
+    closeformulaComp1() {
+      console.log("关闭");
+      selectFormElements(this.curEleTable.pkeyId, { type: 0 }).then((res) => {
+        this.editEleListFilter = res.data.data;
+        this.editEleListAll = [].concat(this.editEleListFilter);
+      });
+    },
+    getNodeTypelist() {
+      let code = "name_rule";
+
+      getDictionary({
+        code,
+      }).then((res) => {
+        this.nodeTypelist1 = res.data.data;
+ 
+        
+      });
+    },
+    getNodeTypelistData() {
+      const type = this.wbsType;
+      let code = "";
+      if (type === 5) {
+        code = "lar_node_type"; //征拆
+      } else if (type === 2) {
+        code = "trial_node_type"; //试验
+      } else if (type === 3) {
+        code = "meter_node_type"; //计量
+      } else {
+        {
+          code = "wbs_node_type"; //质检
+        }
+      }
+
+      getDictionary({
+        code,
+      }).then((res) => {
+        this.nodeTypelist = res.data.data;
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+    
+        });
+        this.nodeTypelist = res.data.data;
+       
+        
+      });
+    },
+    getMajorDataTypeList() {
+      // if (this.majorDataTypeList.length > 1) {
+      //   return;
+      // }
+      getDictionary({
+        code: "major_data_type",
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+    
+        });
+        // this.majorDataTypeList = res.data.data;
+        this.majorDataTypeList = res.data.data.filter(
+          (item) => item.dictKey != 0
+        );
+       
+        
+      });
+    },
+    getTableFileTypeList(){
+      if (this.tableFileTypeList.length > 1) {
+        return;
+      }
+      getDictionaryBiz({
+        code: "table_file_type",
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey =element.dictKey
+        });
+        this.tableFileTypeList = res.data.data;
+      });
+    },
+
+    getTableTypelist() {
+      const type = this.wbsType;
+      if (this.tableTypelist.length > 1) {
+        return;
+      }
+      let code = "";
+      if (type === 5) {
+        code = "table_type"; //征拆
+      } else if (type === 2) {
+        code = "trial_table_type"; //试验
+      } else {
+        code = "table_type"; //质检
+      }
+      getDictionary({
+        // code: "table_type",
+        // code: type === 2 ? "trial_table_type" : "table_type",
+        code,
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+        });
+        this.tableTypelist = res.data.data;
+      });
+    },
+    getDataTypelist() {
+      if (this.dataTypeList.length > 1) {
+        return;
+      }
+      getDictionary({
+        code: "data_type",
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+        });
+        this.dataTypeList = res.data.data;
+      });
+    },
+    getOwnerTypelist() {
+      if (this.ownerTypeList.length > 1) {
+        return;
+      }
+      getDictionary({
+        code: "owner_type",
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+        });
+        this.ownerTypeList = res.data.data;
+      });
+    },
+    getStandardTypeOptions() {
+      getDictionary({
+        code: "classification",
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+        });
+        // 定义要过滤的 dictKey 值
+        const targetKeys = [1, 2, 3, 4, 5];
+        // 过滤数组
+        const filteredOptions = res.data.data.filter((item) =>
+          targetKeys.includes(item.dictKey)
+        );
+
+        this.standardTypeOptions = filteredOptions;
+      });
+    },
+    changeStandType(val) {
+      let parentId = "";
+      this.standardTypeOptions.forEach((item) => {
+        if (item.dictKey == val) {
+          parentId = item.id; // 找到匹配项,提取 parentId
+        }
+      });
+
+      getChildList(1, 10000, parentId).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+        });
+        this.unitOptions = res.data.data;
+        this.unitOptions = this.unitOptions.filter(
+          (item) => item.dictKey != -1
+        );
+      });
+    },
+
+    formatCat(row, column, cellValue) {
+      for (let i = 0; i < this.nodeTypelist.length; i++) {
+        if (this.nodeTypelist[i].dictKey == cellValue) {
+          return this.nodeTypelist[i].dictValue;
+        }
+      }
+      return cellValue;
+      //console.log(cellValue)
+    },
+    formatTableType(row, column, cellValue) {
+      for (let i = 0; i < this.tableTypelist.length; i++) {
+        if (this.tableTypelist[i].dictKey == cellValue) {
+          return this.tableTypelist[i].dictValue;
+        }
+      }
+      return cellValue;
+      //console.log(cellValue)
+    },
+    formatOwner(row, column, cellValue) {
+      for (let i = 0; i < this.ownerTypeList.length; i++) {
+        if (this.ownerTypeList[i].dictKey == cellValue) {
+          return this.ownerTypeList[i].dictValue;
+        }
+      }
+      return cellValue;
+      //console.log(cellValue)
+    },
+    formatdataType(row, column, cellValue) {
+      for (let i = 0; i < this.dataTypeList.length; i++) {
+        if (this.dataTypeList[i].dictKey == cellValue) {
+          return this.dataTypeList[i].dictValue;
+        }
+      }
+      return cellValue;
+    },
+    formMajorType(row, column, cellValue) {
+
+      
+      for (let i = 0; i < this.majorDataTypeList.length; i++) {
+        if (this.majorDataTypeList[i].dictKey == cellValue) {
+          return this.majorDataTypeList[i].dictValue;
+        }
+      }
+      return cellValue;
+    },
+
+    // filterNode(value, data) {
+    //   if (!value) return true;
+    //   return data.title.indexOf(value) !== -1;
+    // },
+    getReturnNode(node, _array, value) {
+      let isPass =
+        node.data && node.data.title && node.data.title.indexOf(value) !== -1;
+      isPass ? _array.push(isPass) : "";
+      if (!isPass && node.level != 1 && node.parent) {
+        this.getReturnNode(node.parent, _array, value);
+      }
+    },
+
+    filterNode(value, data, node) {
+      if (!value) {
+        return true;
+      }
+      let level = node.level;
+      let _array = []; //这里使用数组存储 只是为了存储值。
+      this.getReturnNode(node, _array, value);
+      let result = false;
+      _array.forEach((item) => {
+        result = result || item;
+      });
+      return result;
+    },
+    //#endregion
+
+    //#region  wbs私有树排序
+    async sortpai(data) {
+      console.log(data);
+      await this.findWbsTreePrivateSameLevel({
+        parentId: data.parentId,
+        projectId: this.projectid,
+        wbsId: this.id,
+      });
+      this.sortTag = true;
+      this.sortTag2 = true;
+    },
+    editSort() {
+      this.wbsTreePrivateSort();
+    },
+    bianhua() {
+      this.sortTag2 = false;
+      this.$nextTick(() => {
+        this.sortTag2 = true;
+      });
+    },
+    async wbsTreePrivateSort() {
+      this.sureSortload = true;
+      //wbs私有树节点手动排序
+      const { data: res } = await wbsTreePrivateSort(this.sort);
+      console.log(res);
+      if (res.code == 200) {
+        this.sortTag = false;
+        this.sortTag2 = false;
+        this.$message({
+          type: "success",
+          message: "排序成功!",
+        });
+        this.sureSortload = false;
+        this.isShowTree = false;
+        setTimeout(() => {
+          this.isShowTree = true;
+        }, 100);
+        // window.location.reload();
+        // this.getLazytreessss();
+      }
+    },
+    async findWbsTreePrivateSameLevel(da) {
+      //wbs私有树同级节点接口
+      const { data: res } = await findWbsTreePrivateSameLevel(da);
+      if (res.code == 200) {
+        this.sort = res.data;
+      }
+    },
+    async getLazytreessss() {
+      const type = this.wbsType;
+      const { data: res } = await getLazytree(
+        this.id,
+        0,
+        this.userInfo.tenant_id,
+        this.projectid,
+        { wbsType: type }
+      );
+      console.log(res);
+      if (res.code == 200) {
+        this.treeData = res.data;
+      }
+    },
+    //#endregion
+
+    //#region 关联清表
+    async getList(da) {
+      //获取清表模板信息
+      const { data: res } = await getList(da);
+      console.log(res);
+      if (res.code === 200 && res.msg === "操作成功") {
+        this.GLExcelData = res.data.records;
+      }
+    },
+    async tabLazytreeAll() {
+      //清表树信息
+      this.GLExcelLoading = true;
+      const { data: res } = await tabLazytreeAll({
+        modeId: this.GLExcelFrom.name,
+        name: this.GLExcelFrom.search,
+      });
+      this.GLExcelLoading = false;
+      console.log(res);
+      if (res.code === 200 && res.msg === "操作成功") {
+        this.exceldata = res.data;
+      }
+    },
+    Associationlist(scope) {
+      //关联清表点击事件
+      console.log(scope.row);
+      this.GLExcel = true;
+      this.getList({
+        current: 1,
+        size: 100000,
+        parentId: 0,
+      });
+      this.GLExcelFrom.name = scope.row.modeId;
+      setTimeout(() => {
+        this.$refs.tree.setCheckedKeys([scope.row.excelId]);
+      }, 2000);
+      this.GLExcelFrom.initTableId = scope.row.initTableId;
+      this.GLExcelFrom.id = scope.row.pkeyId;
+      this.GLExcelFrom.excelId = scope.row.excelId;
+      this.GLExcelFrom.ids = scope.row.id;
+      this.GLExcelFrom.initTableName = scope.row.initTableName;
+      this.GLExcelFrom.pkeyId = scope.row.pkeyId;
+  
+    },
+    changetherr() {
+      //清表类型选择框change事件
+      if (this.GLExcelFrom.name != "") {
+        this.GLExcelFrom.search = "";
+        this.tabLazytreeAll();
+      }
+    },
+    GLExcelMD() {
+      //弹框关闭事件
+      this.GLExcelFrom.name = "";
+      this.GLExcelFrom.search = "";
+      this.GLExcelFrom.id = "";
+      this.exceldata = [];
+      this.$refs.tree.setCheckedKeys([]);
+      this.GLExcel = false;
+    },
+    checkchange(data) {
+      //节点选中回调
+      if (this.$refs.tree.getCheckedNodes().length === 0) {
+        this.$refs.tree.setCheckedKeys([]);
+      } else if (this.$refs.tree.getCheckedNodes().length >= 1) {
+        this.$refs.tree.setCheckedKeys([data.id]);
+      }
+    },
+async saveLinkTab() {
+  // 保存按钮
+  let checkNodes = this.$refs.tree.getCheckedNodes();
+  if (checkNodes.length > 0) {
+    let node = checkNodes[checkNodes.length - 1];
+    if (node.fileType != 3) {
+      this.$message({
+        type: "warning",
+        message: "请先上传Excel表",
+      });
+      return;
+    }
+    
+    try {
+      const { data: res } = await saveLinkTab({
+        exceTabId: node.id,
+        tabId: this.GLExcelFrom.id,
+        updateAll:this.isNodeType? false:true,
+      });
+      
+      if (res.code === 200) {
+        this.$message({
+          type: "success",
+          message: "关联清表成功",
+        });
+        
+        // 保存原始的pkeyId
+        const originalPkeyId = this.GLExcelFrom.pkeyId;
+        
+        if (this.isNodeType) {
+          // 加载节点类型的数据
+          const response = await selectByNodeTable(this.curTreeData.id, this.projectid, this.id);
+          
+          if (response.data.data && response.data.data.length) {
+            this.formData = response.data.data;
+            // 查找并更新initTableId
+            const matchedItem = this.formData.find(ele => ele.pkeyId === originalPkeyId);
+            if (matchedItem) {
+              this.GLExcelFrom.initTableId = matchedItem.initTableId;
+        
+            }
+            
+            // 调用rightClick方法
+            this.rightClick(
+              this.GLExcelFrom.id,
+              this.GLExcelFrom.excelId,
+              this.GLExcelFrom.ids,
+              this.GLExcelFrom.initTableName,
+              this.GLExcelFrom.initTableId
+            );
+          } else {
+            this.formData = [];
+          }
+        } else {
+          // 非节点类型,重新加载整个树
+          await this.reloadEntireTree();
+        }
+        
+        this.GLExcel = false;
+      }
+    } catch (error) {
+      console.error("关联清表失败:", error);
+      this.$message({
+        type: "error",
+        message: "关联清表失败",
+      });
+    }
+  } else {
+    this.$message({
+      type: "warning",
+      message: "请先设置清表",
+    });
+  }
+},
+    getReturnNode2(node, _array, value) {
+      let isPass =
+        node.data && node.data.name && node.data.name.indexOf(value) !== -1;
+      isPass ? _array.push(isPass) : "";
+      if (!isPass && node.level != 1 && node.parent) {
+        this.getReturnNode2(node.parent, _array, value);
+      }
+    },
+
+    filterNode222(value, data, node) {
+      if (!value) {
+        return true;
+      }
+      let level = node.level;
+      let _array = []; //这里使用数组存储 只是为了存储值。
+      this.getReturnNode2(node, _array, value);
+      let result = false;
+      _array.forEach((item) => {
+        result = result || item;
+      });
+      return result;
+    },
+    //#endregion
+
+    //#region 节点参数
+    nodeInfo(data) {
+      //节点参数按钮
+      this.keymap();
+      //console.log(data)
+      let pid = data.primaryKeyId ? data.primaryKeyId : data.pKeyId;
+      this.jiedianId = pid;
+      this.parameters(pid);
+      this.nodeInfoVisible = true;
+    },
+    closenodeInfoVisible() {
+      this.nodeInfoTable = [];
+      this.nodeInfoVisible = false;
+    },
+    addNodeInfoTable() {
+      //添加节点参数数据
+      this.nodeInfoTable.unshift({
+        k: "",
+        v: "",
+        remark: "",
+        nodeId: this.jiedianId,
+        type: 1,
+      });
+      console.log(this.nodeInfoTable);
+    },
+    refreshnfoTable() {
+      //刷新表格
+      let prams = {
+        nodeId: this.jiedianId,
+        type: 1,
+        projectId: this.projectid,
+      };
+      this.nodeInfoTableLoad = true;
+      refrehPram(prams).then((res) => {
+        this.nodeInfoTableLoad = false;
+        if (res.data.code == 200) {
+          this.$message.success("刷新成功");
+        }
+      });
+    },
+    delNodeInfo(key, obj) {
+      this.delids.push(obj.id);
+      //设置参数名称中的删除按钮
+      this.namelists.splice(key, 1);
+    },
+    delNodeInfoss(key, obj) {
+      this.delids.push(obj.id);
+      //节点参数
+      this.nodeInfoTable.splice(key, 1);
+    },
+    setNodeParameters() {
+      //打开设置节点参数弹框按钮
+      this.infoNameVisible = true;
+      this.namelists = [...this.namelist];
+    },
+
+    async setParameterName() {
+      //设置参数名称中添加节点参数按钮
+      // wbsId: this.jiedianId
+      this.namelists.unshift({
+        name: "",
+        remark: "",
+        k: "",
+        type: 0,
+        nodeId: this.jiedianId,
+      });
+    },
+    async nodeInfoSave() {
+      //节点参数弹框保存按钮
+      if (this.nodeInfoTable) {
+        // if (this.nodeInfoTable.length == 0) {
+        //   await this.saveOrUpdateBatch({projectId:this.projectid,nodeId:this.jiedianId,type:1,delIds:this.delids,wps:[
+        //     {
+        //       nodeId: this.jiedianId,
+        //       type: -1,
+        //     },
+        //   ]});
+        //   this.nodeInfoVisible = false;
+        //   this.delIds=[];
+        //   this.$message({
+        //     type: "success",
+        //     message: "保存参数节点成功!",
+        //   });
+        //   return;
+        // }
+        console.log(this.namelist);
+        let tag = true;
+        this.nodeInfoTable.forEach((val) => {
+          if (!val.k | !val.v) {
+            return (tag = false);
+          }
+
+          //if (!val.name) {
+          for (let i = 0; i < this.namelist.length; i++) {
+            if (this.namelist[i].k == val.k) {
+              val.name = this.namelist[i].name;
+              return;
+            }
+          }
+          //}
+        });
+
+        if (tag) {
+          this.nodeInfoSaveload = true;
+          await this.saveOrUpdateBatch({
+            scopeType: 10,
+            projectId: this.projectid,
+            nodeId: this.jiedianId,
+            wps: this.nodeInfoTable,
+            type: 1,
+            delIds: this.delids,
+          });
+          this.delIds = [];
+          this.$message({
+            type: "success",
+            message: "设置参数节点成功!",
+          });
+          this.nodeInfoSaveload = false;
+          this.parameters(this.jiedianId);
+          // this.nodeInfoVisible = false;
+        } else {
+          this.$message({
+            type: "error",
+            message: "请填写所有的参数名称和参数值!",
+          });
+        }
+      } else {
+        this.$message({
+          type: "error",
+          message: "请先设置参数节点!",
+        });
+      }
+    },
+    async addParameterName() {
+      //设置参数名称中的保存按钮
+      if (this.namelists.length) {
+        let tag = true;
+        this.namelists.forEach((val) => {
+          if (!val.name || !val.k) {
+            return (tag = false);
+          }
+        });
+        if (tag) {
+          await this.saveOrUpdateBatch({
+            scopeType: 10,
+            projectId: this.projectid,
+            nodeId: this.jiedianId,
+            wps: this.namelists,
+            type: 0,
+            delIds: this.delids,
+          }); //保存设置参数
+          this.infoNameVisible = false;
+          this.delIds = [];
+          this.keymap();
+        } else {
+          this.$message({
+            type: "error",
+            message: "请填写所有的参数名称和参数值KEY!",
+          });
+        }
+      } else {
+        this.$message({
+          type: "warning",
+          message: "请先添加参数",
+        });
+      }
+    },
+    closeParameter() {
+      //设置参数名称,关闭按钮
+      this.namelists = [];
+      this.infoNameVisible = false;
+    },
+    async parameters(wbsId) {
+      //获取接待你参数列表
+      const { data: res } = await parameters({ wbsId });
+      console.log(res);
+      if (res.code == 200) {
+        if (Array.isArray(res.data)) {
+          this.nodeInfoTable = res.data;
+        }
+      }
+    },
+    async saveOrUpdateBatch(da) {
+      //保存
+      const { data: res } = await saveOrUpdateBatch(da);
+      this.delids = [];
+      console.log(res);
+    },
+    async keymap() {
+      //节点参数枚举
+      const { data: res } = await keymap();
+      console.log(res);
+      if (res.code == 200) {
+        this.namelist = res.data;
+      }
+    },
+    //#endregion
+
+    //#region 调整表单
+    adjustExcel(pkeyId, excelId) {
+      //调整表单
+      this.GLExcelFrom.id = pkeyId;
+      this.GLExcelFrom.excelId = excelId;
+      this.getExcelHtml(pkeyId);
+    },
+    async getExcelHtml(pkeyId) {
+      const { data: res } = await getExcelHtml({ pkeyId });
+      console.log(res);
+      if (res.code === 200) {
+        localStorage.setItem("excelHtml", res.data);
+        this.adjustmentExcel = res.data;
+        this.excelHtml = true;
+      }
+    },
+    removeExcel() {
+      this.excelHtml = false;
+    },
+    //#endregion
+
+    //#region 编辑元素
+    async rightClick(pkeyId, excelId, id, initTableName, initTableId) {
+      await this.getExcelHtml2(pkeyId);
+      this.editElementQuery.pkeyId = pkeyId;
+      this.editElementQuery.excelId = excelId;
+      this.editElementQuery.id = id;
+      this.editElementQuery.initTableName = initTableName;
+      this.editElementQuery.initTableId = initTableId;
+      this.editElementQuery.pid = this.$route.query.pid;
+      this.editElementQuery.wbsid = this.$route.query.wbsid;
+      this.editElementQuery.nodeid = this.curTreeData.id;
+
+      this.editElementVisible = true;
+    },
+    hideEditElementVisible() {
+      this.editElementVisible = false;
+      // this.updateNodeTable();
+      if(this.isNodeType){
+          this.updateNodeTable();
+      }
+    },
+    async getExcelHtml2(pkeyId) {
+      const { data: res } = await getExcelHtml({ pkeyId });
+      console.log(res);
+      if (res.code === 200) {
+        localStorage.setItem("editElement", res.data);
+      }
+    },
+    //#endregion
+
+    //#region 元素表单信息
+    editEditElementForm() {
+      //标记元素
+      if (this.formData.length) {
+        let da = [];
+        this.formDatass = [...this.formData];
+        this.formDatass.forEach((val) => {
+          da.push({
+            tableType: val.tableType - 0,
+            tableOwner: val.tableOwner - 0,
+            pkeyId: val.pkeyId,
+            tableName: val.tableName,
+            fillRate: val.fillRate,
+            nodeType: val.nodeType - 0,
+          });
+        });
+        this.formDatass = da;
+        this.editElementFormTag = true;
+      }else{
+        this.$message({
+          type: "warning",
+          message: "当前列表无数据!",
+        });
+      }
+    },
+    editeditElementFormMF() {
+      //保存按钮
+      let da = [];
+      let tag = true;
+      this.formDatass.forEach((val) => {
+        if (!val.tableName || !val.tableType || !val.tableOwner) {
+          tag = false;
+          return;
+        } else {
+          da.push({
+            pkeyId: val.pkeyId,
+            nodeName: val.tableName,
+            tableType: val.tableType,
+            tableOwner: val.tableOwner,
+            fillRate: val.fillRate,
+            nodeType: val.nodeType,
+          });
+        }
+      });
+      if (tag) {
+        this.updateBatchNodeTableInfo2(da);
+      } else {
+        this.$message({
+          type: "success",
+          message: "请填写完整元素表单的所有信息!",
+        });
+      }
+    },
+    async updateBatchNodeTableInfo2(da) {
+      this.editeditElementFormMFLoading = true;
+      //共有编辑元素
+      const { data: res } = await updateBatchNodeTableInfo2(da);
+      if (res.code == 200) {
+        this.editElementFormTag = false;
+        this.updateNodeTable();
+        this.editeditElementFormMFLoading = false;
+      }
+      this.editeditElementFormMFLoading = false;
+    },
+    //#endregion
+
+    //获取节点展开路径
+    getExpandedKeys(node) {
+      //console.log(node)
+      let expandedKeys = [];
+      while (node.parent) {
+        expandedKeys.push(node.data.id);
+        node = node.parent;
+      }
+      setStore({
+        name: this.expandName,
+        content: expandedKeys,
+        type: true, //sessionStorage
+      });
+      //console.log(expandedKeys)
+    },
+
+    //触发节点参数
+    nodeInfoHandle() {
+      if (!this.curTreeData.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+
+      this.nodeInfo(this.curTreeData);
+    },
+
+    eleFormulaHandle() {
+      if (!this.curTreeData.id || !this.curTreeNode.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+      this.setLeftType(4, this.curTreeData, this.curTreeNode);
+      // this.showType = 2;
+    },
+
+    editNodeHandle() {
+      console.log(this.curTreeData, "this.curTreeData.id ");
+      if (!this.curTreeData.id || !this.curTreeNode.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+      this.mixRatioTestIds = [];
+      // this.nodeTypeChange(53);
+      this.nodeTypeChange(this.curTreeData.nodeType);
+      this.dialogTitle = "编辑节点";
+      this.setLeftType(2, this.curTreeData, this.curTreeNode);
+    },
+    addNodeHandle() {
+      if (!this.curTreeData.id || !this.curTreeNode.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+      this.mixRatioTestIds = [];
+      // this.nodeTypeChange(53);
+      this.nodeTypeChange(this.curTreeData.nodeType);
+      this.dialogTitle = "新增节点";
+      this.setLeftType(1, this.curTreeData, this.curTreeNode);
+    },
+    copyNodeHandle() {
+      if (!this.curTreeData.id || !this.curTreeNode.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+    },
+    delNodeHandle() {
+      if (!this.curTreeData.id || !this.curTreeNode.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+      if (this.curTreeNode.level == 1) {
+        this.$message({
+          type: "warning",
+          message: "当前节点无法删除",
+        });
+        return;
+      }
+      this.deleNode(this.curTreeData, this.curTreeNode);
+    },
+
+    eleHandle() {
+      if (!this.curTreeData.id || !this.curTreeNode.id) {
+        this.$message({
+          type: "warning",
+          message: "请先选择节点",
+        });
+        return;
+      }
+
+      this.setLeftType(5, this.curTreeData, this.curTreeNode);
+    },
+
+    syncInfoHandle(item) {
+      if (this.curTreeData.primaryKeyId || this.curTreeData.pKeyId) {
+        this.$confirm("是否同步节点参数?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          this.syncBtnLoad = true;
+          this.menuoptions.forEach((ele) => {
+            if (item.value == ele.value) {
+              ele.load = true;
+            }
+          });
+          let pid = this.curTreeData.primaryKeyId
+            ? this.curTreeData.primaryKeyId
+            : this.curTreeData.pKeyId;
+          syncNodeParam(this.projectid, pid)
+            .then(() => {
+              this.$message({
+                type: "success",
+                message: "同步成功!",
+              });
+            })
+            .finally(() => {
+              this.syncBtnLoad = false;
+              this.menuoptions.forEach((ele) => {
+                if (item.value == ele.value) {
+                  ele.load = false;
+                }
+              });
+            });
+        });
+      } else {
+        this.$message.warning("请先选择左侧节点");
+      }
+    },
+
+    //显示别名弹窗
+    aliasShow() {
+      this.aliasVisible = true;
+      if (this.nodeDetail.fullName) {
+        this.aliasArr = this.nodeDetail.fullName.split(",");
+      } else {
+        this.aliasArr = [];
+      }
+      this.aliasInput = "";
+    },
+
+    addAlias() {
+      if (this.aliasInput) {
+        this.aliasArr.push(this.aliasInput);
+        this.aliasInput = "";
+      }
+    },
+    delAlias(index) {
+      this.aliasArr.splice(index, 1);
+    },
+
+    saveAliasHandle() {
+      this.nodeDetail.fullName = this.aliasArr.join(",");
+      if (this.editType == 1) {
+        //新增
+        this.aliasVisible = false;
+      } else if (this.editType == 2) {
+        //编辑 私有
+        privateSubmitFullName(
+          this.nodeDetail.pKeyId,
+          this.nodeDetail.fullName
+        ).then(() => {
+          this.$message({
+            type: "success",
+            message: "保存成功",
+          });
+          this.aliasVisible = false;
+        });
+      }
+    },
+
+  async  syncNodeTableHandle(data) {
+    this.isAdd=''
+     console.log('后管数据同步',data);
+     this.curTreeData=data
+     this.isShowLeft=false
+    //  await  this.getNodeStatusData()
+      if(this.syncListDialog){
+        return
+      }
+     this.syncForm.range='1'
+   
+   
+      
+     this.proSyncTag=true
+     if(this.$refs.syncProTree){
+        this.$refs.syncProTree.setCheckedKeys([])
+       }
+        if(this.$refs.proTable){
+          this.$refs.proTable.clearSelection()
+        }
+     this.isShowTable=true
+     this.getTypeOptions()
+    this.getRangeOptions()
+      this.getCheckIdList()
+      let pid=data.primaryKeyId?data.primaryKeyId:data.pKeyId
+
+      this.getTempProjectList(pid)
+     
+    },
+    syncProjectHandle(data) {
+      this.$confirm("是否同步节点【" + data.title + "】到合同段?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(() => {
+        let notify = this.$notify({
+          title: "提示",
+          message: "节点数据同步中...",
+          duration: 0,
+        });
+        let pid = data.primaryKeyId ? data.primaryKeyId : data.pKeyId;
+        syncNodeinfo(pid)
+          .then(() => {
+            this.updateNodeTable();
+            this.$message({
+              type: "success",
+              message: "同步成功",
+            });
+          })
+          .catch(() => {
+            this.$message({
+              type: "error",
+              message: "同步失败",
+            });
+          })
+          .finally(() => {
+            notify.close();
+          });
+      });
+    },
+    //同步元素表单排序到合同段
+   async syncSortHandle(data) {
+      console.log('同步到合同');
+      this.isShowLeft=false
+      this.curTreeData=data
+   
+      if(this.syncListDialog){
+        return
+      }
+      // await  this.getNodeStatusData()
+       this.syncForm.range='2'
+       
+       this.proSyncTag=true
+     
+       this.isShowTable=true
+       this.getTypeOptions()
+       this.getRangeOptions()
+   
+      this.getCheckIdList()
+      selectByNodeTable(data.id, this.projectid, this.id).then((res) => {
+          if (res.data.data.length>0) {
+            this.preTableData = res.data.data;
+          } else {
+            this.preTableData = [];
+          }
+        });
+      
+    },
+    typeTreeLoadNode(node, resolve) {
+      let pid = 0;
+      if (node.level != 0) {
+        pid = node.data.id;
+      }
+      tabTypeLazyTree(pid, this.projectid).then((res) => {
+        let arr = [];
+        if (Array.isArray(res.data.data)) {
+          arr = res.data.data;
+        }
+
+        return resolve(arr);
+      });
+    },
+
+    getTypeTreeDetail() {},
+    independent() {
+      this.$router.push({
+        path: "/project/independent",
+        query: {
+          pid: this.projectid,
+          wbsid: this.$route.query.wbsid,
+          wbsType: this.wbsType,
+        },
+      });
+    },
+    archiveTimeClick() {
+      this.$router.push({
+        path: "/project/archiveTime",
+        query: { pid: this.projectid, wbsid: this.$route.query.wbsid },
+      });
+    },
+    syncElectric(item) {
+      if (this.curTreeData.primaryKeyId || this.curTreeData.pKeyId) {
+        console.log("同步电签默认信息");
+        this.$confirm("是否同步电签默认信息?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          this.syncElectricLoad = true;
+          this.menuoptions.forEach((ele) => {
+            if (item.value == ele.value) {
+              ele.load = true;
+            }
+          });
+          let pid = this.curTreeData.primaryKeyId
+            ? this.curTreeData.primaryKeyId
+            : this.curTreeData.pKeyId;
+          syncProjecteVisa(this.projectid, pid)
+            .then(() => {
+              this.$message({
+                type: "success",
+                message: "同步成功!",
+              });
+            })
+            .finally(() => {
+              this.syncElectricLoad = false;
+              this.menuoptions.forEach((ele) => {
+                if (item.value == ele.value) {
+                  ele.load = false;
+                }
+              });
+            });
+        });
+      } else {
+        this.$message.warning("请先选择左侧节点");
+      }
+    },
+
+    //节点参数 关联元素
+    linkEle(row) {
+      console.log(row, "row");
+      if (!row.id) {
+        this.$message.warning("请先保存数据,再点击关联元素");
+      } else {
+        this.linkEleVisible = true;
+        this.curParam = row;
+        getParamElements({
+          nodeId: this.curTreeData.id,
+          projectId: this.projectid,
+          paramId: row.id,
+          scopeType: 10,
+        }).then((res) => {
+          if (res.data.data.length) {
+            this.linkEleTableList = res.data.data;
+          } else {
+            this.linkEleTableList = [];
+          }
+        });
+      }
+    },
+
+    //关联元素弹框
+    tolinkEle(row) {
+      this.curLinkEleTable = row;
+      this.linkCheckVisible = true;
+      let pid = this.curTreeData.primaryKeyId
+        ? this.curTreeData.primaryKeyId
+        : this.curTreeData.pKeyId;
+      selectFormElements(row.id, { type: 3, nodeId: pid }).then((res) => {
+        res.data.data.forEach((ele) => {
+          ele.checked = false;
+          ele.show = true;
+        });
+        this.linkEleList = res.data.data;
+        this.linkEleListAll = [].concat(this.linkEleList);
+      });
+    },
+    //删除关联
+    delLink(data) {
+      this.$confirm("删除关联, 是否继续?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          console.log(data);
+          delParamElements(data).then(() => {
+            this.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+
+            getParamElements({
+              nodeId: this.curTreeData.id,
+              projectId: this.projectid,
+              paramId: this.curParam.id,
+              scopeType: 10,
+            }).then((res) => {
+              if (res.data.data.length) {
+                this.linkEleTableList = res.data.data;
+              } else {
+                this.linkEleTableList = [];
+              }
+            });
+          });
+        })
+        .catch(() => {});
+    },
+
+    //筛选元素
+    searchEle() {
+      this.linkEleList = this.linkEleListAll.filter((ele) => {
+        return ele.eName.indexOf(this.linkEleKey) > -1;
+      });
+    },
+
+    linkEleCheck(value, index) {
+      //console.log(value)
+      if (value) {
+        this.linkEleList.forEach((ele, i) => {
+          if (i != index) {
+            ele.checked = false;
+          }
+        });
+      }
+    },
+
+    //关联元素
+    saveLinkEle() {
+      let target = {};
+      this.linkEleList.forEach((e) => {
+        if (e.checked == true) {
+          target = { elementId: e.id, paramId: this.curParam.id };
+        }
+      });
+      if (JSON.stringify(target) !== "{}") {
+        specifiedParamElements(target).then((data) => {
+          this.linkCheckVisible = false;
+          getParamElements({
+            nodeId: this.curTreeData.id,
+            projectId: this.projectid,
+            paramId: this.curParam.id,
+            scopeType: 10,
+          }).then((res) => {
+            if (res.data.data.length) {
+              this.linkEleTableList = res.data.data;
+            } else {
+              this.linkEleTableList = [];
+            }
+          });
+        });
+      } else {
+        this.$message.warning("请先选择关联元素");
+      }
+    },
+    //树形控件菜单相关方法
+    mouseout() {
+      this.menuvisible = false;
+    },
+    //展示菜单
+    showMenu(e, data, node) {
+      e.preventDefault();
+      console.log(e, "e");
+      var x = e.pageX; //这个应该是相对于整个浏览器页面的x坐标,左上角为坐标原点(0,0)
+      var y = e.pageY; //这个应该是相对于整个浏览器页面的y坐标,左上角为坐标原点(0,0)
+      this.menutop = y;
+      this.menuleft = x;
+      this.menuvisible = true;
+    },
+    menuClick(e, item, data,node) {
+    this.curTreeData = data; //当前节点数据
+      this.curTreeNode = node; //当前节点数据
+      e.preventDefault();
+      if (item.key === "sort") {
+        this.sortpai(data);
+      } else if (item.key === "sync1") {
+        this.syncNodeTableHandle(data);
+      } //
+      else if (item.key === "sync3") {
+        this.syncSortHandle(data);
+      } else if (item.key === "add") {
+        this.addNodeHandle();
+      } else if (item.key === "edit") {
+        this.editNodeHandle();
+      } else if (item.key === "del") {
+        this.delNodeHandle();
+      } else if (item.value === "jdSync") {
+        this.syncInfoHandle(item);
+      } else if (item.value === "gsSync") {
+        this.$message({
+          type: "info",
+          message: "暂无相关接口!",
+        });
+      } else if (item.value === "dqSync") {
+        this.syncElectric(item);
+      }
+    },
+    //展示数据同步下拉框
+    showSyncbtn() {
+      this.isshowSyncbtn = !this.isshowSyncbtn;
+    },
+    getDictTypelist() {
+      if (this.dynamicDictList.length > 1) {
+        return;
+      }
+      getDictionary({
+        code: "land_field_dict",
+      }).then((res) => {
+        res.data.data.forEach((element) => {
+          element.dictKey = Number(element.dictKey);
+        });
+        this.dynamicDictList = res.data.data;
+        const filteredList = this.dynamicDictList.filter(
+          (item) => item.dictKey === 600 || item.dictKey === 0
+        );
+        this.dynamicDictList = filteredList;
+      });
+    },
+    getSelectFormElements(id) {
+      this.editEleTableloading = true;
+      let finalId=this.isNodeType?this.curEleTable.pkeyId:this.curEleTable.id
+      selectFormElements(finalId, {
+        type: 0,
+        search: this.searchinput,
+      }).then((res) => {
+        this.editEleTableloading = false;
+        this.editTable = res.data.data;
+      });
+    },
+    //编辑
+    handleEdit(index, row) {
+      this.curEleTable = row;
+      this.getSelectFormElements();
+      this.editDialogShow = true;
+      this.getDictTypelist();
+    },
+    //编辑元素信息(请谨慎操作)
+    clearsearchinput() {
+      this.getSelectFormElements();
+    },
+    searchinputChange() {
+      this.getSelectFormElements();
+    },
+
+    saveEles() {
+      if (this.editTable.length > 0) {
+        console.log( this.curEleTable,' this.curEleTable');
+        
+        this.saveLoading = true;
+        updateBatchElements(
+          this.editTable,
+          this.curEleTable.initTableName
+        ).then(() => {
+          this.saveLoading = false;
+          this.editDialogShow = false;
+          this.updateNodeTable();
+          this.$message({
+            type: "success",
+            message: "保存成功!",
+          });
+        });
+      } else {
+        this.editDialogShow = false;
+        this.updateNodeTable();
+        this.$message({
+          type: "success",
+          message: "保存成功!",
+        });
+      }
+    },
+    //文件题名(全局按钮)
+    fileTitleHandle(){
+      this.getFileTableData()
+      this.fileTitleVisible = true;
+    },
+    changeRadio(val){
+      console.log(val,'val');
+      const fileItem = this.fileTableData[this.chooseFileIndex];
+      this.$set(fileItem, 'type', val);
+    },
+    //获取文件题名规则
+    getFileTableData(){
+      this.fileTableLoading=true
+      getNameRule(
+       { projectId:this.projectid}
+      ).then((res) => {
+        this.fileTableLoading=false
+        if(res.data.data){
+          this.fileTableData = res.data.data;
+          this.fileTableData.forEach((element) => {
+            element.roleNameVal = element.nameRule.split(",");
+            element.ruleName=element.nameVaule.split("-")
+            if(element.type===2){
+              const list=element.list
+              let arr=[]
+              let arrId=[]
+              list.forEach((ele) => {
+                arr.push(ele.nodeName)
+                arrId.push(ele.nodeId)
+              });
+              element.ruleSizeVal = arr.join('、');
+              element.ruleSizeValId=arrId
+            }else{
+              element.ruleSizeVal=''
+              element.ruleSizeValId=''
+            }
+          });
+        }else{
+          this.fileTableData =[]
+        }
+      });
+    },
+    //获取文件题名范围
+    getTitleRangeData(row){
+     this.fileTreeLoading=true
+      getTitleRange(
+       { projectId:this.projectid,
+        nameId:row.nameId,
+  
+
+       }
+      ).then((res) => {
+        this.fileTreeLoading=false
+        if(res.data.data){
+          this.fileTreeData = res.data.data;
+     
+          
+          // this.deCheckTreeKeys = this.fileTreeData.filter(node => node.status === 11).map(node => node.id);
+      
+        }else{
+          this.fileTreeData =[]
+        }
+      });
+    },
+    //选择题名范围
+    chooseFile(index,row){
+      const {ruleName}=row
+      if(ruleName&&ruleName.length>0){
+         this.chooseFileVisible = true;
+        this.chooseFileIndex= index;
+        this.deCheckTreeKeys=row.ruleSizeValId
+        this.getTitleRangeData(row)
+      }else{
+      this.$message.warning('请先选择文件题名规则');
+      }
+      
+    
+    },
+    checkFileSize(data,{checkedNodes,checkedKeys}){
+      let checkedTitles = checkedNodes.map(node => node.nodeName).join('、');
+      this.fileTableData[this.chooseFileIndex].isEdit1=false
+      const fileItem = this.fileTableData[this.chooseFileIndex];
+      this.$set(fileItem, 'ruleSizeVal', checkedTitles);
+      this.$set(fileItem, 'ruleSizeValId', checkedKeys);
+      this.deCheckTreeKeys=checkedKeys
+
+      
+    },
+   getCheckedNodes  (treeData, checkedKeys)  {
+  
+    let result = []
+    treeData.forEach(node => {
+        if (checkedKeys&&checkedKeys.includes(node.id)) {
+            result.push(node)
+        }
+        if (node.children) {
+            result = result.concat(getCheckedNodes(node.children, checkedKeys))
+        }
+    })
+    return result
+},
+    saveFileSize(){
+      // const checkedNodes = this.getCheckedNodes(this.fileTreeData, this.deCheckTreeKeys).filter(node => node.status !== 11)
+      const checkedNodes = this.getCheckedNodes(this.fileTreeData, this.deCheckTreeKeys)
+      this.fileTableData[this.chooseFileIndex].ruleSizeValId = checkedNodes.map(node => node.id)
+      this.fileTableData[this.chooseFileIndex].ruleSizeVal = checkedNodes.map(node => node.nodeName).join('、')
+      this.chooseFileVisible = false;
+      this.isShowSize=false
+      setTimeout(()=>{
+        this.isShowSize=true
+      },100)
+
+    },
+    editRow(index,row){
+      console.log(row,'row');
+      
+      this.$set(row, "isEdit", true);
+      this.$set(row, "isEdit1", true);
+      this.fileTitleModel.type=row.type
+    },
+    //保存文件题名
+    saveRow(index,row){
+      if(row.ruleName.length<1){
+        this.$message.warning('请选择文件题名规则')
+        return
+      }
+      if(!row.type){
+        this.$message.warning('请选择文件题名范围')
+        return
+      }
+      this.$set(row, "isEdit", false);
+      this.$set(row, "isEdit1", false)
+      const ruleName=row.ruleName.join('-')
+      let ruleSizeVal=''
+      if(row.type==1){
+        ruleSizeVal=''
+      }else{
+         ruleSizeVal=row.ruleSizeValId.join(',')
+      }
+     
+      let nameRuleDtos={
+        nameId:row.nameId,
+        nameRule:ruleName,
+        nodeId:ruleSizeVal,
+        projectId:this.projectid,
+        type:this.fileTitleModel.type
+      }
+      saveOrUpdateNameRule(
+      [nameRuleDtos]
+      ).then((res) => {
+        if(res.data.code==200){
+                this.$message.success(res.data.msg)
+                this.getFileTableData()
+        }else{
+          this.$message.error(res.data.msg)
+        }
+      });
+    },
+    changeRoleName(data,row){
+      const originalData=this.nodeTypelist
+      const dictKeyToDictValueMap = originalData.reduce((acc, item) => {
+        acc[item.dictKey] = item.dictValue;
+        return acc;
+      }, {});
+      const result = data.map(dictKey => dictKeyToDictValueMap[dictKey]);
+      this.$set(row, "roleNameVal", result);
+      this.selectDiv=Math.random()
+    },
+    addRow(){
+      this.fileTableData.unshift({isEdit:true,isEdit1:true,})
+      this.fileTitleModel.type=''
+    },
+    refreshRow(){
+      this.getFileTableData()
+    },
+    delRow(index,row){
+      if(!row.nameId){
+       this.fileTableData.splice(index,1)
+      }else{
+        this.$confirm("确定将选择数据删除?", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        })
+          .then(() => {
+               return  deletedNameRule(
+              {nameId:row.nameId}
+              ).then((res) => {
+                if(res.data.code==200){
+                    this.$message.success(res.data.msg)
+                    this.getFileTableData()
+                  }else{
+                    this.$message.error(res.data.msg)
+                  }
+              });
+          });
+      }
+    
+    },
+    batchsaveFileSize(){
+      let isCansave=true
+      let saveArr=[]
+      this.fileTableData.forEach((ele)=>{
+        if(ele.ruleName.length<1||!ele.type){
+          this.$message.warning('请先完善相关信息')
+          isCansave=false
+          return
+        }
+        let ruleSizeVal=''
+        if(ele.type==1){
+            ruleSizeVal=''
+        }else{ 
+            ruleSizeVal=ele.ruleSizeValId.join(',')
+        }
+         const ruleName=ele.ruleName.join('-')
+        saveArr.push({
+          nameId:ele.nameId||'',
+          nameRule:ruleName,
+          nodeId:ruleSizeVal,
+          projectId:this.projectid,
+          type:ele.type
+        })
+      })
+      if(!isCansave){
+        return
+      }
+      this.saveFileLoading=true
+      saveOrUpdateNameRule(
+        saveArr
+      ).then((res) => {
+        this.saveFileLoading=false
+       if(res.data.code==200){
+        this.$message.success(res.data.msg)
+          this.getFileTableData()
+        }else{
+          this.$message.error(res.data.msg)
+        }
+      });
+      
+    },
+   async proSyncbtn(){
+      console.log('项目数据同步');
+    this.isAdd=''
+      this.getTypeOptions()
+      this.getRangeOptions()
+      this.getCheckIdList()
+      this.proSyncTag=true
+      if(this.$refs.syncProTree){
+        this.$refs.syncProTree.setCheckedKeys([])
+       }
+        if(this.$refs.proTable){
+          this.$refs.proTable.clearSelection()
+        }
+      this.isShowLeft=true
+      this.isShowTable=false
+    },
+    getRangeOptions(){
+      getDictionary({
+        code: "wbs_snyc_range",
+      }).then((res) => {
+        this.rangeOptions = res.data.data;
+      });
+     },
+     getTypeOptions(){
+      getDictionary({
+        code: "wbs_sync_type",
+      }).then((res) => {
+        this.typeOptions = res.data.data;
+      });
+     },
+    handleCheckChange1(data){
+      console.log(data,'data1111111111');
+      
+      getNodeStatus({ id:data.primaryKeyId}).then((res) => {
+          if(res.data.code==200){
+                      if(res.data.data){
+                        this.$message.success('该节点有同步任务,请取消选择')
+                      }
+                      }else{
+                        this.$message.error(res.data.msg)
+                      }
+          });
+     },
+  async   handleCheckChange(_,{checkedKeys,halfCheckedNodes}) {
+        let ids=checkedKeys && checkedKeys.length ? checkedKeys.join(',') : ''
+      // await  this.getNodeStatusData()
+        this.getTempProjectList(ids)
+      },
+     async getTempProjectList(ids){
+      if(ids.length>0){
+          //分页获取证书列表数据
+          const { data: res } = await getTempProject({
+          nodeIds:ids
+        });
+        if (res.code == 200) {
+          this.templateIdList = res.data;
+         
+        }
+      }
+       
+     },
+    async changeTemplateId(val){
+      if(!this.isShowTable){
+        return
+      }
+    
+       let type=''
+       let projectId=''
+       let wbsId=''
+       for (let index = 0; index < this.templateIdList.length; index++) {
+            const elemet = this.templateIdList[index];
+            if(elemet.id==val){
+              type = elemet.type;
+              this.typeTem=elemet.type
+              projectId=elemet.id
+              wbsId=elemet.wbsId
+             
+              break
+            }
+        }
+        if(type===2){
+          selectByNodeTable(this.curTreeData.id, projectId, wbsId).then((res) => {
+          if (res.data.data&&res.data.data.length > 0) {
+            this.preTableData = res.data.data;
+          } else {
+            this.preTableData = [];
+          }
+        });
+        }else{
+          const { data: res } = await findNodeTableByCondition1( this.curTreeData.id )
+          if (res.code === 200) {
+            console.log(Array.isArray(res.data));
+            if (Array.isArray(res.data)) {
+              this.preTableData = res.data
+            
+            } else {
+              this.preTableData = []
+            }
+          }
+        }
+       
+     },
+     async getCheckIdList(){
+      let code=this.wbsType!==1?'wbs_sync_contract_range':'wbs_sync_contract_quality'
+          getDictionary({
+            code: code,
+          }).then((res) => {
+            this.checkIdList = res.data.data;
+          });
+     },
+     
+    closeProSyncTag(){
+      this.proSyncTag=false
+      this.syncForm={
+        range:'',
+        rangeName:'',
+        type:[],
+        typeName:'',
+        templateId:'',
+        templateName:'',
+        contractRange:[],
+        contractRangeName:'',
+        nodeId:'',
+        formIds:''};
+      
+     
+        this.preTableData=[]
+        this.isShowLeft=false
+      
+     
+    },
+   async saveProTag(){
+
+      this.syncForm.projectId=this.projectid
+      if(this.isShowLeft){
+        let ids=this.$refs.syncProTree.getCheckedKeys()
+        this.syncForm.nodeId=ids.join(',')
+        if(this.syncForm.nodeId===''){
+         this.$message.warning('请选择节点')
+         return
+       }
+      }else{
+        this.syncForm.nodeId=this.curTreeData.primaryKeyId
+      }
+      // await  this.getNodeStatusData()
+        if(this.syncListDialog){
+          return
+      }
+
+     
+      if(this.syncForm.rangeName==''){
+        for (let index = 0; index < this.rangeOptions.length; index++) {
+          const element =this. rangeOptions[index];
+          if(element.dictKey==this.syncForm.range){
+            this.syncForm.rangeName=element.dictValue
+            break
+          }
+          
+        }
+      }
+      console.log(this.syncForm.range,'this.syncForm.range=');
+      
+      if(this.syncForm.range===''){
+        this.$message.warning('请选择同步范围')
+        return
+      }
+      this.saveProTagLoading=true
+
+      addSync({
+        ...this.syncForm,
+       type:this.syncForm.type.join(','),
+       contractRange:this.syncForm.contractRange.join(',')
+      }
+      ).then((res) => {
+        console.log(res,'res');
+        
+        this.saveProTagLoading=false
+        if(res.data.code==200){
+        this.$message.success(res.data.msg)
+        //this.getNodeStatusData()
+        console.log(res.data,'res.data');
+      
+       
+        this.syncListData.nodeNum=res.data.data.nodeNum
+        this.syncListData.nodeNumEnd=res.data.data.nodeNumEnd
+       
+        
+          if(this.isShowLeft){
+            this.isAdd=res.data.data.id
+          }else{
+            this.isAdd=''
+          }
+
+
+        this.syncListDialog=true
+        this.closeProSyncTag()
+       
+         
+        }else{
+          this.$message.error(res.data.msg)
+          this.saveProTagLoading=false
+        
+           
+        }
+      })
+      .finally(() => {
+        this.saveProTagLoading = false;
+      });
+    },
+    closeSyncListTag(){
+      this.syncListDialog=false;
+       this.updateNodeTable()
+    },
+    handleCheckAllChange(val) {
+        this.syncForm.type = val ? this.typeOptions.map(item => item.dictKey) : [];
+        this.isIndeterminate = false;
+     },
+     handleCheckAllChange1(val) {
+        this.syncForm.contractRange = val ? this.checkIdList.map(item => item.dictKey) : [];
+        this.isIndeterminate1 = false;
+     },
+     handleCheckedTypeChange(value){
+      let checkedCount = value.length;
+        this.checkAll = checkedCount === this.typeOptions.length;
+        this.isIndeterminate = checkedCount > 0 && checkedCount < this.typeOptions.length;
+     },
+     handleCheckedTypeChange1(value){
+      let checkedCount = value.length;
+        this.checkAll1 = checkedCount === this.checkIdList.length;
+        this.isIndeterminate1 = checkedCount > 0 && checkedCount < this.checkIdList.length;
+     },
+    handleSelectionChange(val) {
+      let arr = []
+      if(val.length>0){
+
+      
+        if(this.syncForm.range==='2'){
+            for (let index = 0; index < val.length; index++) {
+                 let i = val[index];
+                 arr.push(i.pkeyId) 
+             } 
+               this.syncForm.formIds=arr.join(',')
+        }else{
+              for (let index = 0; index < val.length; index++) {
+                let i = val[index];
+                if( this.typeTem===2){
+                  arr.push(i.pkeyId)
+                }else{
+                  arr.push(i.id)
+                }
+                
+              
+              }
+              console.log(arr,'arr');
+              
+               this.syncForm.formIds=arr.join(',')
+        }
+      }
+    },
+  async  handleCommand(command,row){
+  // await  this.getNodeStatusData()
+  if(this.syncListDialog){
+    return
+  }
+      this.checkRow=row
+      if(command==='a'){
+            this.$confirm("当前表单配置将同步到项目下所有相同表单,请谨慎同步!!!!!!", "表单同步提醒", {
+                    distinguishCancelAndClose: true,
+                    confirmButtonText: "确定",
+                    cancelButtonText: "取消",
+          }).then(() => {
+                  addSync({
+                    projectId:this.projectid,
+                    range:'3',
+                    nodeId:row.pkeyId,
+                    nodeName:this.curTreeData.title,
+                  
+                  }
+                  ).then((res) => {
+                   
+                    if(res.data.code==200){
+                    this.$message.success(res.data.msg)
+                   
+                    
+                    }else{
+                      this.$message.error(res.data.msg)
+                    }
+                  })
+                    
+          });
+      }else if(command==='b'){
+     
+        
+        this.syncTableDialog=true
+        this.isShowLeft=true
+
+        if(this.$refs.proTable1){
+          this.$refs.proTable1.clearSelection()
+        }
+        
+      }
+      
+    },
+    saveTableSync(){
+      this.saveTableSyncLoad=true
+      addSync({
+                    projectId:this.projectid,
+                    range:'4',
+                    nodeId:this.checkRow.pkeyId,
+                    nodeName:this.curTreeData.title,
+                    formIds:this.formIds,
+                  
+                  
+                  }
+                  ).then((res) => {
+                    this.saveTableSyncLoad=false
+                    if(res.data.code==200){
+                    this.$message.success(res.data.msg)
+                    this.syncTableDialog=false
+                    this.$refs.proTable1.clearSelection()
+                    this.updateNodeTable()
+                   
+                    }else{
+                      this.$message.error(res.data.msg)
+                    }
+                  })
+                  this.saveTableSyncLoad=false
+    },
+    handleNodeClick(data) {
+   
+      selectByNodeTable(data.id, this.projectid, this.id).then((res) => {
+          if (res.data.data.length) {
+            this.preTableData1 = res.data.data;
+          } else {
+            this.preTableData1 = [];
+          }
+        });
+     
+    },
+    handleSelectionChange1(val) {
+
+      
+        if (val.length > 1) {
+          // 如果选择了多个,只保留最后一个
+          this.$nextTick(() => {
+            this.$refs.proTable1.clearSelection();
+            this.$refs.proTable1.toggleRowSelection(val.pop());
+          });
+      }
+      if(val.length>0){
+        this.formIds=val[0].pkeyId
+      }else{
+        this.formIds=''
+      }
+       
+  
+    },
+   async refreshData(){
+    this.refreshLoading=true
+      getNodeStatus({ id:this.curTreeData.primaryKeyId}).then((res) => {
+        this.refreshLoading=false
+      if(res.data.code==200){
+                  if(res.data.data){
+                  
+                    this.syncListData.nodeNum=res.data.data.nodeNum
+                    this.syncListData.nodeNumEnd=res.data.data.nodeNumEnd
+                  
+                  }else{
+                  
+                    this.syncListData={
+                      nodeNum:'',//同步节点数量
+                      nodeNumEnd:''//已同步数量
+                    }
+                    
+                  }
+                  
+                  }else{
+                   
+                    this.syncListData={
+                      nodeNum:'',//同步节点数量
+                      nodeNumEnd:''//已同步数量
+                    }
+                    this.$message.error(res.data.msg)
+                  }
+      }).finally(() => {
+        this.refreshLoading = false;
+      });
+      
+      
+    },
+    refreshData1(){
+    console.log('shuax');
+    
+      this.refreshLoading1=true
+      getById({ id:this.isAdd}).then((res) => {
+        this.refreshLoading1=false
+      if(res.data.code==200){
+                  if(res.data.data){
+                  
+                    this.syncListData.nodeNum=res.data.data.nodeNum
+                    this.syncListData.nodeNumEnd=res.data.data.nodeNumEnd
+                  
+                  }else{
+                  
+                    this.syncListData={
+                      nodeNum:'',//同步节点数量
+                      nodeNumEnd:''//已同步数量
+                    }
+                    
+                  }
+                  
+                  }else{
+                   
+                    this.syncListData={
+                      nodeNum:'',//同步节点数量
+                      nodeNumEnd:''//已同步数量
+                    }
+                    this.$message.error(res.data.msg)
+                  }
+      });
+      
+    },
+    getNodeStatusData(){
+     
+      let ids=''
+      if(this.isShowLeft){
+        ids=this.$refs.syncProTree.getCheckedKeys()
+        ids=ids.join(',')
+      }
+      else{
+        ids=this.curTreeData.primaryKeyId
+      }
+
+      getNodeStatus({ id:ids}).then((res) => {
+
+        if(res.data.code==200){
+                    if(res.data.data){
+                    
+                      this.syncListData.nodeNum=res.data.data.nodeNum
+                      this.syncListData.nodeNumEnd=res.data.data.nodeNumEnd
+                      this.syncListDialog=true
+                    }else{
+                     
+                      this.syncListData={
+                        nodeNum:'',//同步节点数量
+                        nodeNumEnd:''//已同步数量
+                      }
+                      this.syncListDialog=false
+                    }
+                    
+                    }else{
+                      this.syncListDialog=false
+                      this.syncListData={
+                        nodeNum:'',//同步节点数量
+                        nodeNumEnd:''//已同步数量
+                      }
+                      this.$message.error(res.data.msg)
+                    }
+        });
+    },
+    //基础数据管理
+    handleBasicClick(command) {
+    
+      if (command === "code") {
+        this.codeDialog = true;
+      
+        this.$refs.codeSetRef.show(this.projectid)
+      }else if(command === "rule") {
+          this.$router.push({
+            path: "/rule/manager",
+            query: {
+              id: this.id,
+              parentId:this.nodeDetail.parentId,
+              tenant_id: this.userInfo.tenant_id,
+              projectid: this.projectid,
+
+            },
+          
+          });
+
+      }
+    }
+  },
+  watch: {
+    "GLExcelFrom.search"(val) {
+      console.log(val);
+      if (this.exceldata) {
+        this.$refs.tree.filter(val);
+      }
+    },
+    'syncForm.contractRange': {
+    handler(newVal) {
+      if (newVal && newVal.length) {
+        const selectedValues = newVal.map(key => {
+          const item = this.checkIdList.find(item => item.dictKey === key);
+          return item ? item.dictValue : key;
+        });
+        this.syncForm.contractRangeName = selectedValues.join(',');
+      } else {
+        this.syncForm.contractRangeName = '';
+      }
+    },
+    immediate: true
+  },
+  'syncForm.templateId': {
+    handler(newVal) {
+ 
+      if (newVal && newVal.length) {
+          for (let index = 0; index < this.templateIdList.length; index++) {
+            const elemet = this.templateIdList[index];
+            if(elemet.id==newVal){
+              this.syncForm.templateName = elemet.name;
+              break
+            }
+          }
+
+          } else {
+            this.syncForm.rangeName = '';
+          }
+    },
+    immediate: true
+  },
+    'syncForm.type': {
+      handler(newVal) {
+        if (newVal && newVal.length) {
+            const selectedValues = newVal.map(key => {
+              const item = this.typeOptions.find(item => item.dictKey === key);
+              return item ? item.dictValue : key;
+            });
+            this.syncForm.typeName = selectedValues.join(',');
+          } else {
+            this.syncForm.typeName = '';
+          }
+      },
+      immediate: true
+    },
+    'syncForm.range': {
+      handler(newVal) {
+        console.log(newVal,'newVal');
+        
+        if (newVal && newVal.length) {
+          for (let index = 0; index < this.rangeOptions.length; index++) {
+            const elemet = this.rangeOptions[index];
+            if(elemet.dictKey==newVal){
+              this.syncForm.rangeName = elemet.dictValue;
+              break
+            }
+          }
+
+          } else {
+            this.syncForm.rangeName = '';
+          }
+      },
+      immediate: true
+    },
+  },
+  components: {
+    dynamicExcel,
+    ManualSorting,
+    FormulaEdit,
+    EditElement,
+    FormulaEditone,
+    CodeSet
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.font-s-12 ::v-deep .iconfont {
+  font-size: 12px;
+}
+.el-popper[x-placement^="bottom"] {
+  margin-top: -6px;
+}
+.right-btn {
+  position: absolute;
+  right: 20px;
+  top: 10px;
+  font-size: 20px;
+}
+.custom-tree-node {
+  .normal-black {
+    display: none;
+  }
+  &:hover {
+    .normal-black {
+      display: inline-block;
+    }
+  }
+  &.show .normal-black {
+    display: inline-block;
+  }
+}
+.excelBox {
+  ::v-deep .el-dialog__body {
+    padding: 20px;
+  }
+}
+//调整表单样式
+.excelHtml {
+  position: absolute;
+  z-index: 999999;
+  top: 50px;
+  left: 0px;
+  width: 100%;
+  height: 100%;
+}
+.jiedian {
+  ::v-deep .el-dialog__body {
+    padding: 10px 20px !important;
+  }
+}
+.filter-tree {
+  min-width: 100%;
+  display: inline-block;
+}
+
+.full-dialog {
+  ::v-deep .el-dialog__body {
+    padding-bottom: 0;
+    padding-top: 0;
+  }
+
+  ::v-deep .basic-container {
+    height: calc(100vh - 60px);
+  }
+}
+.my-basic-con {
+  padding: 6px 6px;
+}
+// 树形控件菜单样式
+.contextmenu {
+  margin: 0;
+  background: #fff;
+  z-index: 1000;
+  position: fixed; //关键样式设置固定定位
+  list-style-type: none;
+  padding: 5px 0;
+  border-radius: 4px;
+  font-size: 12px;
+  font-weight: 400;
+  color: #333;
+  box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+}
+.contextmenu li {
+  margin: 0;
+  padding: 7px 16px;
+  cursor: pointer;
+}
+.contextmenu li:hover {
+  background: #eee;
+}
+.selectBtn {
+  position: absolute;
+  top: 50px;
+  right: 585px;
+  z-index: 1000;
+  width: 140px;
+  text-align: left;
+}
+.titlerow {
+  // float: right;
+  background-color: rgba(31, 34, 41, 0.8);
+  // width:104%;
+  padding-left: 10px;
+  padding-right: 10px;
+  text-align: right;
+  margin-top: -20px;
+  margin-left: -20px;
+  margin-right: -20px;
+}
+.dialog-title{
+  display: flex;
+}
+.dialog-title-text{
+  flex: 0.4;
+  padding-left: 10px;
+}
+.dialog-title-tip{
+  flex: 0.6;
+  // position: absolute;
+    color:rgba(255, 125, 67, 1); 
+    padding-left: 40px;
+  //  right: 60px;
+  }
+.sync-container{
+  margin-top: -30px;
+  display: flex;
+  height: 570px;
+  .box-card-1{
+   margin-right: 10px;
+   height: 100%;
+   overflow-y: auto;
+  }
+  .box-card-2{
+  flex: 1;
+    height: 100%;
+    overflow-y: auto;
+    .el-form-item {
+        border: 1px solid #dcdfe6;
+        padding: 0 10px 10px 10px;
+        border-radius: 4px;
+        font-weight: bold;
+         .el-form-item__label {
+          font-weight: bold;
+          padding-bottom: 0px;  
+        }
+        .el-form--label-top .el-form-item__label{
+          padding: 0px !important;
+        }
+      }
+    
+  }
+}
+.content-box{
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  font-weight: bolder;
+  .mt-14{
+    margin-top: 14px;
+  }
+}
+</style>
+
+<style lang="scss">
+.el-dialog.hc-link-nodes-dialog {
+  width: 500px;
+  margin-top: 50px !important;
+  height: calc(100% - 100px);
+  .el-dialog__body {
+    height: calc(100% - 154px);
+    border-top: 1px solid #eee;
+    border-bottom: 1px solid #eee;
+    padding: 14px;
+    overflow: auto;
+  }
+}
+.el-tree.hc-link-nodes-tree .el-tree-node .el-tree-node__content {
+  .el-checkbox {
+    display: none;
+  }
+  .is-leaf + .el-checkbox {
+    display: inline-block;
+  }
+}
+.warning-text{
+  color: orange;
+  font-weight: bold;
+}
+.orange {
+  color: orange;
+}
+.box-card-2{
+  .el-form-item {
+  .el-form-item__content {
+    line-height: 10px !important;
+    margin-top: -10px !important;
+  }
+}
+}
+</style>

+ 363 - 140
src/views/manager/projectinfo/tree.vue

@@ -69,15 +69,42 @@
           </div>
         </el-col>
       </el-row>
-      <el-row :gutter="20" class="h-100p" style="padding: 10px">
-        <el-col :span="8" style="height: 85%">
+      <el-row :gutter="20" style="padding: 10px;height: calc(100vh - 200px);">
+        <el-col :span="8" style="height: 100%">
           <div class="h-100p flex flex-d-c">
-               <p style="margin-top: 2px">
               工程节点信息
-                <el-button
+            <div
+              class="flex"
+              style="align-items: center; justify-content: space-between;margin-top: 10px;margin-bottom: 10px"
+            >
+            <div  style="flex:1;margin-right: 5px;">
+                <el-input placeholder="请输入" v-model="filterText" class="w-100p" size="mini"  v-if="isNodeType" clearable>
+                  <el-select v-model="searchType" slot="prepend" placeholder="请选择" v-if="isNodeType" style="width: 70px">
+                    <el-option label="节点" value="1"></el-option>
+                    <el-option label="表名" value="2"></el-option>
+                  </el-select>
+                 
+                </el-input>
+               <el-input placeholder="请输入" v-model="filterText1" class="w-100p" size="mini"  v-else clearable>
+                </el-input>
+                   
+               
+              </div>
+          
+             
+              <el-button type="primary" @click="searchTreeClick" v-if="isNodeType" size="mini" 
+                >搜索</el-button
+              >
+                 <el-button type="primary" @click="searchTreeClick1"  v-else size="mini" 
+                >搜索</el-button
+              >
+              <el-tooltip content="查询工序节点无内业资料类型" placement="top">
+                <el-button type="success" @click="filterSearchClick"  v-if="isNodeType" size="mini">筛选</el-button>
+              </el-tooltip>
+              <el-button
                 v-if="isNodeType"
                 style="margin-right: 10px"
-                size="medium"
+                size="mini"
                 icon="el-icon-set-up"
                 @click="changeType(false)"
                 type="primary"
@@ -86,52 +113,12 @@
               <el-button
               v-else
                 style="margin-right: 10px"
-                size="medium"
+               size="mini"
                 icon="el-icon-set-up"
                 @click="changeType(true)"
                 type="warning"
                 >切换节点
               </el-button>
-            </p>
-            <div
-              class="flex"
-              style="align-items: center; justify-content: space-between"
-            >
-            <div v-if="isNodeType">
-               <div>
-                 <el-radio v-model="searchType" label="1">节点</el-radio>
-               </div>
-                <div>
-                  <el-radio v-model="searchType" label="2">表名</el-radio>
-                </div>
-            </div>
-              <el-input
-              v-if="isNodeType"
-                placeholder="输入关键字进行过滤"
-                v-model="filterText"
-                clearable
-                style="width: 65%; margin-right: 15px"
-                @clear="clearSearch"
-              ></el-input>
-             
-              <el-button type="primary" @click="searchTreeClick" v-if="isNodeType"
-                >搜索</el-button
-              >
-               <el-input
-               v-if="!isNodeType"
-                placeholder="输入关键字进行过滤"
-                v-model="filterText1"
-                clearable
-                style="width: 65%; margin-right: 15px"
-                @clear="clearSearch1"
-              ></el-input>
-             
-              <el-button type="primary" @click="searchTreeClick1"  v-if="!isNodeType"
-                >搜索</el-button
-              >
-              <el-tooltip content="查询工序节点无内业资料类型" placement="top">
-                <el-button type="success" @click="filterSearchClick"  v-if="isNodeType">过滤</el-button>
-              </el-tooltip>
             </div>
             <div class="flex1 ov-hidden" v-if=isNodeType>
               <el-scrollbar class="h-100p" v-if="isShowTree">
@@ -251,7 +238,7 @@
               </el-scrollbar>
             </div>
             <div v-else  class="flex1 ov-hidden">        
-              <el-scrollbar class="h-100p" >
+              <el-scrollbar >
               
               <el-tree
              
@@ -297,27 +284,48 @@
                   label="节点类型"
                   width="180"
                 ></el-table-column>
-                <el-table-column
+                 <el-table-column
                   align="center"
-                  prop="parentName"
-                  label="上级节点"
+                  prop="majorDataType"
+                  :formatter="formMajorType"
+                  label="内业资料类型"
                 ></el-table-column>
+               
                 <el-table-column
                   align="center"
-                  prop="primaryKeyId"
-                  label="primaryKeyId"
-                ></el-table-column>
+                  prop="isAddConceal"
+                  label="新增时是否隐藏"
+                >
+                  <template slot-scope="scope">{{ scope.row.isAddConceal ===1?'是':'否' }}</template>
+              </el-table-column>
                 <el-table-column
                   align="center"
-                  prop="id"
-                  label="id"
+                  prop="updateUser"
+                  label="修改人"
                 ></el-table-column>
-                <el-table-column
+               <el-table-column
                   align="center"
-                  prop="majorDataType"
-                  :formatter="formMajorType"
-                  label="内业资料类型"
+                  prop="updateTime"
+                  label="修改时间"
                 ></el-table-column>
+                <el-table-column label="操作"   width="150"   >
+                  <template slot-scope="scope">
+                    <el-link
+                      size="mini"
+                      type="primary"
+                      class="mg-r-10"
+                      @click="editNodeHandle"
+                      >编辑
+                    </el-link>
+                  <el-link
+                      size="mini"
+                      type="primary"
+                      >节点编辑台账
+                    </el-link>
+                  
+                   
+                  </template>
+                </el-table-column>
               </el-table>
             </div>
             <div class="flex jc-sb">
@@ -342,87 +350,278 @@
               </p>
               <div class="mg-t-10"></div>
             </div>
-            <div style="flex: 1; position: relative">
-              <el-table
-                :data="formData"
-                border
-                height="100%"
-                style="width: 100%; position: absolute"
-              >
-                <el-table-column
-                  align="center"
-                  prop="tableName"
-                  label="表单名称"
-                ></el-table-column>
-                <el-table-column
-                  align="center"
-                  prop="elementTotal"
-                  width="80"
-                  label="字段总量"
-                ></el-table-column>
-                <el-table-column
-                  align="center"
-                  prop="fillRate"
-                  width="80"
-                  label="填报率"
-                ></el-table-column>
-                <el-table-column
-               
-                  align="center"
-                  prop="tableType"
-                  :formatter="formatTableType"
-                  width="100"
-                  label="表单类型"
-                ></el-table-column>
-                
-                <el-table-column width="150" 
-                  align="center"
-                  prop="tableOwner"
-                  :formatter="formatOwner"
-                  label="所属方"
-                ></el-table-column>
-                
-                <el-table-column label="操作"      >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="mini"
-                     
-
-                      @click="handlePreview(scope.$index, scope.row)"
-                      >预览
-                    </el-button>
-                    <el-button
-                      size="mini"
-                      @click="handleEdit(scope.$index, scope.row)"
-                      >编辑
-                    </el-button>
-                    <el-button
-                      size="mini"
-                      type="success"
-                      v-throttle="3000"
-                      v-show="scope.row.status == 0"
-                      @click="hideMD(scope.row)"
-                      >取消隐藏
-                    </el-button>
-                    <el-button
-                      size="mini"
-                      type="primary"
-                      v-throttle="3000"
-                      v-show="scope.row.status == 1"
-                      @click="hideMD(scope.row)"
-                      >隐藏表单
-                    </el-button>
-                    <el-button
-                    v-if="isNodeType"
-                      size="mini"
-                      type="danger"
-                      @click="handleDelete(scope.$index, scope.row)"
-                      >删除
-                    </el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
+                 <div style="flex: 1; position: relative">
+                        <!-- 施工方分类 -->
+                        <div class="category-section" v-if="formData.length > 0">
+                            <div class="category-header">施工方</div>
+                            <el-table
+                                :data="formData"
+                                border
+                                style="width: 100%"
+                            >
+                                <el-table-column
+                                    align="center"
+                                    prop="tableName"
+                                    label="表单名称"
+                                ></el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="tableType"
+                                    :formatter="formatTableType"
+                                    label="表单类型"
+                                ></el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="fillRate"
+                                    label="填报率"
+                                ></el-table-column>
+                                <el-table-column
+                                    label="是否关联清表"
+                                    prop="isLinkTable"
+                                    align="center"
+                                >
+                                    <template slot-scope="scope">
+                                        <span v-if="scope.row.isLinkTable == 2">是</span>
+                                        <span v-else>否</span>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="tableOwner"
+                                    :formatter="formatOwner"
+                                    label="所属方"
+                                ></el-table-column>
+                                <el-table-column label="操作" align="center" width="500">
+                                    <template slot-scope="scope">
+                                        <el-link type="primary" @click="Associationlist(scope)"
+                                            >关联清表
+                                        </el-link>
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            :disabled="
+                                                scope.row.excelId == -1 || scope.row.excelId == null
+                                            "
+                                            @click="
+                                                rightClick(
+                                                    scope.row.pkeyId,
+                                                    scope.row.excelId,
+                                                    scope.row.id,
+                                                    scope.row.initTableName,
+                                                    scope.row.initTableId
+                                                )
+                                            "
+                                            >编辑元素
+                                        </el-link>
+                                
+                                    
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            :disabled="
+                                                scope.row.excelId == -1 || scope.row.excelId == null
+                                            "
+                                            @click="adjustExcel(scope.row.pkeyId, scope.row.excelId)"
+                                            >调整表单
+                                        </el-link>
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            @click="handleEditFormula(scope.$index, scope.row)"
+                                            >编辑元素公式
+                                        </el-link>
+
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="danger"
+                                            @click="handleDelete(scope.$index, scope.row)"
+                                            >删除表单
+                                        </el-link>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                        </div>
+                        
+                        <!-- 监理方分类 -->
+                        <div class="category-section" v-if="formData.length > 0">
+                            <div class="category-header">监理方</div>
+                            <el-table
+                                :data="formData"
+                                border
+                                style="width: 100%"
+                            >
+                                <el-table-column
+                                    align="center"
+                                    prop="tableName"
+                                    label="表单名称"
+                                ></el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="tableType"
+                                    :formatter="formatTableType"
+                                    label="表单类型"
+                                ></el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="fillRate"
+                                    label="填报率"
+                                ></el-table-column>
+                                <el-table-column
+                                    label="是否关联清表"
+                                    prop="isLinkTable"
+                                    align="center"
+                                >
+                                    <template slot-scope="scope">
+                                        <span v-if="scope.row.isLinkTable == 2">是</span>
+                                        <span v-else>否</span>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="tableOwner"
+                                    :formatter="formatOwner"
+                                    label="所属方"
+                                ></el-table-column>
+                                <el-table-column label="操作" align="center" width="500">
+                                    <template slot-scope="scope">
+                                        <el-link type="primary" @click="Associationlist(scope)"
+                                            >关联清表
+                                        </el-link>
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            :disabled="
+                                                scope.row.excelId == -1 || scope.row.excelId == null
+                                            "
+                                            @click="
+                                                rightClick(
+                                                    scope.row.pkeyId,
+                                                    scope.row.excelId,
+                                                    scope.row.id,
+                                                    scope.row.initTableName,
+                                                    scope.row.initTableId
+                                                )
+                                            "
+                                            >编辑元素
+                                        </el-link>
+                                    
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            :disabled="
+                                                scope.row.excelId == -1 || scope.row.excelId == null
+                                            "
+                                            @click="adjustExcel(scope.row.pkeyId, scope.row.excelId)"
+                                            >调整表单
+                                        </el-link>
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            @click="handleEditFormula(scope.$index, scope.row)"
+                                            >编辑元素公式
+                                        </el-link>
+
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="danger"
+                                            @click="handleDelete(scope.$index, scope.row)"
+                                            >删除表单
+                                        </el-link>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                        </div>
+                        
+                        <!-- 其他分类 -->
+                        <div class="category-section" v-if="formData.length > 0">
+                            <div class="category-header other-category">其他</div>
+                            <el-table
+                                :data="formData"
+                                border
+                                style="width: 100%"
+                            >
+                                <el-table-column
+                                    align="center"
+                                    prop="tableName"
+                                    label="表单名称"
+                                ></el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="tableType"
+                                    :formatter="formatTableType"
+                                    label="表单类型"
+                                ></el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="fillRate"
+                                    label="填报率"
+                                ></el-table-column>
+                                <el-table-column
+                                    label="是否关联清表"
+                                    prop="isLinkTable"
+                                    align="center"
+                                >
+                                    <template slot-scope="scope">
+                                        <span v-if="scope.row.isLinkTable == 2">是</span>
+                                        <span v-else>否</span>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                    align="center"
+                                    prop="tableOwner"
+                                    :formatter="formatOwner"
+                                    label="所属方"
+                                ></el-table-column>
+                                <el-table-column label="操作" align="center" width="500">
+                                    <template slot-scope="scope">
+                                        <el-link type="primary" @click="Associationlist(scope)"
+                                            >关联清表
+                                        </el-link>
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            :disabled="
+                                                scope.row.excelId == -1 || scope.row.excelId == null
+                                            "
+                                            @click="
+                                                rightClick(
+                                                    scope.row.pkeyId,
+                                                    scope.row.excelId,
+                                                    scope.row.id,
+                                                    scope.row.initTableName,
+                                                    scope.row.initTableId
+                                                )
+                                            "
+                                            >编辑元素
+                                        </el-link>
+                                    
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            :disabled="
+                                                scope.row.excelId == -1 || scope.row.excelId == null
+                                            "
+                                            @click="adjustExcel(scope.row.pkeyId, scope.row.excelId)"
+                                            >调整表单
+                                        </el-link>
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="primary"
+                                            @click="handleEditFormula(scope.$index, scope.row)"
+                                            >编辑元素公式
+                                        </el-link>
+
+                                        <el-link
+                                            class="mg-l-10"
+                                            type="danger"
+                                            @click="handleDelete(scope.$index, scope.row)"
+                                            >删除表单
+                                        </el-link>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                        </div>
+                    </div>
           </template>
           <template v-if="leftType == 4">
             <div style="flex: 1; position: relative">
@@ -561,6 +760,7 @@
         <basic-container>
           <div class="flex h-100p flex-d-c">
             <div style="flex: 1; position: relative">
+              
               <el-table
                 :data="formData"
                 border
@@ -5916,6 +6116,17 @@ async saveLinkTab() {
           });
 
       }
+    },
+    //表单配置
+    handleCommandRow(command,row){
+      if(command=='a'){
+        this. rightClick( row.pkeyId,row.excelId, row.id,row.initTableName, row.initTableId)                                        
+      }else if(command=='b'){
+        this.adjustExcel(row.pkeyId, row.excelId)
+      }else if(command=='c'){
+        this.handleEditFormula(0, row)
+      }
+      
     }
   },
   watch: {
@@ -6197,4 +6408,16 @@ async saveLinkTab() {
   }
 }
 }
+  .category-section {
+            margin-bottom: 20px;
+        }
+        .category-header {
+            padding: 12px 20px;
+            background-color: #E8E8E8;
+       
+            margin: 15px 0;
+            font-weight: bold;
+            font-size: 16px;
+        }
+      
 </style>