duy 8 месяцев назад
Родитель
Сommit
9366513b74

+ 15 - 3
src/views/manager/contractinfo/detail.vue

@@ -80,7 +80,7 @@
               </el-row>
               <div class="flexBetween">
                 <el-form-item
-                  :style="contractForm.isTestModule === 1?'width:25%;':'width:50%;'"
+                 
                   :label="isShowDq?'是否开启电签':'认证设置'"
                   prop="isElectronicSignature"
                 >
@@ -89,8 +89,17 @@
                     <el-radio :label="1">开启</el-radio>
                   </el-radio-group>
                 </el-form-item>
+                <!-- <el-form-item
+                    label="模板引用"
+                    prop="isQute"
+                  >
+                    <el-radio-group v-model="contractForm.isQute">
+                      <el-radio :label="1">模板节点</el-radio>
+                      <el-radio :label="2">底层节点</el-radio>
+                    </el-radio-group>
+                  </el-form-item> -->
                 <el-form-item
-                  :style="contractForm.isTestModule === 1?'width:25%;':'width:50%;'"
+                  
                   label="是否开启试验模块"
                   prop="isTestModule"
                 >
@@ -100,7 +109,7 @@
                   </el-radio-group>
                 </el-form-item>
                 <el-form-item
-                  style="width:50%;"
+             
                   label="是否强制引用记录/报告编号:"
                   prop="isTestRecord"
                   v-if="contractForm.isTestModule === 1"
@@ -958,6 +967,9 @@ export default {
         ],
         contractAmount: [
           {validator: checkIsNumber, trigger: 'blur'}
+        ],
+        isQute: [
+          { required: true, message: '请选择模板引用', trigger: 'blur' },
         ]
       },
 

+ 19 - 2
src/views/manager/projectinfo/detail.vue

@@ -206,6 +206,15 @@
                     </el-radio-group>
                   </el-form-item>
                 </el-col>
+                <!-- <el-form-item
+                    label="模板引用"
+                    prop="isQute"
+                  >
+                    <el-radio-group v-model="projectForm.isQute">
+                      <el-radio :label="1">模板节点</el-radio>
+                      <el-radio :label="2">底层节点</el-radio>
+                    </el-radio-group>
+                  </el-form-item> -->
               </el-row>
             </el-form>
           </div>
@@ -602,6 +611,9 @@ export default {
         ],
         remarkType: [
             { required: true, message: '请选择电签类别', trigger: 'blur' },
+        ],
+        isQute: [
+          { required: true, message: '请选择模板引用', trigger: 'blur' },
         ]
 
       },
@@ -1125,6 +1137,7 @@ export default {
       }
 
       this.leftloading = true;
