Ver Fonte

公式配置可以选择节点参数

gangyj há 2 anos atrás
pai
commit
f6eb64f5b6

+ 13 - 0
src/api/manager/wbsprivate.js

@@ -77,3 +77,16 @@ export const wbsTreePrivateTableSort = (data) => {
     data:data
   })
 }
+
+export const getNodeTabAndParam = (parentId,projectId,wbsId, params) => {
+  return request({
+    url: '/api/blade-manager/wbsPrivate/getNodeTabAndParam',
+    method: 'get',
+    params: {
+      ...params,
+      parentId,
+      projectId,
+      wbsId,
+    }
+  })
+}

+ 12 - 0
src/api/manager/wbstree.js

@@ -259,3 +259,15 @@ export const updateStatus = (params) => {
         params
     })
 }
+
+
+export const getNodeTabAndParam = (id, params) => {
+    return request({
+        url: '/api/blade-manager/wbsTree/getNodeTabAndParam',
+        method: 'get',
+        params: {
+            ...params,
+            id
+        }
+    })
+}

+ 1 - 1
src/views/formula/component/formulaTemplate.vue

@@ -6,7 +6,7 @@
       <div>
         <span>参数{{(index+1)}}({{formulainfo.template.args[index].m}}):</span>
         <span>
-          <template v-if="(typeof item)=='object' && item.type == 'Element'">
+          <template v-if="(typeof item)=='object' && (item.type == 'Element' || item.type == 'ParamData')">
             <el-tag>{{item.name}}</el-tag>
           </template>
           <template v-else>

+ 51 - 25
src/views/formula/component/funComponent/ifelse.vue

@@ -67,13 +67,13 @@
               <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
             </div>
           </div>
-          <div>
+          <draggable v-model="selectEleFormula">
             <formula-item 
               v-for="(item,index) in selectEleFormula" :key="index" 
               :item="item" @click="obj => eleFormulaClick(obj,index)"
             >
             </formula-item>
-          </div>
+          </draggable>
         </div>
       </div>
       <div class="flex mg-t-10">
@@ -97,13 +97,13 @@
               <el-link :underline="false" type="primary" @click="addText">输入值</el-link>
             </div>
           </div>
-          <div>
+          <draggable v-model="selectEleFormula2">
             <formula-item 
               v-for="(item,index) in selectEleFormula2" :key="index" 
               :item="item" @click="obj => eleFormulaClick(obj,index)"
             >
             </formula-item>
-          </div>
+          </draggable>
         </div>
       </div>
     </div>
@@ -120,10 +120,13 @@
 
 <script>
 import VueTagsInput from '@johmun/vue-tags-input';