+      this.rightloading = true;
       if (value&&value.toString().indexOf(',') >= 0) {
         console.log('私有库');
          //私有库
@@ -1149,6 +1162,7 @@ export default {
             this.leftTreeData = [];
           }
           this.leftloading = false;
+          this.rightloading = false;
         })
           this.getRightTree()
       } else {
@@ -1284,6 +1298,7 @@ export default {
     treeChang () {
      let recordid= this.formatWbsId(this.wbsId)
      console.log(recordid,'recordid');
+     this.rightloading = true;
       if (this.templateType===2) {
         this.rightTreeData=this.$refs.treetotree.rightTreeData;
         // this.rightObj.push({
@@ -1310,7 +1325,7 @@ export default {
           this.rightObj1.objdata=this.rightTreeData1
         
       }
-    
+      this.rightloading = false;
       this.typeChang[2] = true;
     },
 
@@ -1823,7 +1838,9 @@ export default {
          
 
             // findProjectTree(this.projectForm.id,  this.templateType === 1 ? WbsId : this.selectData.referenceWbsTemplateIdTrial).then((res) => {
+              this.rightloading = true;
             findProjectTree(this.projectForm.id, WbsId).then((res) => {
+              this.rightloading = false;
               if (this.rightTreeData.length>0&&this.templateType===2&&this.rightObj.wbsId==WbsId) {
                 this.$refs.treetotree.setRightTree(this.rightTreeData);
               }else if(this.rightTreeData1.length>0&&this.templateType===1&&this.rightObj1.wbsId==WbsId){
@@ -1856,7 +1873,7 @@ export default {
               }
       }
 
-      this.rightloading = false;
+      // this.rightloading = false;
     },
 
   }

+ 174 - 0
src/views/manager/projectinfo/tree.vue

@@ -7,6 +7,13 @@
             <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-button
               size="medium"
@@ -1794,6 +1801,120 @@
         >
       </span>
     </el-dialog>
+
+    文件题名全局配置
+    <el-dialog
+      title="文件题名全局配置"
+      :visible.sync="fileTitleVisible"
+      width="60%"
+      append-to-body
+      :close-on-click-modal="false"
+    >
+    <el-table
+    :data="fileTableData"
+    style="width: 100%;height: 500px;"
+    align="center"
+    >
+ 
+    <el-table-column
+      label="文件题名规则"
+      prop="roleNameVal">
+      <template #default="scope">
+        <el-select
+           v-if="scope.row.isEdit1"
+            v-model="scope.row.ruleName"
+            multiple
+            placeholder="请选择"
+            style="width: 240px"
+            @change="changeRoleName($event,scope.row)"
+          >
+          <el-option
+              v-for="item in nodeTypelist"
+              :key="item.id"
+              :label="item.dictValue"
+              :value="item.dictValue"
+            ></el-option>
+          </el-select>
+       <span v-else>
+        <el-tag  v-for="item in scope.row.roleNameVal" style="margin-right: 2px;">{{ item }}</el-tag>
+      </span>
+      </template>
+
+
+    </el-table-column>
+    <el-table-column
+      label="文件题名范围"
+      prop="ruleSizeVal">
+    
+      <template #default="scope">
+        <el-link type="warning" @click="chooseFile(scope.$index, scope.row)"  v-if="scope.row.isEdit1">选择题名范围</el-link>
+        <span v-else>{{ scope.row.ruleSizeVal }}</span>
+      </template>
+    </el-table-column>
+    <el-table-column
+      align="right">
+      <template slot="header" slot-scope="scope">
+        <div class="flexEnd">
+          <i
+            class="el-icon-circle-plus "
+            style="font-size: 24px; color: rgb(37, 193, 99); cursor: pointer"
+            @click="addRow"
+          ></i>
+         
+        </div>
+      </template>
+      <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>
+    </el-dialog>
+    <!-- 选择题名范围i -->
+    <el-dialog
+    :visible.sync="chooseFileVisible"
+    title="选择题名范围"
+    width="500"
+    align-center
+    append-to-body
+  >  
+  <el-scrollbar class="h-100p" style="height: 400px;">
+    <el-tree
+    lazy
+    :load="loadNode"
+    :props="defaultProps"
+    :expand-on-click-node="false"
+    highlight-current
+    node-key="id"
+    show-checkbox
+    @check="checkFileSize"
+     :default-checked-keys="deCheckTreeKeys"
+
+  >
+   </el-tree>
+  </el-scrollbar>
+
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button>取消</el-button>
+        <el-button type="primary" @click="saveFileSize">
+          保存
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
   </div>
 </template>
 
@@ -2170,6 +2291,14 @@ export default {
       editEleTableloading: false,
       dynamicDictList: [],
       saveLoading: false,
+      fileTitleVisible:false,
+      deCheckTreeKeys:[],
+      fileTableData:[
+        {roleNameVal:['子单位工程'],ruleSizeVal:'单位工程1'}
+      ],
+      chooseFileVisible:false,
+      chooseFileRow: {},
+      chooseFileIndex: -1,
     };
   },
   computed: {
@@ -4194,6 +4323,51 @@ export default {
         });
       }
     },
+    //文件题名(全局按钮)
+    fileTitleHandle(){
+      this.fileTitleVisible = true;
+    
+    },
+    //选择题名范围
+    chooseFile(index,row){
+      this.chooseFileVisible = true;
+      this.chooseFileIndex= index;
+      this.deCheckTreeKeys=[]
+    
+    },
+    checkFileSize(data,{checkedNodes}){
+      let checkedTitles = checkedNodes.map(node => node.title).join('、');
+      this.fileTableData[this.chooseFileIndex].ruleSizeVal=checkedTitles
+      this.fileTableData[this.chooseFileIndex].isEdit1=false
+
+    
+   
+      
+    },
+    saveFileSize(){
+      this.chooseFileVisible = false;
+      
+
+    },
+    editRow(index,row){
+      this.$set(row, "isEdit", true);
+      this.$set(row, "isEdit1", true);
+    },
+    saveRow(index,row){
+      this.$set(row, "isEdit", false);
+      this.$set(row, "isEdit1", false)
+    },
+    changeRoleName(data,row){
+      this.$set(row, "roleNameVal", data);
+      
+    },
+    addRow(){
+      this.fileTableData.unshift({isEdit:true,isEdit1:true,})
+    },
+    delRow(index,row){
+      this.fileTableData.splice(index,1)
+    }
+
   },
   watch: {
     "GLExcelFrom.search"(val) {

+ 9 - 6
src/views/manager/projectinfo/treeTemplate/dynamicExcel.vue

@@ -35,7 +35,7 @@
         <span v-else-if="type.prop==='tab2'">
           <electronicSignature :pkeyId1='pkeyId' :htmlData1="htmlData" :excelId="excelId" :times="timesTimeElement" @edit="signatureEdit" @timeFocus="timeElementFocus"/>
         </span>
-        <span v-else-if="type.prop==='tab3'"> <setFormula :pkeyId1='pkeyId' :htmlData1="htmlData"/> </span>
+        <span v-else-if="type.prop==='tab3'"> <setFormula :pkeyId1='pkeyId' :htmlData="htmlData"/> </span>
         <span v-else-if="type.prop==='tab4'"> <editDefault :pkeyId1='pkeyId' :htmlData1="htmlData"/> </span>
         <span v-else-if="type.prop==='tab5'"> <promptSettings :pkeyId1='pkeyId' :htmlData1="htmlData"/> </span>
       </div>
@@ -73,10 +73,13 @@ export default {
 
           label: '电签位置配置',
           prop: 'tab2',
-        }, {
-          label: '设置公式开放条件',
-          prop: 'tab3',
-        }, {
+        },
+        //  {
+        //   label: '参数设置',
+        //   prop: 'tab3',
+        // }
+        // ,
+         {
 
           label: '编辑默认信息',
           prop: 'tab4',
@@ -306,7 +309,7 @@ export default {
           // eslint-disable-next-line no-empty
         } catch {
         }
-        console.log('keyname', keyname)
+        console.log('keyname1111111111111', keyname)
         this.htmlData.keyname = keyname
         if (target.getAttribute('trindex') !== null && target.getAttribute('tdindex') || target1.getAttribute('trindex') !== null && target1.getAttribute('tdindex')) {
           let tdEle = this.getParentTD(target);

+ 153 - 73
src/views/manager/projectinfo/treeTemplate/template/setFormula.vue

@@ -1,87 +1,167 @@
 <template>
-  <div class="setFormula">
-    <el-select
-      v-model="value"
-      clearable
-      placeholder="请选择"
-    >
-      <el-option
-        v-for="item in options"
-        :key="item.value"
-        :label="item.label"
-        :value="item.value"
-      >
-      </el-option>
-    </el-select>
-    <div class="martop15 maoshu">
-      22
-    </div>
-    <div
-      style="float:right"
-      class="martop20 flexColumn marright10 switch"
-    >
-      <el-switch
-        v-model="value1"
-        inactive-color="#ADBCF9"
-        inactive-text="默认开放"
-      >
-      </el-switch>
-      <el-switch
-        class="martop10"
-        v-model="value1"
-        inactive-color="#00E065"
-        inactive-text="VIP开放"
-      >
-      </el-switch>
-    </div>
-    <div
-      style="width:100%;"
-      class="flexEnd martop20"
-    >
-      <el-button
-        class="martop15"
-        type="info"
-        size="mini"
-      >保存设置</el-button>
+  <div>
+    <div class="setInputcss">
+      <el-row :span="24">
+        <el-col :span="3.3" style="line-height: 40px">
+          元素坐标:
+        </el-col>
+        <el-col :span="18">
+          <avue-input v-model="htmlData.name" placeholder="请输入内容" :disabled='true'></avue-input>
+        </el-col>
+      </el-row>
+      <el-row :span="24">
+        <el-col :span="3.3" style="line-height: 40px">
+          参数名称:
+        </el-col>
+        <el-col :span="18">
+          <el-select v-model="value" placeholder="请选择" style="width: 100%;">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.label">
+            </el-option>
+          </el-select>
+        </el-col>
+      </el-row>
+      <el-row style="text-align: right">
+          <el-button type="primary" size="small" icon="el-icon-circle-plus-outline" @click="addList">添加至列表</el-button>
+      </el-row>
+      <el-row style="margin-top: 15px;">
+        <el-table
+          :data="tableData"
+          border
+          style="width: 100%">
+          <el-table-column
+            fixed
+            prop="site"
+            label="元素位置"
+            width="150">
+          </el-table-column>
+          <el-table-column
+            prop="name"
+            label="参数名称"
+            width="120">
+          </el-table-column>
+          <el-table-column
+            prop="isGlobal"
+            label="是否全局参数"
+            width="120">
+          </el-table-column>
+          
+          <el-table-column
+            fixed="right"
+            label="操作"
+           >
+            <template slot-scope="scope">
+              <el-link @click="editClick(scope.$index,scope.row)" type="primary" size="small" style="margin-right: 4px;" v-if="!scope.row.isEdit">编辑</el-link>
+              <el-link @click="saveClick(scope.$index,scope.row)" type="primary" size="small" style="margin-right: 4px;" v-else>保存</el-link>
+              <el-link type="danger" size="small" @click="delRow(scope.$index,scope.row)">删除</el-link>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-row>
+      <el-row style="margin-top: 15px;text-align: right">
+        <el-button type="primary" size="small" icon="el-icon-circle-plus-outline" @click="saveType()">保存入库</el-button>
+      </el-row>
     </div>
+
   </div>
 </template>
 <script>
+import { dictionary, saveInput, getColByTabId } from "@/api/manager/AdjustForm";
+import { getExcelHtml } from '@/api/exctab/excelmodel'
+import { save } from "../../../../../api/certificate/list";
 export default {
-  props: ['pkeyId1', 'htmlData1'],
-  daat () {
+  props: ['pkeyId', 'htmlData'],
+  
+
+
+  data() {
     return {
       options: [{
-        value: '选项1',
-        label: '黄金糕'
-      }, {
-        value: '选项2',
-        label: '双皮奶'
-      }, {
-        value: '选项3',
-        label: '蚵仔煎'
-      }, {
-        value: '选项4',
-        label: '龙须面'
-      }, {
-        value: '选项5',
-        label: '北京烤鸭'
-      }],
-      value: '',
-      value1: true,
+          value: '选项1',
+          label: '黄金糕'
+        }, {
+          value: '选项2',
+          label: '双皮奶'
+        }, {
+          value: '选项3',
+          label: '蚵仔煎'
+        }, {
+          value: '选项4',
+          label: '龙须面'
+        }, {
+          value: '选项5',
+          label: '北京烤鸭'
+        }],
+        value: '',
+        tableData: []
+    }
+  },
+  methods: {
+    addList() {
+        try {
+          // 检查关键字段是否存在
+          if (!this.htmlData || !this.htmlData.keyname || this.value === undefined) {
+            console.error('缺少必要的数据字段');
+            return;
+          }
+          // 使用常量定义 isGlobal 的值
+          const IS_GLOBAL = '是';
+          // 提前声明变量以提高可读性
+          const keyname = this.htmlData.keyname;
+          const site = this.htmlData.name;
+          const name = this.value;
+          // 检查 keyname 是否已存在于 tableData 中
+          const isKeynameExists = this.tableData.some(item => item.keyname === keyname);
+          if (isKeynameExists) {
+            this.$message.warning('已存在相同的关键字段,请勿重复添加');
+            return;
+          }
+
+          // 插入新数据到表格
+          this.tableData.push({
+            site,
+            name,
+            isGlobal: IS_GLOBAL,
+            keyname
+          });
+
+        } catch (error) {
+          console.error('插入数据时发生错误:', error);
+        }
+      },
+        editClick(index,row){
+          this.tableData.forEach((ele) => {
+            this.$set(ele,"isEdit", false)
+          })
+          this.$set(row, "isEdit", true)
+          this.htmlData.name=row.site
+          this.value=row.name
+          
+        },
+        saveClick(index,row){
+          this.$set(row, "isEdit", false)
+          this.$set(row, "name", this.value)
+        },
+        delRow(index,row){
+          this.tableData.splice(index,1)
+        }
     }
   }
-}
 </script>
 <style lang="scss" scoped>
-.setFormula {
-  .maoshu {
-    border: 1px solid #c6c6c6;
-    border-radius: 5px;
-    padding: 15px 20px;
-  }
-  .switch :deep(.el-switch__label.is-active ){
-    width: 60px;
-  }
+.table {
+  margin-top: 20px;
+  border-radius: 5px;
+
+  color: #101010;
+  font-size: 14px;
+}
+
+.setInputcss {
+  width: 90%;
+  height: 100%;
 }
 </style>

+ 12 - 0
src/views/manager/wbsinfo.vue

@@ -41,6 +41,14 @@
           @click="handleElement"
         >元素库
         </el-button>
+        <!-- <el-button
+          size="small"
+          style="background-color:#2550A2;color:white;font-weight:bold"
+          plain
+          v-if="permission.wbsinfo_delete"
+          @click="handleParameter"
+        >参数库
+        </el-button> -->
       </template>
       <template
         slot-scope="{row,index}"
@@ -289,6 +297,10 @@ export default {
         }
       })
       //this.$router.push('/wbs/edit/' + row.id);
+    },
+    //点击参数库
+    handleParameter(){
+       this.$router.push('/wbs/parameter');
     }
   }
 };

+ 117 - 0
src/views/manager/wbsinfo/checkDetailEle.vue

@@ -0,0 +1,117 @@
+<template>
+
+<el-dialog
+    title="选择元素表"
+      :visible.sync="dialogVisible"
+      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 
+        ></el-input>
+        <el-button type="primary" 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 v-if="!scope.row.select" @click="selectElement(scope.row,scope.$index)"
+              type="primary"
+              >选择</el-link
+            >
+            <el-link
+           @click="canlSelect(scope.row,scope.$index)"
+              v-else
+              type="danger"
+              >取消选择</el-link
+            >
+          
+          </template>
+        </el-table-column>
+      </el-table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="confirmSelection">确定</el-button>
+      </span>
+    </el-dialog>
+</template>
+<script>
+import {getTableElments} from "@/api/manager/wbstree";
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      formulaInput:'',
+      editEleListFilter:[],
+      editEleListAll:[],
+      selectedDataValue:[]
+ 
+
+     
+    };
+  },
+  methods: {
+    show(id,selectedData) {
+      this.dialogVisible = true;
+      this.selectedDataValue = selectedData;
+        console.log(this.selectedDataValue,'this.selectedDataValue');
+        
+      getTableElments(id).then((res) => {
+        this.editEleListFilter = res.data.data;
+        this.editEleListAll = [].concat(this.editEleListFilter);
+        this.updateSelectStatus();
+      })
+      
+    },
+    updateSelectStatus() {
+      const selectedIds = new Set(this.selectedDataValue.map(item => item.id));
+      this.editEleListFilter.forEach(item => {
+        if (selectedIds.has(item.id)) {
+          item.select = true;
+        }
+      });
+    },
+         //搜索 筛选
+    searchFormulaName(){
+      this.editEleListFilter = this.editEleListAll.filter((ele)=>{
+        return ele.eName.indexOf(this.formulaInput) > -1;
+      })
+    },
+
+    selectElement(row,index){
+        // row.select =true
+        this.$set(row, "select", true)
+        console.log(row,'row');
+        
+    },
+    canlSelect(row,index){
+       
+        this.$set(row, "select", false)
+    },
+/**
+ * 确认用户选择的操作,并将选中的数据传递给父组件
+ */
+confirmSelection() {
+     // 过滤出 select 为 true 的数据
+     const selectedData = this.editEleListFilter.filter(item => item.select === true);
+     const combinedData = [...this.selectedDataValue, ...selectedData];
+    // 使用 Map 来过滤掉重复的 id
+    const uniqueData = Array.from(new Map(combinedData.map(item => [item.id, item])).values());
+    // 触发事件将选中的数据传递给父组件
+    this.$emit('confirm-selection', uniqueData);
+    this.dialogVisible = false;
+ 
+  }
+}
+}
+</script>