-import formulaItem from "../formulaItem"
+import formulaItem from "../formulaItem";
+import draggable from 'vuedraggable';
 export default {
   name: "dateFormat",
   components: {
+    draggable,
+
     VueTagsInput,
 
     formulaItem,
@@ -183,8 +186,8 @@ export default {
     let args2 = this.formulainfo.arguments[2];
     this.initCondition(args0);
 
-    if((typeof args1 == 'string' || (typeof args1 == 'object' && args1.type == 'Element')) &&
-      (typeof args2 == 'string' || (typeof args2 == 'object' && args2.type == 'Element'))
+    if((typeof args1 == 'string' || (typeof args1 == 'object' && (args1.type == 'Element' || args1.type == 'ParamData'))) &&
+      (typeof args2 == 'string' || (typeof args2 == 'object' && (args2.type == 'Element' || args2.type == 'ParamData')))
     ){
       this.initTFInput(args1,args2);
     }else if(Array.isArray(args1) || Array.isArray(args2)){
@@ -321,6 +324,16 @@ export default {
           name:ele.name,
           selected:false,
         })
+      }else if(ele.k){
+        //节点参数
+        eleFormula.push({
+          type:'ParamData',
+          name:ele.name,
+          selected:false,
+          id:ele.id,
+          v:ele.v,
+          k:ele.k,
+        })
       }
 
       this.setTF();
@@ -435,13 +448,26 @@ export default {
 
     setELe(ele){
       if(this.curFocusIndex){
-        let obj = {
-          type:'Element',
-          name:ele.eName,
-          id:ele.id,
-          selected:false,
-          tableElementKey:ele.tableElementKey,
-          children:[],
+        let obj = {};
+        if(ele.k){
+          obj = {
+            type:'ParamData',
+            name:ele.name,
+            id:ele.id,
+            selected:false,
+            v:ele.v,
+            k:ele.k,
+            children:[],
+          }
+        }else{
+          obj = {
+            type:'Element',
+            name:ele.eName,
+            id:ele.id,
+            selected:false,
+            tableElementKey:ele.tableElementKey,
+            children:[],
+          }
         }
 
         if(this.curFocusIndex == 6 || this.curFocusIndex ==7){
@@ -451,7 +477,7 @@ export default {
             this.$emit('uncheck',this['tags'+this.curFocusIndex][0].id)
           }
 
-          obj.text = ele.eName;
+          obj.text = obj.name;
           obj.style = 'background-color: #409EFF';
           this['tags'+this.curFocusIndex] = [obj];
           this['tag'+this.curFocusIndex] = '';
@@ -475,7 +501,7 @@ export default {
           this.symbol = args0[1];
 
           //第二个空
-          if((typeof args0[0]) == 'object' && args0[0].type == 'Element'){
+          if((typeof args0[0]) == 'object' && (args0[0].type == 'Element' || args0[0].type == 'ParamData')){
             let ele = args0[0];
             this.tags2 =  [
               Object.assign({
@@ -487,7 +513,7 @@ export default {
           }
 
           //第三个空
-          if((typeof args0[2]) == 'object' && args0[2].type == 'Element'){
+          if((typeof args0[2]) == 'object' && (args0[2].type == 'Element' || args0[2].type == 'ParamData')){
             let ele = args0[2];
             this.tags3 =  [
               Object.assign({
@@ -502,7 +528,7 @@ export default {
           this.symbol = args0[1]+args0[3]+args0[5];
 
           //第一个空
-          if((typeof args0[0]) == 'object' && args0[0].type == 'Element'){
+          if((typeof args0[0]) == 'object' && (args0[0].type == 'Element' || args0[0].type == 'ParamData')){
             let ele = args0[0];
             this.tags1 =  [
               Object.assign({
@@ -514,7 +540,7 @@ export default {
           }
 
           //第二个空
-          if((typeof args0[2]) == 'object' && args0[2].type == 'Element'){
+          if((typeof args0[2]) == 'object' && (args0[2].type == 'Element' || args0[2].type == 'ParamData')){
             let ele = args0[2];
             this.tags2 =  [
               Object.assign({
@@ -526,7 +552,7 @@ export default {
           }
 
           //第三个空
-          if((typeof args0[6]) == 'object' && args0[6].type == 'Element'){
+          if((typeof args0[6]) == 'object' && (args0[6].type == 'Element' || args0[6].type == 'ParamData')){
             let ele = args0[6];
             this.tags3 =  [
               Object.assign({
@@ -536,7 +562,7 @@ export default {
           }else if((typeof args0[6]) == 'string'){
             this.tag3 = args0[6];
           }
-        }else if(typeof args0 == 'object' && args0.type == 'Element'){
+        }else if(typeof args0 == 'object' && (args0.type == 'Element' || args0.type == 'ParamData')){
           let ele = args0;
           this.tags2 =  [
             Object.assign({
@@ -593,7 +619,7 @@ export default {
 
     //初始化输入框的真假值
     initTFInput(args1,args2){
-      if((typeof args1) == 'object' && args1.type == 'Element'){
+      if((typeof args1) == 'object' && (args1.type == 'Element' || args1.type == 'ParamData')){
         let ele = args1;
         this.tags4 =  [
           Object.assign({
@@ -604,7 +630,7 @@ export default {
         this.tag4 = args1;
       }
 
-      if((typeof args2) == 'object' && args2.type == 'Element'){
+      if((typeof args2) == 'object' && (args2.type == 'Element' || args2.type == 'ParamData')){
         let ele = args2;
         this.tags5 =  [
           Object.assign({
@@ -629,7 +655,7 @@ export default {
           }
         })
         this.selectEleFormula = args1;
-      }else if(typeof args1 == 'object' && args1.type == 'Element'){
+      }else if(typeof args1 == 'object' && (args1.type == 'Element' || args1.type == 'ParamData')){
         this.selectEleFormula = [Object.assign({},args1)];
       }else if(typeof args1 == 'string'){
         this.selectEleFormula = [{
@@ -650,7 +676,7 @@ export default {
           }
         })
         this.selectEleFormula2 = args2;
-      }else if(typeof args2 == 'object' && args2.type == 'Element'){
+      }else if(typeof args2 == 'object' && (args2.type == 'Element' || args2.type == 'ParamData')){
         this.selectEleFormula2 = [Object.assign({},args2)];
       }else if(typeof args2 == 'string'){
         this.selectEleFormula2 = [{

+ 139 - 55
src/views/formula/edit.vue

@@ -9,6 +9,7 @@
           <el-input-number
             v-model="retainNum"
             :step="1"
+            :min="0" :max="5"
             :disabled="!isRetain"
             size="small"
           ></el-input-number>
@@ -94,6 +95,7 @@
           </el-col>
           <el-col :span="16" class="h-100p flex flex-d-c">
             <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表" style="width:300px">
+              <el-option v-if="paramDataList.length" label="选择节点参数" value="选择节点参数"></el-option>
               <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
             </el-select>
             <div class="mg-t-10 no-mb-col flex1">
@@ -101,7 +103,8 @@
                 <el-row>
                   <el-col :span="6" v-for="item in eleList" :key="item.id">
                     <div class="ele-box">
-                      <span>{{item.eName}}</span>
+                      <span v-if="item.k">{{item.name}}</span>
+                      <span v-else>{{item.eName}}</span>
                       <el-checkbox v-model="item.checked" @change="value => eleChang(value,item)"></el-checkbox>
                     </div>
                   </el-col>
@@ -127,13 +130,13 @@
               </div>
             </div>
             <div class="border-grey sele-ele-box">
-              <div>
+              <draggable v-model="selectEleFormula">
                 <formula-item
                   v-for="(item,index) in selectEleFormula" :key="index"
                   :item="item" @click="obj => eleFormulaClick(obj,index)"
                 >
                 </formula-item>
-              </div>
+              </draggable>
             </div>
           </el-col>
         </el-row>
@@ -176,7 +179,7 @@
         <el-button type="primary" @click="saveFormula">保存</el-button>
       </div>
     </div>
-    <div v-if="!operationVisible && showFunDetail">
+    <div v-if="!operationVisible && showFunDetail" class="flex1">
       <el-tabs v-model="actiFunIndex" closable @tab-remove="removeFun" :before-leave="funLeave">
         <el-tab-pane v-for="(item,index) in equationSelectEle.children" :key="index" :label="item.name" :name="index.toString()">
           <template v-if="!componentMap[item.name]">
@@ -184,19 +187,21 @@
             </formula-template>
           </template>
           <template v-else>
-            <div class="flex">
+            <div class="flex" style="height:calc(100vh - 460px)">
               <div class="flex flex-d-c">
                 <component ref="dynamiccomponent" v-bind:is="componentMap[item.name]" :formulainfo="item" :curele="equationSelectEle" :formulamap="formulaMap" @uncheck="unCheckEleComp" class="flex1"></component>
                 <div v-show="item.showSelectEle">
                   <el-select v-model="eleTableIdComp" @change="getTableEleComp" placeholder="请选择元素表" style="width:100%">
+                    <el-option v-if="paramDataList.length" label="选择节点参数" value="选择节点参数"></el-option>
                     <el-option  v-for="item in eleTableListComp" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
                   </el-select>
                   <div class="mg-t-10 mg-b-10 no-mb-col" style="width:900px">
-                    <el-scrollbar style="max-height: 210px;min-height:100px">
+                    <el-scrollbar style="height: 210px;">
                       <el-row>
                         <el-col :span="6" v-for="item in eleListComp" :key="item.id">
                           <div class="ele-box">
-                            <span>{{item.eName}}</span>
+                            <span v-if="item.k">{{item.name}}</span>
+                            <span v-else>{{item.eName}}</span>
                             <el-checkbox v-model="item.checked" @change="value => setComponentEle(value,item,index)"></el-checkbox>
                           </div>
                         </el-col>
@@ -206,7 +211,7 @@
                 </div>
               </div>
               <div class="flex1" v-show="item.showSelectEle">
-                <el-scrollbar style="height: 460px">
+                <el-scrollbar style="height: 100%">
                   <el-tree
                     class="filter-tree"
                     :data="treeData"
@@ -259,14 +264,16 @@
           </el-col>
           <el-col :span="16">
             <el-select v-model="eleTableId" @change="getTableEle" placeholder="请选择元素表">
+              <el-option v-if="paramDataList.length" label="选择节点参数" value="选择节点参数"></el-option>
               <el-option  v-for="item in eleTableList" :key="item.id" :label="item.tableName" :value="item.id"></el-option>
             </el-select>
             <div class="mg-t-10 mg-b-10 no-mb-col">
-              <el-scrollbar style="height: 210px">
+              <el-scrollbar style="height: 460px">
                 <el-row>
                   <el-col :span="6" v-for="item in eleList" :key="item.id">
                     <div class="ele-box">
-                      <span>{{item.eName}}</span>
+                      <span v-if="item.k">{{item.name}}</span>
+                      <span v-else>{{item.eName}}</span>
                       <el-checkbox v-model="item.checked" @change="value => eleCheckHandle(value,item)"></el-checkbox>
                     </div>
                   </el-col>
@@ -284,7 +291,7 @@
 
     <el-dialog title="手写模式" :visible.sync="handwritVisible" width="900px" append-to-body :close-on-click-modal="false">
       <div class="font-c-warning">tips:手写模式不保证能转换成配置模式!!即使能转换也不保证正确!!!</div>
-      <div class="mg-b-20 font-c-warning">无法在手写模式手写加入新的元素!</div>
+      <div class="mg-b-20 font-c-warning">无法在手写模式手写加入新的元素!新的节点参数!</div>
       <editor v-model="handwritText" @init="editorInit" lang="javascript" theme="github" width="100%" height="200"></editor>
       <!-- <el-input
         type="textarea"
@@ -302,12 +309,12 @@
 </template>
 
 <script>
-import { getLazytree,selectByNodeTable,selectFormElements,getAlltree} from "@/api/manager/wbstree";
+import { getLazytree,selectFormElements,getAlltree,getNodeTabAndParam} from "@/api/manager/wbstree";
 import { getProjectList,findProjectTree } from "@/api/manager/projectinfo";
 import { findContractByProjectId } from "@/api/manager/contractinfo";
 import { getDetail as getEleDeatil } from "@/api/manager/wbsformelement";
 import { getTypeMap,saveFormula,formulaDetail,updateFormula } from "@/api/formula/formula";
-import { findNodeTableByCondition } from "@/api/manager/wbsprivate";
+import { getNodeTabAndParam as wbsPrivateGetNodeTabAndParam } from "@/api/manager/wbsprivate";
 import {mapGetters} from "vuex";
 
 import formulaItem from "./component/formulaItem"
@@ -323,8 +330,13 @@ import ifelse from "./component/funComponent/ifelse"
 
 import {formulaArrayToString} from "./formulaArrayToString"
 import {formulaStringToArray} from "./formulaStringToArray"
+
+import draggable from 'vuedraggable'
+
 export default {
   components: {
+    draggable,
+
     formulaItem,
     formulaTemplate,
 
@@ -407,6 +419,8 @@ export default {
       handwritVisible:false,//手写弹框
       handwritText:'',//文本
       handwritEleMap:'',//元素map
+
+      paramDataList:[],//节点参数数组
     };
   },
   computed: {
@@ -672,6 +686,17 @@ export default {
           name:ele.name,
           selected:false,
         })
+      }else if(ele.k){
+        //节点参数
+        this.selectEleFormula.push({
+          type:'ParamData',
+          name:ele.name,
+          selected:false,
+          id:ele.id,
+          v:ele.v,
+          k:ele.k,
+          children:[],
+        })
       }
     },
 
@@ -827,7 +852,7 @@ export default {
 
     //在等式模式下点选计算式
     equationSelect(index,indexPath){
-      if(!this.equationSelectEle ||(this.equationSelectEle && this.equationSelectEle.type != 'Element') ){
+      if(!this.equationSelectEle ||(this.equationSelectEle && !(this.equationSelectEle.type == 'Element' || this.equationSelectEle.type == 'ParamData')) ){
         this.$message({
           type: "warning",
           message: "请先选中元素"
@@ -844,13 +869,28 @@ export default {
       let obj = Object.assign({}, expression);
       //obj.template = JSON.parse(obj.template);
       obj.arguments = new Array(obj.template.args.length);
-      obj.arguments[0] = {
-          id:this.equationSelectEle.id,
+
+      let ele = {};
+      if(this.equationSelectEle.type == 'ParamData'){
+        ele = {
+          type:'ParamData',
           name:this.equationSelectEle.name,
+          id:this.equationSelectEle.id,
           selected:false,
-          tableElementKey:this.equationSelectEle.tableElementKey,
-          type:"Element",
-      };
+          v:this.equationSelectEle.v,
+          k:this.equationSelectEle.k,
+        }
+      }else{
+        ele = {
+            id:this.equationSelectEle.id,
+            name:this.equationSelectEle.name,
+            selected:false,
+            tableElementKey:this.equationSelectEle.tableElementKey,
+            type:"Element",
+        };
+      }
+
+      obj.arguments[0] = ele;
       this.equationSelectEle.children.push(obj);
       //跳转到最新的标签
       this.actiFunIndex = (this.equationSelectEle.children.length-1).toString();
@@ -860,15 +900,30 @@ export default {
     chooseEleHandle(){
       for (let i = 0; i < this.eleList.length; i++) {
         if (this.eleList[i].checked) {
-          let ele = this.eleList[i]
-          let obj = {
-            type:'Element',
-            name:ele.eName,
-            id:ele.id,
-            selected:false,
-            tableElementKey:ele.tableElementKey,
-            children:[],
+          let ele = this.eleList[i];
+          let obj = {};
+          if(ele.k){
+            obj = {
+              type:'ParamData',
+              name:ele.name,
+              id:ele.id,
+              selected:false,
+              v:ele.v,
+              k:ele.k,
+              children:[],
+            }
+          }else{
+            obj = {
+              type:'Element',
+              name:ele.eName,
+              id:ele.id,
+              selected:false,
+              tableElementKey:ele.tableElementKey,
+              children:[],
+            }
           }
+
+          
           this.$set(this.argumenObj.arguments,this.argumenObj.index,obj);
           this.chooseEleVisible = false;
           break;
@@ -938,7 +993,7 @@ export default {
     //保存公式
     saveFormula(){
       let obj = formulaArrayToString(this.processFormula,this.resultFormula);
-      //return;
+      //console.log(obj)
       //console.log(text);
       if(this.formulaid){
         updateFormula({
@@ -1001,30 +1056,39 @@ export default {
 
     getNodeDetail(data) {
       if(this.pid){
-        findNodeTableByCondition(data.id, this.pid, this.wbsid).then((res) => {
-          if(res.data.data.length){
-            this.eleTableList = res.data.data;
+        wbsPrivateGetNodeTabAndParam(data.id, this.pid, this.wbsid).then((res) => {
+          if(res.data.data.tabData.length){
+            this.eleTableList = res.data.data.tabData;
 
-            this.eleTableId = this.eleTableList[0].id;
-            this.getTableEle(this.eleTableId);
+            // this.eleTableId = this.eleTableList[0].id;
+            // this.getTableEle(this.eleTableId);
           }else{
             this.eleTableList = [];
             this.eleTableId = '';
             this.eleList = [];
           }
+
+          if(res.data.data.paramData.length){
+            this.paramDataList = res.data.data.paramData;
+          }else{
+            this.paramDataList = [];
+          }
         })
       }else{
-        selectByNodeTable(data.id).then((res)=>{
-          if(res.data.data.length){
-            this.eleTableList = res.data.data;
-
-            this.eleTableId = this.eleTableList[0].id;
-            this.getTableEle(this.eleTableId);
+        getNodeTabAndParam(data.id).then((res)=>{
+          if(res.data.data.tabData.length){
+            this.eleTableList = res.data.data.tabData;
           }else{
             this.eleTableList = [];
             this.eleTableId = '';
             this.eleList = [];
           }
+
+          if(res.data.data.paramData.length){
+            this.paramDataList = res.data.data.paramData;
+          }else{
+            this.paramDataList = [];
+          }
         })
       }
     },
@@ -1044,47 +1108,67 @@ export default {
     },
 
     getTableEle(tableId){
-      selectFormElements(tableId).then((res)=>{
-        this.eleList = res.data.data;
-      })
+      if(tableId === '选择节点参数'){
+        this.eleList = this.paramDataList;
+      }else{
+        selectFormElements(tableId).then((res)=>{
+          this.eleList = res.data.data;
+        })
+      }
     },
 
     //方法下面的点击树节点
     getNodeDetailComp(data) {
       if(this.pid){
-        findNodeTableByCondition(data.id, this.pid, this.wbsid).then((res) => {
-          if(res.data.data.length){
-            this.eleTableListComp = res.data.data;
+        wbsPrivateGetNodeTabAndParam(data.id, this.pid, this.wbsid).then((res) => {
+          if(res.data.data.tabData.length){
+            this.eleTableListComp = res.data.data.tabData;
 
-            this.eleTableIdComp = this.eleTableListComp[0].id;
-            this.getTableEleComp(this.eleTableIdComp);
+            // this.eleTableIdComp = this.eleTableListComp[0].id;
+            // this.getTableEleComp(this.eleTableIdComp);
           }else{
             this.eleTableListComp = [];
             this.eleTableIdComp = '';
             this.eleListComp = [];
           }
+          
+          if(res.data.data.paramData.length){
+            this.paramDataList = res.data.data.paramData;
+          }else{
+            this.paramDataList = [];
+          }
         })
       }else{
-        selectByNodeTable(data.id).then((res)=>{
-          if(res.data.data.length){
-            this.eleTableListComp = res.data.data;
+        getNodeTabAndParam(data.id).then((res)=>{
+          if(res.data.data.tabData.length){
+            this.eleTableListComp = res.data.data.tabData;
 
-            this.eleTableIdComp = this.eleTableListComp[0].id;
-            this.getTableEleComp(this.eleTableIdComp);
+            // this.eleTableIdComp = this.eleTableListComp[0].id;
+            // this.getTableEleComp(this.eleTableIdComp);
           }else{
             this.eleTableListComp = [];
             this.eleTableIdComp = '';
             this.eleListComp = [];
           }
+
+          if(res.data.data.paramData.length){
+            this.paramDataList = res.data.data.paramData;
+          }else{
+            this.paramDataList = [];
+          }
         })
       }
     },
 
     //方法下面的查询元素
     getTableEleComp(tableId){
-      selectFormElements(tableId).then((res)=>{
-        this.eleListComp = res.data.data;
-      })
+      if(tableId === '选择节点参数'){
+        this.eleListComp = this.paramDataList;
+      }else{
+        selectFormElements(tableId).then((res)=>{
+          this.eleListComp = res.data.data;
+        })
+      }
     },
 
     //取消方法下面 元素勾选

+ 63 - 24
src/views/formula/formulaArrayToString.js

@@ -1,4 +1,8 @@
 
+function isFormulaItem(ele){
+  return ele.type == 'Element' || ele.type == 'ParamData'
+}
+
 //转换公式的参数
 function transformArguments(children,curEle,eleMap){
   let fcReg = /(FC\.\S+\()(.+)\)/;
@@ -31,36 +35,59 @@ function transformArguments(children,curEle,eleMap){
         }
         let arg = ele.arguments[argIndex];
         
-        if(arg && arg.type == 'Element'){
+        if(arg && isFormulaItem(arg)){
           if(!isNestEle && !isNestEle2 && i != (children.length-1) && curEle.id == arg.id){
             //不是第一个嵌套的公式,且和当前挂载的是同一个元素
             //认为这个参数是之前公式计算的结果,不再写入元素
             isNestEle = true;
           }else{
-            eleMap[arg.tableElementKey] = {
-              id: arg.id,
-              name: arg.name,
-              tableElementKey: arg.tableElementKey,
-              type: "Element",
-            };
-            fcText += `E[${arg.tableElementKey}]`;
+            if(arg.type == 'Element'){
+              eleMap[arg.tableElementKey] = {
+                id: arg.id,
+                name: arg.name,
+                tableElementKey: arg.tableElementKey,
+                type: "Element",
+              };
+              fcText += `E[${arg.tableElementKey}]`;
+            }else if(arg.type == 'ParamData'){
+              eleMap[arg.k] = {
+                id: arg.id,
+                name: arg.name,
+                v:arg.v,
+                k:arg.k,
+                type: "ParamData",
+              };
+              fcText += `WP[${arg.k}]`;
+            }
+            
           }
         }else if(Array.isArray(arg)){
           //ifsles方法会进来
           arg.forEach((a)=>{
-            if(a && a.type == 'Element'){
+            if(a && isFormulaItem(a)){
               if(!isNestEle2 && i != (children.length-1) && curEle.id == a.id){
                 //不是第一个嵌套的公式,且和当前挂载的是同一个元素
                 //认为这个参数是之前公式计算的结果,不再写入元素
                 isNestEle2 = true
               }else{
-                eleMap[a.tableElementKey] = {
-                  id: a.id,
-                  name: a.name,
-                  tableElementKey: a.tableElementKey,
-                  type: "Element",
-                };
-                fcText += `E[${a.tableElementKey}]`;
+                if(a.type == 'Element'){
+                  eleMap[a.tableElementKey] = {
+                    id: a.id,
+                    name: a.name,
+                    tableElementKey: a.tableElementKey,
+                    type: "Element",
+                  };
+                  fcText += `E[${a.tableElementKey}]`;
+                }else if(a.type == 'ParamData'){
+                  eleMap[a.k] = {
+                    id: a.id,
+                    name: a.name,
+                    v:a.v,
+                    k:a.k,
+                    type: "ParamData",
+                  };
+                  fcText += `WP[${a.k}]`;
+                }
               }
             }else if(a && a.type){
               fcText += a.name;
@@ -92,16 +119,28 @@ export const formulaArrayToString = (processFormula,resultFormula) => {
   let eleMap = {};//元素字典,为了回显的时候查询信息
 
   processFormula.forEach(item => {
-    if(item.type == 'Element'){
+    if(isFormulaItem(item)){
       //console.log(item)
       if(item.children.length <1){
-        eleMap[item.tableElementKey] = {
-          id: item.id,
-          name: item.name,
-          tableElementKey: item.tableElementKey,
-          type: "Element",
-        };
-        text += `E[${item.tableElementKey}]`;
+        if(item.type == 'Element'){
+          eleMap[item.tableElementKey] = {
+            id: item.id,
+            name: item.name,
+            tableElementKey: item.tableElementKey,
+            type: "Element",
+          };
+          text += `E[${item.tableElementKey}]`;
+        }else if(item.type == 'ParamData'){
+          eleMap[item.k] = {
+            id: item.id,
+            name: item.name,
+            v:item.v,
+            k:item.k,
+            type: "ParamData",
+          };
+          text += `WP[${item.k}]`;
+        }
+        
       }else{
         text += transformArguments(item.children,item,eleMap);
       }

+ 54 - 5
src/views/formula/formulaStringToArray.js

@@ -1,4 +1,7 @@
 
+function isFormulaItem(ele){
+  return ele.type == 'Element' || ele.type == 'ParamData'
+}
 
 function parseFormula(arr,resultFormula,processFormula,isAllFun){
   let tmpArr = [];//放置这一层的数组
@@ -76,6 +79,8 @@ function parseArguments(ele,funObj){
             fun.arguments.push(undefined)
           }else if( arg.type == 'Element'){
             fun.arguments.push(arg)
+          }else if( arg.type == 'ParamData'){
+            fun.arguments.push(arg)
           }else if(arg.type == 'Function'){
             fun.arguments.push(ele)
           }else if(arg.type == 'Text'){
@@ -98,15 +103,25 @@ function parseProcessFormula(funObj,ele){
     if(funObj.children[i].type == 'Function'){
       parseProcessFormula(funObj.children[i],ele);
       inFun = true;
-    }else if(funObj.children[i].type == "Element" && !endEle){
+    }else if(isFormulaItem(funObj.children[i]) && !endEle){
       endEle = funObj.children[i];
     }
   }
   if(!inFun){
+    //console.log(endEle)
     //把临时的属性改为最终找到的
-    ele.id = endEle.id;
-    ele.name = endEle.name;
-    ele.tableElementKey = endEle.tableElementKey;
+    if(endEle.type == 'Element'){
+      ele.id = endEle.id;
+      ele.name = endEle.name;
+      ele.tableElementKey = endEle.tableElementKey;
+    }else if(endEle.type == 'ParamData'){
+      ele.id = endEle.id;
+      ele.name = endEle.name;
+      ele.v = endEle.v;
+      ele.k = endEle.k;
+      ele.type = "ParamData";
+    }
+    
   }
 
 }
@@ -140,7 +155,7 @@ function getRootElement(children,rootObj){
     if(Element.type == 'Function'){
       getRootElement(Element.children,rootObj);
       inFun = true;
-    }else if(Element.type == "Element" && !endEle){
+    }else if(isFormulaItem(Element) && !endEle){
       endEle = Element;
     }
   })
@@ -157,6 +172,7 @@ export const formulaStringToArray = (text,elemap,formulaMap) => {
   const startBracketsReg = /^\(/;//左括号
   const endBracketsReg = /^\)/;//右括号
   const elementReg = /^E\[(.[^\]]+_.[^\]]+)\]/;//元素
+  const paramReg = /^WP\[(.[^\]]+)\]/;//节点参数
   const commaReg = /^,/;//逗号
   const operatorReg = /^(\+|-|\*|%)/;//加减乘除
   const wordReg = /^[\u4e00-\u9fa5\w0-9'"-]+/;//文本
@@ -279,6 +295,39 @@ export const formulaStringToArray = (text,elemap,formulaMap) => {
         resArr.push(obj);
       }
 
+      strIndex += eleArr[0].length;//索引移动
+    }else if(paramReg.test(nuText)){
+      //console.log('匹配节点参数')
+      //匹配节点参数
+      let eleArr = nuText.match(paramReg);
+      let obj = {};
+      if(elementMap[eleArr[1]]){
+        Object.assign(obj,elementMap[eleArr[1]]);
+        Object.assign(obj,{
+          selected:false,
+          children:[],
+          tag:"paramData"
+        });
+      }else{
+        obj = {
+          type:'ParamData',
+          name:elementMap[eleArr[1]].name,
+          v:elementMap[eleArr[1]].v,
+          k:elementMap[eleArr[1]].k,
+          children:[],
+          selected:false,
+          tag:"paramData"
+        }
+      }
+      
+      let content =contentStack[contentStack.length - 1];
+      if(content){
+        content.children.push(obj);
+      }else{
+        //如果没有,那就是在最上层
+        resArr.push(obj);
+      }
+
       strIndex += eleArr[0].length;//索引移动
     }else if(commaReg.test(nuText)){
       //console.log('匹配逗号')