+ 211 - 0
src/views/manager/wbsinfo/checkEleDialog.vue

@@ -0,0 +1,211 @@
+<template>
+  <div>
+
+    <el-dialog :visible.sync="dialogVisible" title="选择元素" width="80%"  append-to-body >
+      <div class="dialog-content boxswai">
+                <div class="left-panel boxnei">
+                    <el-tree :load="loadNode" lazy :props="defaultProps" @node-click="handleNodeClick" node-key="id" :expand-on-click-node="false"
+                ></el-tree>
+                </div>
+       
+        <div class="right-panel ">
+        <div class="boxnei">
+            <div style="display:flex">
+                        <el-input placeholder="请输入你想搜索的表单名称" v-model="searchTitle"   clearable  >  </el-input>
+                        <el-button type="primary" icon="el-icon-search"  size="small" @click="onLoad">搜索</el-button>
+            </div>
+            <el-table :data="tableData" class="tableclass" v-loading="tabloading">
+                <el-table-column prop="title" label="元素表名称"></el-table-column>
+                <el-table-column prop="tabType" label="元素表类型" with="120"></el-table-column>
+                <el-table-column prop="elementTotal" label="元素总量"  width="80"></el-table-column>
+                <el-table-column prop="tabOwner" label="所属方"></el-table-column>
+                <el-table-column prop="fillRate" label="填报率" width="80"></el-table-column>
+                <el-table-column label="操作" width="80">
+                  <template slot-scope="scope">
+                    <el-link type="primary" @click="selectElement(scope.row)">选择元素</el-link>
+                  </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination
+              style="text-align: right;"
+              @size-change="handleSizeChange"
+              @current-change="handleCurrentChange"
+              :current-page="currentPage"
+              :page-sizes="[10, 20, 30, 40]"
+              :page-size="100"
+              layout="total, sizes, prev, pager, next, jumper"
+              :total="total">
+            </el-pagination>
+            <div class="bottom-box">
+              <el-tag type="info"  closable v-for="item in selectedData" :key="id" class="mr-5"   @close="handleClose(tag)">{{ item.eName }}</el-tag>
+            </div>
+          </div>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="confirmSelection">确定</el-button>
+      </span>
+    </el-dialog>
+   <checkDetailEle ref="checkDetailEleDialog"  @confirm-selection="handleConfirmSelection" ></checkDetailEle>
+  </div>
+</template>
+
+<script>
+import {tabTypeLazyTreeAll} from "@/api/manager/wbsprivate";
+import checkDetailEle from "./checkDetailEle.vue";
+export default {
+  components: {
+    checkDetailEle
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      defaultProps: {
+        children:'children',
+        label: 'title',
+        isLeaf: function (data) {
+          return !data.hasChildren || (data.isExistForm == 1);
+        },
+      },
+      tableData: [],
+      selectedElement: null,
+      currentPage:1,
+      treeId:'',
+      tabloading:false,
+      total:0,
+      page:{
+        currentPage:1,
+        pageSize:10,
+        total:0
+      },
+      searchTitle:'',
+      rowId:'',
+      selectedData:[]
+     
+    };
+  },
+  methods: {
+    show() {
+      this.dialogVisible = true;
+    },
+    async loadNode(node, resolve) {
+        const parentId = (node.level === 0) ? 12345678910 : node.data.id;
+        tabTypeLazyTreeAll({parentId,current:1,size:1000}).then(res => {
+            resolve(res.data.data.records.map(item => {
+                return {
+                ...item,
+                leaf: !item.hasChildren
+                }
+            }))
+        });
+    },
+    handleSizeChange(val) {
+        console.log(`每页 ${val} 条`);
+        this.page.currentPage=1;
+        this.page.pageSize=val
+        this.onLoad(this.page)
+
+    },
+    handleCurrentChange(val) {
+        console.log(`当前页: ${val}`);
+        this.page.currentPage=val;
+        this.page.pageSize=10
+        this.onLoad(this.page)
+    },
+    onLoad(page){
+        if(this.treeId){
+        this.tabloading=true;
+         this.tabTypeLazyTreeAll(this.treeId, page.currentPage,page.pageSize,this.searchTitle).then((res)=>{
+          this.tableData=res.records
+           this.total=res.total
+           this.tabloading=false
+        })
+      }
+    },
+    async tabTypeLazyTreeAll ( parentId,current,size,titleName) {//清表树
+      const { data: res } = await tabTypeLazyTreeAll({parentId,current,size,titleName}	)
+      if (res.code === 200) {
+        return res.data
+
+      }
+    },
+    handleNodeClick(data,node) {
+      console.log('节点被点击:', data);
+      this.treeId=data.id
+      // 根据节点数据更新表格数据
+      this.page.pageSize=10;
+      this.page.currentPage=1
+      if(data.hasChildren){
+        this.onLoad(this.page)
+      }
+      if(data.hasChildren===false&&node.level==2){
+           this.tabloading=true;
+          let arr=[]
+            arr.push(data)
+            this.tableData=arr
+            this.total=1
+            setTimeout(() => {
+              this.tabloading=false
+
+            }, 1000);
+      }else{
+           this.loadData=[]
+           this.total=0
+      }
+    },
+    selectElement(row) {
+      this.selectedElement = row;
+      this.$refs.checkDetailEleDialog.show(row.id,this.selectedData)
+      console.log('选择的元素:', row);
+    },
+    confirmSelection() {
+      if (this.selectedData) {
+        console.log('确认选择的元素:', this.selectedData);
+        this.$emit('confirmCheck', this.selectedData);
+        this.dialogVisible = false;
+      } else {
+        this.$message.warning('请选择一个元素');
+      }
+    },
+    handleConfirmSelection(selectedData) {
+      this.selectedData=selectedData
+      // 你可以在这里进行其他操作,比如更新状态、调用API等
+    },
+    handleClose(tag) {
+        this.selectedData.splice(this.selectedData.indexOf(tag), 1);
+      },
+  }
+};
+</script>
+
+<style scoped>
+
+.dialog-content {
+  display: flex;
+  height: 500px;
+}
+.left-panel {
+  width: 30%;
+  padding-right: 20px;
+
+  
+}
+.right-panel {
+  width: 70%;
+  margin-left:20px ;
+}
+.tableclass{
+    width: 100%;height: 60%;margin-bottom: 15px;overflow-y: auto;
+}
+.bottom-box{
+  width: 100%;
+  height: 20%;
+  border: 1px solid #DBDBDB;
+  margin-top: 10px;
+  padding: 5px;
+}
+.mr-5{
+  margin-right: 5px;
+}
+</style>

+ 249 - 0
src/views/manager/wbsinfo/paramDetail.vue

@@ -0,0 +1,249 @@
+<template>
+  <div>
+   
+    <!-- 弹窗 -->
+    <el-dialog :title="params.title" :visible.sync="dialogVisible" width="60%" append-to-body>
+      <div>
+        <!-- 搜索栏 -->
+        <div class="search-container">
+            <div>
+              <el-form :inline="true" :model="searchForm" class="demo-form-inline" size="small" >
+                  <el-form-item label="项目名称" prop="projectName">
+                      <el-select v-model="searchForm.projectName" placeholder="请选择项目名称" @change="changeProject" clearable >
+                          <el-option
+                          v-for="item in projectList"
+                          :key="item.id"
+                          :label="item.projectName"
+                          :value="item.id">
+                          </el-option>
+                      </el-select>
+                    </el-form-item>
+                    <el-form-item label="合同段" prop="contractSection">
+                      <el-select v-model="searchForm.contractSection" placeholder="请选择合同段" clearable >
+                          <el-option
+                          v-for="item in contractList"
+                          :key="item.id"
+                          :label="item.contractName"
+                          :value="item.id">
+                          </el-option>
+                      </el-select>
+                     </el-form-item>
+                      <el-form-item>
+                          <el-button type="primary" @click="onSearch">搜索</el-button>
+                      </el-form-item>
+              </el-form>
+          </div>
+
+          <!-- 新增按钮 -->
+          <div>
+            <el-button type="primary" @click="handleAdd" size="small" >新增</el-button>
+          </div>
+          
+        </div>
+
+        <!-- 表格 -->
+        <el-table :data="tableData" style="width: 100%">
+          <el-table-column type="index" label="序号" width="50"></el-table-column>
+          <el-table-column prop="elementName" label="元素名称"></el-table-column>
+          <el-table-column prop="isGlobal" label="是否全局参数"></el-table-column>
+          <el-table-column prop="projectName" label="项目名称"></el-table-column>
+          <el-table-column prop="contractSection" label="合同段"></el-table-column>
+          <el-table-column prop="creator" label="创始人"></el-table-column>
+          <el-table-column prop="createTime" label="创建时间"></el-table-column>
+          <el-table-column label="操作" width="150">
+            <template slot-scope="scope">
+              <el-link size="mini" @click="handleEdit(scope.$index, scope.row)"  type="primary" >编辑</el-link>
+              <el-link size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)"  class="mg-l-10">删除</el-link>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-dialog>
+
+    <!-- 新增弹窗 -->
+    <el-dialog title="元素新增" :visible.sync="addDialogVisible" width="30%" append-to-body>
+      <el-form :model="form" :rules="rules" ref="formRef">
+        <el-form-item label="元素名称" label-width="120px">
+          <el-input v-model="form.elementName" :disabled="form.selectedElement.length>0"></el-input>
+        </el-form-item>
+        <el-form-item label="选择元素" label-width="120px">
+            <el-button style="width: 100%;" @click="checkEle" v-if="form.selectedElement.length===0" :disabled="form.elementName.length>0">点击选择元素</el-button>
+            <div class="bottom-box" v-else @click="checkEle">
+              <el-tag type="info"  closable v-for="item in form.selectedElement" :key="id" class="mr-5"   @close="handleClose(tag)">{{ item.eName }}</el-tag>
+            </div>
+        </el-form-item>
+        <el-form-item label="是否全局参数" label-width="120px" prop="isGlobal">
+          <el-radio-group v-model="form.isGlobal">
+            <el-radio :label="true">是</el-radio>
+            <el-radio :label="false">否</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="合同段" prop="contractSection" v-if="form.isGlobal===false"  label-width="120px">
+                 
+                      <el-select v-model="form.projectName" placeholder="请选择项目" @change="changeProject" clearable style="width: 48%;">
+                          <el-option
+                          v-for="item in projectList"
+                          :key="item.id"
+                          :label="item.projectName"
+                          :value="item.id">
+                          </el-option>
+                      </el-select>
+                   
+                      <el-select v-model="form.contractSection" placeholder="请选择合同段" clearable style="width: 48%;margin-left: 5px;" multiple >
+                          <el-option
+                          v-for="item in contractList"
+                          :key="item.id"
+                          :label="item.contractName"
+                          :value="item.id">
+                          </el-option>
+                      </el-select>
+          </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="confirmAdd">确 定</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 选择元素弹窗 -->
+     <checkEleDialog ref="checkEleDialogRef" @confirmCheck="confirmCheck"></checkEleDialog>
+  </div>
+</template>
+
+<script>
+import checkEleDialog from './checkEleDialog.vue';
+import { getProjectList } from "@/api/manager/projectinfo";
+import { findContractByProjectId } from "@/api/manager/contractinfo";
+export default {
+    components:{
+        checkEleDialog
+    },
+    props:{
+            params:Object
+    },
+    watch: {
+      id: {
+        handler: function(n) {
+          this.params=n
+        },
+        deep: true,
+      },
+   },
+  data() {
+    return {
+      dialogVisible: false,
+      projectList: [],
+      contractList: [
+      ],
+      searchForm: {
+        projectName: '',
+        contractSection: '',
+        textSearch: ''
+      },
+      tableData: [
+        {
+          elementName: '元素1',
+          isGlobal: '是',
+          projectName: '项目A',
+          contractSection: '合同段1',
+          creator: '张三',
+          createTime: '2023-10-01'
+        },
+        {
+          elementName: '元素2',
+          isGlobal: '否',
+          projectName: '项目B',
+          contractSection: '合同段2',
+          creator: '李四',
+          createTime: '2023-10-02'
+        }
+      ],
+      addDialogVisible:false,
+      form: {
+        elementName: '',
+        selectedElement: [],
+        isGlobal: false
+      },
+      rules: {
+      
+        isGlobal: [
+          { required: true, message: '请选择是否全局参数', trigger: 'change' }
+        ]
+      }
+    };
+  },
+  methods: {
+    show() {
+      this.dialogVisible = true;
+      this.getProjectListData()
+    },
+    onSearch() {
+      // 实现搜索逻辑
+      console.log('搜索条件:', this.searchForm);
+    },
+    handleAdd() {
+      // 实现新增逻辑
+      console.log('新增');
+      this.addDialogVisible=true;
+    },
+    handleEdit(index, row) {
+      // 实现编辑逻辑
+      console.log('编辑:', index, row);
+      this.addDialogVisible=true;
+    },
+    handleDelete(index, row) {
+      // 实现删除逻辑
+      console.log('删除:', index, row);
+    },
+      //获取项目列表
+    getProjectListData() {
+        getProjectList(1, 999).then((res) => {
+          this.projectList = res.data.data.records;
+        });
+    },
+    changeProject(val){
+ 
+         //根据项目id获取合同段列表
+         findContractByProjectId(val).then((res) => {
+            this.contractList = res.data.data;
+       
+    
+          });
+    },
+    confirmAdd(){
+
+    },
+    //选择元素
+    checkEle(){
+      this.$refs.checkEleDialogRef.show( this.form.selectedElement)
+    },
+    confirmCheck(selectedData){
+    this.form.selectedElement=selectedData
+      console.log('选择的元素1111111111:', selectedData);
+
+    },
+    handleClose(tag) {
+      this.form.selectedElement.splice(this.form.selectedElement.indexOf(tag), 1);
+      },
+  }
+};
+</script>
+
+<style scoped>
+
+.search-container {
+  display: flex;
+  justify-content: space-between; /* 使子元素两端对齐 */
+  align-items: center; /* 垂直居中对齐 */
+}
+.bottom-box{
+  width: 100%;
+  height: 20%;
+  border: 1px solid #DBDBDB;
+  margin-top: 10px;
+  padding: 10px;
+}
+.mr-5{
+  margin-right: 5px;
+}
+</style>

+ 172 - 0
src/views/manager/wbsinfo/parameter.vue

@@ -0,0 +1,172 @@
+<template>
+ <basic-container>
+    <div class="pd-b-20 border-grey-b" style="text-align: right;">
+        <el-button type="primary"icon="el-icon-add" size="small" @click="addCard">新增</el-button>
+    </div>
+
+    <div class="pd-t-20">
+        <el-row :gutter="20" style="height: calc(100vh - 290px)">
+            <el-col v-if="projectPageList && projectPageList.length > 0" :span="6" v-for="(item, index) in projectPageList" :key="item.id">
+            <el-card @click.native="handleSetParameterName(item)" class="box-card h-100p flex bg-color clickable">
+                <div class="card-content">
+                <h3>{{ item.title }}</h3>
+                <p class="text-bold">{{ item.description }}</p>
+                <p class="small-text">元泰自动获股单位工程的名称,并回显到表格中</p>
+               
+                </div>
+                <div class="delete-icon-container">
+                <i
+                    class="el-icon-delete-solid delete-icon"
+                    @click.stop="delSetParameterName(item)"
+                ></i>
+                </div>
+            </el-card>
+            </el-col>
+            <el-col v-else :span="24">
+            <p>暂无参数信息</p>
+            </el-col>
+        </el-row>
+      </div>
+      <!-- 新增弹窗 -->
+      <el-dialog title="添加参数" :visible.sync="dialogVisible" width="30%" append-to-body >
+            <el-form :model="parameter" label-width="100px" :rules="rules" ref="form">
+                <el-form-item label="参数名称"  prop="name">
+                <el-input v-model="parameter.name"></el-input>
+                </el-form-item>
+                <el-form-item label="参数类型"  prop="type">
+                <el-select v-model="parameter.type" placeholder="请选择参数类型" style="width: 100%;">
+                    <el-option label="字符串" value="string"></el-option>
+                    <el-option label="数字" value="number"></el-option>
+                    <el-option label="布尔值" value="boolean"></el-option>
+                </el-select>
+                </el-form-item>
+                <el-form-item label="是否区分项目"  prop="isProjectSpecific">
+                    <el-radio v-model="parameter.isProjectSpecific" :label="true">是</el-radio>
+                    <el-radio v-model="parameter.isProjectSpecific" :label="false">否</el-radio>
+                </el-form-item>
+                <el-form-item label="备注">
+                <el-input type="textarea" v-model="parameter.remark"></el-input>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="dialogVisible = false">取 消</el-button>
+                <el-button type="primary" @click="addParameter">确 定</el-button>
+            </span>
+        </el-dialog>
+        <!-- 详情弹窗 -->
+         <paramDetail ref="paramDetailRef" :params="parameterRow"></paramDetail>
+ </basic-container>
+</template>
+<script>
+import paramDetail from './paramDetail.vue';
+export default{
+    components:{
+        paramDetail
+    },
+    data(){
+        return{
+            projectPageList:[
+                {
+                    id:1,
+                    title:'项目1',
+                    description:'子单位工程名称'
+                },
+                {
+                    id:2,
+                    title:'项目2',
+                    description:'子单位工程名称'
+                },
+                {
+                    id:3,
+                    title:'项目3',
+                    description:'子单位工程名称'
+                },
+                {
+                    id:4,
+                    title:'项目4',
+                    description:'子单位工程名称'
+                },
+                {
+                    id:4,
+                    title:'项目4',
+                     description:'子单位工程名称'
+                },
+                {
+                    id:4,
+                    title:'项目4',
+                     description:'子单位工程名称'
+                }
+            ],
+            dialogVisible:false,
+            parameter: {
+                name: '',
+                type: '',
+                isProjectSpecific: false,
+                remark: ''
+            },
+            rules: {
+                name: [
+                { required: true, message: '请输入参数名称', trigger: 'blur' }
+                ],
+                type: [
+                { required: true, message: '请选择参数类型', trigger: 'change' }
+                ],
+                isProjectSpecific: [
+                { type: 'boolean', required: true, message: '请选择是否区分项目', trigger: 'change' }
+                ]
+            },
+            parameterRow:{}
+
+        }
+    },
+    methods:{
+        delSetParameterName(item){
+            console.log(item)
+        },
+        addCard(){
+            console.log('新增')
+            this.dialogVisible = true
+        },
+        handleSetParameterName(item){
+            console.log(item)
+            this.parameterRow = item
+            this.$refs.paramDetailRef.show()
+        }
+    }
+}
+</script>
+<style scoped lang="scss">
+.bg-color{
+    background-color: #F5F7FA;
+}
+.clickable {
+  cursor: pointer;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-between;
+}
+
+.card-content {
+  flex: 1;
+}
+
+.small-text {
+  font-size: smaller;
+}
+.text-bold{
+    font-weight: bold;
+}
+
+.delete-icon-container {
+  display: flex;
+  justify-content: flex-end;
+  align-items: flex-end;
+}
+
+.delete-icon {
+  font-size: 18px;
+  color: red;
+  cursor: pointer;
+}
+</style>